완료됨
payload 구성에 관한 질문

pie의 base 주소를 얻고, changeme의 주소까지 잘 계산했습니다. 이제 FSB를 이용해 changeme의 주소값에 1337을 써넣으면 되는 단계인데, payload 구성 시
payload = b"%1337x%8$n" + b'A'*6 + p64(changeme)
이게 먹힌다는 것은

payload = p64(changeme)+ b"%1337x%6$n" + b'A'*6
이렇게 적어도 먹혀야 하는 것 아닌가요? changeme가 stack의 첫번째 인자로 쌓이면서 %6$n의 자리가 p64(changeme)를 가르키게 되는 것이니까요... 하지만 작동하지 않습니다 왜인건지 잘 모르겠어요 ㅠ

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
hazziin
대표 업적 없음
hazziin
대표 업적 없음

안녕하세요, 52pickle 님!

printf()는 문자열의 끝을 null(0x00)으로 간주하고, null 바이트를 만나기 직전까지의 문자열을 출력합니다.
포맷 스트링 버그가 정상적으로 작동하기 위해서는 인자로 우리가 입력한 포맷 스트링이 전달되어야 하는데,
payload = p64(changeme)+ b"%1337x%6$n" + b'A'*6와 같이 입력하시는 경우 changeme의 주소에 null 바이트가 포함되어 있어 뒷부분의 포맷 스트링이 인자로 들어가지 않습니다.
즉, printf()의 인자로 changeme의 주소 6 바이트만 전달되기 때문에 작동하지 않는 것입니다.
이해에 도움이 되었기를 바랍니다.

감사합니다.

2025.09.15. 16:38