Information Security
BOF 스터디 본문
<8086 Memory Architecture>
멀티 태스킹이 가능하기 때문에 메모리에는 여러 개의 프로세스가 저장되어 병렬적으로 작업 수행
가용한 메모리 영역에는 여러 개의 segment들 저장 가능
segment는 stack, code, data로 구성
code segment: 시스템이 알아들을 수 있는 명령어(instruction)
data segment: 프로그램이 실행시에 사용되는 데이터
stack segment: 현재 수행되고 있는 handler, task, program이 저장하는 데이터 영역
<8086 CPU 레지스터 구조>
레지스터(register): CPU 내부에 존재하는 메모리
범용 레지스터: 논리 연산, 수리 연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자, 메모리 포인터가 저장되는 레지스터
세그먼트 레지스터: code segment, data segment, stack segment를 가리키는 주소가 들어가 있는 레지스터
플래그 레지스터: 프로그램의 현재 상태나 조건 등을 검사하는데 사용되는 플래그들이 있는 레지스터
인스트럭션 포인터: 다음 수행해야 하는 명령이 있는 메모리 상의 주소가 들어가 있는 레지스터
<Buffer ovelflow>
버퍼: 시스템이 연산 작업을 하는데 있어 필요한 데이터를 일시적으로 저장하는 메모리 상의 저장 공간
미리 준비된 버퍼에 버퍼의 크기보다 큰 데이터를 쓸 때 발생
시스템에게 첫 명령어를 간접적으로 내릴 수 있는 부분 -> return address가 있는 위치
return address는 현재 함수의 base pointer 바로 위에 있으므로 그 위치는 변하지 않음
공격자가 base pointer를 직접적으로 변경하지 않는다면 정확히 해당 위치에 있는 값이 EIP에 들어가게 됨
=> buffer overflow 공격은 공격자가 메모리상의 임의의 위치에다 원하는 코드를 저장시켜 놓고 return address가 저장되어 있는 지점에 그 코드의 주소를 집어 넣어 EIP에 공격자의 코드가 있는 곳의 주소가 들어가게 해 공격하는 방법
공격자는 버퍼가 넘칠 때, 버퍼에 데이터를 쓸 때 원하는 코드를 넣을 수 있음
이 때 정확한 return address가 저장되는 곳을 찾아 return address도 정확하게 조작해줘야 함
공격 코드: execve("/bin/sh", ...)
=> 쉘을 띄우는 것
쉘 코드: 쉘(shell)을 실행시키는 코드
바이너리 형태의 기계어 코드(혹은 opcode)
쉘: 명령해석기라고 불리며 일정의 유저 인터페이스 / 사용자의 키보드 입력을 받앗 실행파일을 실행시키거나 커널에 어떠한 명령을 내릴 수 있는 대화통로
쉘을 실행시키려면 '/bin/sh'라는 명령을 내려야 함
쉘을 실행시키기 위해서 execve() 함수 사용
-> 바이너리 형태의 실행 파일이나 스크립트 파일을 실행시키는 함수
'INTERLUDE > System Hacking' 카테고리의 다른 글
[Dreamhack] pwngdb, pwntools 설치 (0) | 2022.09.29 |
---|---|
[Dreamhack] basic_exploitation_000 (1) | 2022.09.22 |
[FTZ] Level 12 (0) | 2021.11.23 |
[FTZ] Level 11 (0) | 2021.11.18 |
[FTZ] Level 10 (0) | 2021.11.11 |