로컬 익스플로잇 문제인 모양인데, 지금 보면 이 간단한 문제를 왜 못풀었었는지 모르겠다.

strcat 부분에서 간단하게 오버플로우가 나고, SSP가 걸려 있는 통에 EIP 조작을 통한 공격은 쉽지 않아 보인다.

게다가 뭔가를 출력해주는 함수도 없기 때문에 PLT나 GOT를 활용하는 것도 불가능하다.

오버플로우를 내지 않고 공격을 해야 하는데, 루틴을 보면 공격할 부분이 보인다.

system(dest)로 바로 실행시켜주기 때문에 dest를 어떻게 조작해서 command injection를 하면 쉘을 딸 수 있다.

위에서 __ctype_b_loc 으로 특수문자가 있는지 확인하고, 거기에 더해 공백이 있는지까지 본다.

사실 공백 검사를 하는 것을 깜빡하고 테스트용으로 'echo Hello' 등을 넣어 공격했다가 삽질했다.

strcat를 한 다음에 저 검사를 하기 때문에, 오버플로우를 일으켜 argv[1]의 주소가 든 부분을 덮어써서 NULL이 있는 부분으로 보내버리면 되겠다.


우선 argv[1]의 위치를 확인했다.

argv[1]은 0x7fffffffe893에 존재했고, 이 주소가 들어 있는 부분은 0x7fffffffe630이다.


다음으로 strcat의 인자를 확인하여 dest에 0x7fffffffe420이 들어가는 것을 확인했다.


이 주소간의 offset을 구해보면 0x210이 나온다.


마지막으로 NULL이 위치한 구간을 대충 찾았고, 이걸로 페이로드를 구성하면


./shock `python -c 'print "(dummy);/bin/sh;" + "A" * (0x210-3-len("(dummy);/bin/sh;")) + "\x64\x0a\x40"'`


이 되겠다.

3을 빼주는 이유는 미리 dest에 "id "라는 문자열이 들어 있기 때문이다.

이렇게 공격을 수행하면


쉘을 따는 것에 성공할 수 있다.

'CTF > 지난 대회' 카테고리의 다른 글

SecuInside 2013 - reader  (0) 2016.01.13
SecuInside 2013 - givemeshell  (0) 2016.01.13
Codegate 2013 Prequal - vuln 300  (0) 2015.11.21
Codegate 2013 Prequal - vuln 200  (0) 2015.11.21
Codegate 2015 - Bookstore  (0) 2015.11.16
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,