32비트 체제에서의 Format String Bug에 대한 정리이다.
32비트로 구동되는 바이너리 파일의 경우 함수 인자를 전달할 때 64비트 바이너리 파일과 다르게 스택에 인자의 값들을 저장하고 사용한다.
C언어에서는 sprintf, printf 같은 함수에 사용자의 입력이 format을 지정하는게 가능해지면 문제가 발생한다.
이를 Format String Bug 라고 한다.
악성 사용자가 format에 대한 입력이 가능하면 %n 혹은 %p 와 같은 특정 format들을 이용하여 공격을 시도할 수 있다.
32비트 파일에서 sprintf 라는 함수가 사용되며 사용자가 많은 양의 format을 지정하는게 가능하다고 가정하자.
사용자의 입력중 format에 해당하지 않는 부분은 앞서 인자로 전달한 공간에 전달되고 저장 될 것이다.
이 때 값을 저장하는 공간은 32비트 파일의 경우 stack에 저장하게 되고 후속되어 작성된 %n 과 같은 주소에 저장된 value를 변경하는 format 에 의하여 특정 주소값에 저장된 값이 변경될 수 있다.
이를 이용하면 GOT overwrite과 같은 공격이 추가적으로 이뤄질 수 있다.
(2026.01.26 추가 작성)
위에 설명한 글이 너무 추상적인 느낌이라 좀 더 자세하게 쓰려고 한다.
사실상 하나의 페이지에 2가지 버전의 글을 적는거라고 보면된다.
사용자의 입력값이 printf 함수와 같은 format을 사용하는 함수에 format으로 전달하는게 가능해지는 순간 format string bug는 발생한다. 이는 format에 대한 함수의 해석루틴을 활용하는 공격이라고 보면 된다.
printf와 같은 함수는 인자로 들어온 값을 해석하는 도중 format을 만나면 해당 format과 인자를 매칭시켜서 출력값을 찾는다.
이를 이용하면 printf("aaaa %p %p") 라는게 실행된다고 할때 만약 출력값이 aaaa 0x21a53cde 0x41414141 이라고 뜬다면 내 입력값이 스택의 2번째 인자에 저장됨을 파악하는게 가능해진다.
이러한 정보파악을 통해 인자의 저장위치를 파악하고 이를 활용해 %hhn (해당 인자의 값을 주소로하는 위치에 1byte 쓰기 format), %hn (2byte 쓰기 format), %n (4byte 쓰기 format)과 %c format을 적절하게 활용하면 원하는 주소의 위치에 원하는 값을 write하는게 가능해진다.
'보안, 해킹 > _Pwnable' 카테고리의 다른 글
| meltdown에 대하여... (0) | 2026.01.29 |
|---|---|
| [Dreamhack] basic_exploitation_002 (0) | 2026.01.26 |
| return address overwrite (2) | 2025.07.30 |
| shellcode (0) | 2025.07.14 |
| GDB와 pwndbg (1) | 2025.07.13 |