본문 바로가기
프로그래밍/해킹

Format String Bug

by 만디기 2024. 8. 18.

- 드림핵에서 Format String Bug 관련 내용을 공부하다가 이해가 잘 안 되었던 부분이 있어서 정리해 본다...

- 만약 새로 알게 된 내용이 있으면 추가할 예정이다.

- printf 등 포맷 함수에 포맷 인자만 넣는 것에 대한 설명

 

https://stackoverflow.com/questions/31290850/why-is-printf-with-a-single-argument-without-conversion-specifiers-deprecated

 

 

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