본문 바로가기

Pwnable/Dreamhack

[Pwnable] Dreamhack_ basic_exploitation_002

https://dreamhack.io/wargame/challenges/4/

 

basic_exploitation_002

Description 이 문제는 서버에서 작동하고 있는 서비스(basicexploitation002)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "fla

dreamhack.io


먼저 주어진 파일을 실행시켜보았다.

내가 입력한 AAAA라는 값이 바로 첫 번째 %x에 들어가고 있는 것을 알 수 있다!

 

이제 문제에서 주어진 코드를 보면 main 함수에서 0x80만큼 입력받고 있고, 입력받은 buf값을 그대로 printf 하고 있으므로 포맷스트링 취약점이 사용될 수 있는 것을 알 수 있다.

 

또한 문제에서 get_shell 이라는 함수가 주어졌기 때문에 exit의 주소를 get_shell 함수의 주소로 덮어쓰면 쉘을 얻을 수 있을 것 같다.

 

 

먼저 get_shell의 주소를 확인해보자!

Get_shell의 주소는 0x08048609라고 한다.

 

다음으로 exit의 주소를 알아야 하는데 이때 앞에서 배운 got주소를 알아야 한다.

 

구해보니 0x804a024라고 한다.

 

이제 구한 exit의 got주소를 get_shell의 주소로 덮어주면 되는데 여기에서 짚고 가야 할 부분이 있다.

 

Get_shell의 주소를 보면 10진수로 134,514,185인데 이 값이 너무 커서 그대로 넣어주면 공격이 오래 걸리거나 TIMEOUT이 발생한다고 한다. 그래서 2바이트가 1바이트씩 나눠서 덮어써야 하는데, 이럴 때는 n 대신 hn을 사용해야 한다!

 

이제 페이로드를 구성해보면 0x804와 0x8609로 나눠서 진행하는데,

 

[1] 2052(0x804)만큼을 출력해야 하는데, 이때 exit의 got주소도 포함해주어야 하므로, 2044가 된다.

    따라서 exit@got+2 주소에 %2044c 만큼 출력해서 hn을 통해 2052(0x804)를 덮어쓴다.

 

[2] 다음 exit@got 주소에 get_shell의 나머지 주소인 0x8609(34313)을 덮어쓰는데,

이미 화면에 출력된 문자열의 길이는 빼주어야 하므로, 0x804만큼 빼주면 0x7e05(32261)이 나온다.

    따라서 exit@got 주소에 %32261c 만큼 출력한다.

 

 

결국 총 페이로드는 [exit@got+2] + [exit@got] + %2044c$hn%32261c$hn이 된다.

그런데 여기에서 %hn 앞에 각각 인덱스로 %1과 %2를 넣어주어야 코드가 쉘을 탈취할 수 있다…

 

결국 총 exploit 코드는 아래처럼 작성해서 실행시키면 flag를 얻을 수 있다. 그리고 마침 시간이 지나면 timeout과 함께 eof가 뜬다!

 


(인덱스 관련해서 이리저리 시도해보느라 페이로드를 다 나눠서 작성했다.)

'Pwnable > Dreamhack' 카테고리의 다른 글

[Pwnable] Dreamhack_out_of_bound  (0) 2022.08.26
[Pwnable] Dreamhack_oneshot  (0) 2022.08.26
[Pwnable] Dreamhack_ basic_exploitation_000  (0) 2022.08.25