level 13
2020. 9. 8. 15:57
48번째의 글자가 '\xbf'가 되는 것을 검열하네요.
이는 스택 전체를 못쓴다고 봐야죠.
이로써 공유 라이브러리를 사용해야겠다고 어느정도 유추가 가능하죠.
그렇다면 공유메모리를 어떻게 써야할까요?
상단에 힌트가 있습니다.
바로, RLT이죠.
RLT 기법이란 Return-to-libc로 NX bit 즉, 스택에 쉘코드를 삽입하고 이를 악용하는 것을 우회하는 기법입니다.
공유 라이브러리에서 system 함수가 있는지 확인해보죠.
0x40058ae0이 공유 라이브러리에 있는 system 함수의 주소네요!
이제 system 함수에 "/bin/sh"문자열이 있는지 확인해보겠습니다.
소스코드를 직접 작성해 메모리 값을 하나씩 늘려가며 "/bin/sh\x00"과 일치하는지 확인하고 일치하다면 주소를 던지도록 했습니다.
0x400fbff9에 있다네요.
이제 RET 주소에 system 함수 주소를 넣고, system 함수 뒤에 실행할 함수가 없으니 dummy(4바이트)를 넣고, system 함수의 인자로 문자열 "/bin/sh\x00"을 넣을 것이니 위에서 구한 주소를 넣겠습니다.
payload를 작성하겠습니다.
"A"*44 + "\xe0\x8a\x05\x40" + "AAAA" + "\xf9\xbf\x0f\x40"
성공!