ipwn
Team H4C [CTF] SCIJ 본문
이 문제는 포너블 문제에 해당하는 문제였습니다.
배점이 50점이라 그런지 난이도도 그렇게 어려운 편에 해당하는 문제가 아니었습니다.
먼저 다운로드를 통해 바이너리를 받은 후 IDA를 이용해 파일을 열어보게 되면 아래와 같은 코드들이 나오게 됩니다.
보아하니 read함수를 통해 buf에 입력을 받아주는 것을 알 수 있고
dest에는 0x6863652F6E69622F의 값이 들어있는 것을 알 수 있습니다.
그리고 그 밑의 코드 부분에서는 strchr 함수들을 통해 몇 몇의 문자들을 필터링 해주며
(문자로 표현하면 (`) ($) (|) (;) 의 네 문자를 필터링 함)
마지막으로는 strcat함수를 통해 dest의 뒤에 buf를 이어주며 dest에 저장된 값으로
system 함수를 실행시키는 것을 알 수 있습니다.
이제 코드 분석은 끝이 났으니 어떻게 exploit을 할지 고민해봤는데, 다른 분들은 어떻게 푸셨는지 잘 모르겠지만
저 같은 경우에는 buf를 overwirte해서 dest를 덮어준 후 system함수에 "/bin/sh"를 넣어서
쉘을 따 내는 방법을 생각해냈습니다.
자 이제 생각을 해 봤으니 exploit을 해봅시다.
일단 Linux 서버로 바이너리 파일을 넘겨서 gdb로 디버깅 해봤습니다.
일단 buf와 dest의 거리가 얼마나 떨어져있는지를 확인해보기 위해서 main 함수의 ret 부분에 breakpoint를 걸어준 뒤
A를 16개를 넣어준 후 buf의 주소를 찾아봤습니다.
buf와 dest의 거리가 128byte만큼 떨어져 있는 것을 확인할 수 있습니다.
이제 exploit이 가능해졌습니다.
buf의 시작을 "로 시작한 뒤 바로 NULL값으로 dest바로 전 까지 메모리를 덮어 준 뒤
dest의 값을 "/bin/sh NULL로 만들어주면 dest의 "/bin/sh 뒤의 NULL을 만나
dest의 끝으로 인식해 buf의 값이 이어서 쓰여지고
buf는 "로 시작 그 뒤는 NULL로 채워져있기 때문에 "이 시작 그 뒤는 NULL을 만나 문자열의 끝으로 인식하게 되어서
결론적으로 dest의 값은 "/bin/sh"의 값이 덮어씌워지게 될 것 입니다.
이제 페이로드를 짜 봅시다.
일단 buf의 시작은 (")이어야 하겠죠? (")는 아스키코드로 0x22입니다.
그리고 그 뒤 127 byte를 NULL 즉 \0으로 채워줘야 합니다.
python -c 'print "\x22" + "\0"*127'`
이제 dest를 "/bin/sh+NULL로 덮어주면 됩니다.
아스키 코드를 살펴보고 페이로드를 짜게 된다면 결론적으로 페이로드는
python -c 'print "\x22" + "\0"*127 + "\x2f\x62\x69\x6e\x2f\x73\x68\x22" + "\0"'
이렇게 생성이 됩니다.
이제 실제로 이 페이로드를 넣고 공격해 보겠습니다.
??? 왜 안먹히지
... 서버가 닫혀있네요 ㅠㅠ
그냥 받아놓은 파일을 공격해서 제 쉘을 따 보도록 합시다.
payload가 성공적으로 작동되었습니다.
실제로 서버의 쉘을 가져온 것은 아니지만 실제 서버의 파일을 똑같이 공격하더라도 같은 효과가 적용이 되므로
서버가 열려있었다면 그 서버의 쉘도 가져올 수 있었다는 걸 알 수 있습니다.
다 풀고나서 생각해 본 사실이지만 이렇게 짧은 페이로드로도 똑같이 쉘을 가져올 수 있었습니다.....
'CTF's > TeamH4C' 카테고리의 다른 글
Team H4C [CTF] deasiestone (0) | 2017.12.18 |
---|---|
Team H4C [CTF] Modulation (0) | 2017.12.18 |
Team H4C [CTF] What The Issue (0) | 2017.12.18 |
Team H4C [CTF] Scratch (0) | 2017.12.18 |