완료됨
%5$hn이 이해가 되지 않습니다.

payload = f"%{under}c".encode()
payload += b"%5$hn"
to_add = 16 - len(payload)
payload += b"A" * to_add
payload += p32(exit_got)

코드 설명에서 어떻게 5번째 파라미터인지 확인가능한 것인가요?

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
wyv3rn
무플 방지 위원회장
avatar
wyv3rn
무플 방지 위원회장

포맷 스트링 버그에서 제일 먼저 확인해야하는 것이
"내가 입력하는 값이 몇번째 오프셋인가" 입니다.
%p나 %x로 이를 확인할 수 있으며, 이를 통해 몇번째 오프셋에 값을 쓸 것인지 계획을 수립할 수 있습니다.
예상컨데, 이 바이너리에서는 첫번째 출력부터 입력된 값이 출력될 것입니다.

더불어 32비트 환경이니 페이로드를 전송하기 전에 출력하여 4바이트씩 분리해보면 더 쉽게 확인하실 수 있을거라 생각합니다.

페이로드를 기반하여 역으로 최종 페이로드를 예상해보자면,
쓸 곳인 exit_got address가 5번째 오프셋인데, padding을 16-len(payload)이니 첫번째 offset부터 입력한 값이 출력되는 상황이며, 4바이트로 자르면 대략 아래와 같을 것으로 판단됩니다.

ex. 1) c의 길이가 3바이트이고, 123인 경우
%123 => 첫번째 오프셋
c%5$ => 두번째
hnAA => 세번째
AAAA => 네번째. 여기까지 16바이트
exit_got address 4 byte => 다섯번째

ex. 2) c의 길이가 6바이트이고, 123456인 경우
%123
456c
%5$h
nAAA
exit_got address 4 byte

와 같아집니다.

2025.08.13. 11:44