Information Security

BOF 스터디 본문

INTERLUDE/System Hacking

BOF 스터디

sohexz 2022. 9. 20. 19:23

<8086 Memory Architecture>

8086 시스템의 기본적인 메모리 구조
segment 메모리 모델

멀티 태스킹이 가능하기 때문에 메모리에는 여러 개의 프로세스가 저장되어 병렬적으로 작업 수행

가용한 메모리 영역에는 여러 개의 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