본문 바로가기

드림핵

[드림핵 워게임] basic_exploitation_001

<문제>

 

<풀이>

먼저 문제 파일을 다운로드한다.

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가 출력된다.