- 드림핵에서 Format String Bug 관련 내용을 공부하다가 이해가 잘 안 되었던 부분이 있어서 정리해 본다...
- 만약 새로 알게 된 내용이 있으면 추가할 예정이다.
- printf 등 포맷 함수에 포맷 인자만 넣는 것에 대한 설명
1. FSB Easy
1) 풀이 1
https://dreamhack.io/forum/qna/3261
https://velog.io/@securitykss/Dreamhack-Format-String-Bug-1-Description
https://dreamhack.io/forum/qna/1420
- auth의 주소를 Little Endian 후 Hex Encode해야 한다. (그대로 보내면 주소가 아닌 문자열로 판단하게 된다.)
- 답(ÜÝÿÿÿ%247c%9$n) : 이 값은 Hex Encode 된 값을 String으로 표시하고 있다.
- 테스트로 AAAAAAAA.%8$x.%9$x.%10$x.%11$x를 입력하면 AAAAAAAA.555547cd.41414141.2438252e.252e7824가 출력되며 입력값인 AAAAAAAA(0x41414141)이 9번째 인자로 들어간다는 것을 알 수 있다. 또한, 8번째 인자부터는 8 Byte씩 출력되고 있음을 알 수 있다. (x64의 함수 호출 규약을 생각해보면, 출력된 값들은 첫 인자부터 순서대로 rsi, rdx, rcx, r8, r9, [rsp], [rsp+8], [rsp+0x10], [rsp+0x18], [rsp+0x20]... 로 이어짐을 알 수 있다.)
- 그렇다면 9번째 인자에 주소값을 넣고 여기에 값을 넣을 수 있으면 된다. 또한, 인자의 크기는 8 Byte이므로 이에 맞춰 추가로 값을 넣는다.
- 9번째 인자로 auth의 주소를 Little Endian 후 Hex Encode하여 넣고, 뒤에 %246c%9$n를 붙인다.
%n은 그 시점까지 출력한 문자열 길이 값을 얻어 올 수 있으며, 9$는 9번째 인자를 뜻하는 것이다.
- %9$n 이전까지 출력한 문자열 길이는 대상 주소값 길이(8) + %247c(247) = 255이며, 이는 16진수로 ff이다.
2) 풀이 2
https://dreamhack.io/forum/qna/1835
- 원리는 위 풀이와 비슷하지만, 다른 점은 주소 값을 뒤로 놓고 해결했다는 것이다.
- 답(%255c%11$naaaaaaÜÝÿÿÿ) : : 이 값은 Hex Encode 된 값을 String으로 표시하고 있다.
'프로그래밍 > 해킹' 카테고리의 다른 글
시스템 해킹 퀴즈 모음 (0) | 2024.08.30 |
---|---|
웹 해킹 퀴즈 모음 (0) | 2024.08.30 |
PLT / GOT / libc database (0) | 2024.08.15 |
Ghidra 사용법 (0) | 2024.08.03 |
IDA 사용법 (0) | 2024.08.03 |