완료됨
포맷스트링 실습 질문드립니다.
다른 분의 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
saika😺
Closed Beta Tester
- 32비트 기준으로
%x
를 3번하게되면 esp로부터 각각 +4, 총 +12가 되어0Ðýÿ
== 0xfffdd030 값이 write되어있는 주소를 참조하게하여 %n 할 위치를 임의로 지정할 수 있게됩니다. - %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되는 값을 확인하실 수 있으니 이해에 도움이 되실 것 같습니다.