제가 gdb를 이용하여 확인한 바로는 메모리 구성이 다음과 같았습니다.
msg [0x10 byte] | ??? [0x8 byte] | check [8byte] | sfp [8byte] | ret [8byte]
그래서 익스플로잇 페이로드를 다음과 같이 구성했습니다.
"A"*0x10 + "A"*0x8 + "\x00"*0x8 + "A"*0x8 + p64(oneshot_gadget)
근데 정상적인 실행이 이루어지지 않아서 방법을 찾다가 도저히 모르겠어서 질문 남깁니다 ㅠㅠ 뭐가 잘못된 건지 알 수 있을까요?
추가로, 가젯의 조건을 확인하고 조건에 부합하는 것을 이용했습니다. 또한 gdb를 이용해서 흐름을 확인할 때 "\x00"가 입력이 안되는 것처럼 보이더라구요. 혹시 이것이 문제라면 메모리에 0x0 값을 전달하는 방법이 있을까요?
쉘창에서 바로 페이로드를 전송하시는건가요?
pwntools 를 이용해 페이로드를 전달하기 전, gdb 에 프로세스를 attach 해서
페이로드 전송 후 메모리를 확인해볼 수 있습니다.
-
혹시 oneshot_gadget 이용하실 때 그냥
one_gadget
명령어에서 나온 offset을 이용하셨나요?
만약 그렇다면 당연히 되지 않습니다.libc_base
를 얻는 과정을 진행하셨는지 확인해주시기 바랍니다. -
gdb에서 입력값을 전달할 때 키보드에 있는 문자들 이외의 값을 주고 싶다면
(gdb) r <<< $(python -c "print '\x90'*52")
이런식으로 값을 전달할 수 있습니다.
다른 방법도 있으니 알고 싶으시다면 직접 찾아보시길 권합니다.