완료됨
포맷스트링 실습 질문드립니다.

다른 분의 payload인 0Ðýÿ%x%x%x%234x%n에서,
(1) 왜 0Ðýÿ%237x%n으로 하면 안 되고 저렇게 %x 3번 한 뒤에 %234x를 해야 하는지,
(2) %n은 이전에 출력된 바이트 수를 저장한다고 하는데, 그러면 0Ðýÿ(4)+%x%x%x%234x(237)=241 바이트 아닌가요? 어떻게 255바이트가 되는지 궁금합니다.

#시스템해킹
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
saika😺
Closed Beta Tester
  1. 32비트 기준으로 %x를 3번하게되면 esp로부터 각각 +4, 총 +12가 되어 0Ðýÿ == 0xfffdd030 값이 write되어있는 주소를 참조하게하여 %n 할 위치를 임의로 지정할 수 있게됩니다.
  2. %x를 통해 출력되는 바이트 수도 계산에 포함해주셔야 하며 padding을 지정하지 않으시면 스택 상황에 따라 %x가 출력하는 바이트 수는 달라질 수 있습니다. 예를들어 %x가 4바이트를 출력할 경우 %x%x%24x%n 는 4 + 4 + 24 = 32를 esp+16의 포인터에 저장하게됩니다.

아울러 이해를 돕기위해 기존 Memory Curruption 2의 FSB 실습은 난이도가 하향된 버전으로 수정되었습니다.
FSB를 통한 Exploit 강의는 https://dreamhack.io/learn/3#23 를 참조해주세요. 기존에 실습하시던 모듈은 https://dreamhack.io/learn/3#33 에서 만나보실 수 있습니다.
또한 모든 FSB 실습에서 추가된 "디버거 활성화" 기능을 사용하시면 입력하신 각 format string directive에 대해 대응되는 스택주소와, 출력되거나 write되는 값을 확인하실 수 있으니 이해에 도움이 되실 것 같습니다.

2020.05.22. 16:26