<문제>
<풀이>
먼저 문제 파일을 다운로드한다.
basic_exploitation_001.c를 열어본다.
main() 함수부터 보면,
27행에 0x80 크기의 char 배열 buf가 선언되어 있다.
29행에서 gets()함수로 입력받은 값을 buf에 저장한다.
gets()함수는 입력값의 크기를 검증하지 않으므로 여기에 stack buffer overflow 취약점이 존재한다.
22행에는 read_flag()함수가 존재하는데 flag파일을 읽어오는 시스템 명령어를 실행한다.
이제 gdb를 이용해 바이너리를 분석해보자.
<+11>에서 [ebp-0x80]의 주소를 eax가 가리키게 하고 있다.
buf를 eax가 가리키게 한 것으로 해석할 수 있다.
이 상태에서 main 함수의 스택 프레임을 그려보면 다음과 같다.
공격 시나리오는 아래와 같이 짜봤다.
(1) buf에 페이로드를 입력하는데, 첫 128+4bytes 까지는 임의의 문자로 채워넣는다.
(2) 페이로드의 끝부분에는 read_flag()의 주소를 입력하여 return address를 overwrite한다.
(3) ret 실행 시 read_flag()가 실행되어 flag를 출력하도록 한다.
이와 같은 공격 시나리오를 토대로 파이썬 pwntools를 이용한 익스플로잇 코드를 아래와 같이 짰다.
4행의 remote() 함수에 들어가는 Host와 Port는 드림핵 문제 페이지에서 Request a VM 을 클릭한 후 받은 값을 입력했다.
7행에서 read_flag()의 주소를 얻었다.
9행과 10행에서 payload에 return address 직전까지 임의의 문자를 채워넣었다.
11행에서는 read_flag의 주소를 패킹해서 payload에 삽입했다.
13행에서 payload를 전송하고
14행에서 interactive() 를 실행한다.
파이썬 코드를 실행해보면 바로 flag가 출력된다.
'드림핵' 카테고리의 다른 글
[드림핵 System Hacking Fundamental] Stage3 (0) | 2024.04.07 |
---|---|
[드림핵 System Hacking Fundamental] Stage 1,2 (1) | 2024.04.07 |
[드림핵 워게임] basic_exploitation_000 (0) | 2024.03.31 |
[드림핵 워게임] Return Address Overwrite (0) | 2024.03.31 |
[드림핵 로드맵] System Hacking - Quiz: x86 Assembly 3 (0) | 2024.03.14 |