1、双向链表上有a、b、c一共3个连续的堆块,a、b、c三者之间的实际物理地址可能相差很大,但是绝对不会三者之间无其他字节,如果无其他字节,那表示他们三个可以合并成一个物理连接起来的大块,堆管理系统很快会让他们三者搞基成一个大个子堆块,拆下来重新按照其尺寸重新链接到该去的链表位置去。。。而不会放纵其在链表上物理地址紧密链接的同时还分成3个堆块串联在链表上。

2、返回正题,拆下其中一个堆块b时,会产生a、c之间的空缺,导致a、c无法相互知晓。所以堆管理系统会在拆b时,把a和c缝缝补补,连在一起,成为新链表,等待下次拆分、合并等等。

  关键来了,以b堆块为例

  【1】每个堆块前边8字节是堆块首部内存 第9~12字节保存他前方堆块的块数据地址. 也就是a的块数据地址

这个指针叫做前向指针

  【2】每个堆块都在 第13~16字节处保存他后面那个堆块的块数据地址 也就是c的块数据地址 这个指针叫做后向指针

【3】当用到堆块操作时 会执行 mov [13~16], 9~12 当再次调用分配函数时会执行后向指针中的代码

  以此类推每2个相邻堆块之间由于双向可循,由于每个堆块上都记载着往该块左边或右边方向走的下一个地址(即上述9~12、13~16字节数据均为地址值),所以断掉一个块(暂称为块b)时,该断掉的块的左右两边欲形成新连接,必须知道彼此的地址。这个重新知晓相互地址的任务由即将被拆下来的堆块去处理,因为它才同时熟悉两边的邻居,知道他们地址,于是该堆块(又叫节点)把他身上距离头顶第9~12字节的4个字节的数据(实际上是他右邻居堆块的门牌号地址,举例0x001A0038)抄下来,给到左邻居。怎么给?在他身上距离头顶第13~16字节处的4个字节,就是他左邻居的门牌号地址(这个数据肯定比他右邻居的门牌号地址小,假设0x001A000A),我们于是按照这个左邻居地址,在堆管理系统帮助下,把0x001A0038这个数值给到左邻居家去:mov [0x001A000A],0x001A0038    。。。。都知道[]方括号的意思吧。等右邻居的地址给了左邻居后,再把左邻居的地址按此方法给到右邻居,他此时也就从链表上断下来了,因为空表链表上已经没有他存在的痕迹了。

  而这个断掉块b过程之前,我们先通过字符串变量溢出,将字符串从其他块溢出到块b中,即覆盖了他的第9~16字节数据,效果就是改了他身上所保管的左、右邻居门牌号地址,一般就是右邻门牌号覆盖为shellcode入口地址,左邻门牌号覆盖为各种特殊地址,比如重要函数调用地址,栈帧中函数返回地址,栈帧中SEH的句柄。这样,在块b断下来时,他会把shellcode地址赋值到某个经常调用的函数的地址上,或栈帧中当前函数返回地址上,或栈帧中距离当前栈最近的SEH异常处理最近的那个句柄。

  然后堆块这边就没他们什么事了,就等着某个函数被调用,错误跳转到shellcode地址去执行我们构造的code;等着栈帧中当前函数返回时执行的却是跳转到shellcode地址去执行我们构造的code;溢出发生了导致系统启动异常处理,执行了SEH异常处理相关函数,跳转到shellcode地址去执行我们构造的code。。。。。。

  溢出并恶意执行了我们的代码。

  现在回头去看,堆块断下来时,把错误的右邻居门牌号(子弹,shellcode入口地址,共计4个字节,即为DWORD双字),抄给左邻居时(左邻居的地址已经被改为目标地址,任何能被调用的地址),就是发生了子弹射击,DWORD Shoot是也。

  至于后面的把左邻居地址给右邻居地址的操作,会发生指针反射现象,会改写shellcode的5到8的4字节,大多数情况不会发生问题,解决方案就是把shellcode第一条指令修改为jmp 跳过到第九字节的地址 具体如图:

堆溢出DWORD SHOOT原理相关推荐

  1. 堆溢出的DWORD Shoot核心原理-口语化

    1.双向链表上有a.b.c一共3个连续的堆块,a.b.c三者之间的实际物理地址可能相差很大,但是绝对不会三者之间无其他字节,如果无其他字节,那表示他们三个可以合并成一个物理连接起来的大块,堆管理系统很 ...

  2. 堆溢出(二)空表DWORD SHOOT

    0x000 环境 虚拟机 VirtualBox 5.0.20 系统 windows 2000 Kali linux 工具 VC++6.0 OllyDbg 1.10 汉化版 AsmToE v5.20 0 ...

  3. 5.4 堆溢出利用(上)——DWORD SHOOT

    目录 一.预备知识 二.实验环境 三.实验代码 四.实验步骤 一.预备知识 堆管理系统的三类操作:堆块分配.堆块释放和堆快合并归根结底都是对链表的修改.堆溢出利用的精髓就是用精心构造的数据溢出下一个堆 ...

  4. 漏洞学习笔记——堆溢出原理

    最近在学习堆的溢出原理,但是查了网上和书上的一些讲解,总是感觉缺少一些关键点.所以理解起来总是有点晕,经过努力的调试分析后,总结了下面的更为详细的堆溢出原理.如果不准确的地方,希望大佬可以提醒一哈~ ...

  5. CVE-2020-15999:Chrome FreeType 字体库堆溢出原理分析

     聚焦源代码安全,网罗国内外最新资讯! 漏洞简介 Google发布公告,旧版本的 chrome 浏览器的 FreeType字体库中存在堆溢出,被利用可能导致 RCE(远程代码执行). 安全专家建议用户 ...

  6. 【缓冲区溢出】堆溢出原理

    一.操作系统中堆和栈的区别 堆内存申请,释放,操作,特点: 1. 堆内存申请环境:堆内存需要程序员在程序中申请 ,动态分配,申请的大小有程序决定. 2. 堆内存申请方法:C语言中的malloc() 函 ...

  7. 堆溢出攻击(XP SP2 - 2003)

    微软在堆中也增加了一些安全校验操作,使得原本是不容易的堆溢出变得困难重重: * PEB Random:在 Windows XP SP2 之后,微软不再使用固定的 PEB 基址 0x7FFDF000,而 ...

  8. 《0day安全》堆溢出利用(下)——代码植入

    狙击 P.E.B 中 RtlEnterCritical-Section()的函数指针 这里,我们不妨以0x7FFDF024处的RtlEnterCriticalSection()指针为目标,联系一下DW ...

  9. [漏洞分析] CVE-2021-42008 6pack协议堆溢出内核提权

    CVE-2021-42008 6pack协议 文章目录 CVE-2021-42008 6pack协议 漏洞简介 环境搭建 漏洞原理 漏洞发生点 poc GCC优化 漏洞利用 计算越界偏移 直接胜利方程 ...

最新文章

  1. 每天进步一点点——Linux文件锁编程flock
  2. 指针和数组的区别是什么?
  3. 二进制安装部署 4 kubernetes集群---超详细教程
  4. php 直接定义 和 construct,PHP _construct()函数讲解
  5. python字典的用法_Python字典的用法详解(附示例)
  6. 【网搜】禁止 number 输入非数字(Android仍有问题)
  7. WebSecurityConfigurerAdapter详解
  8. java 标记_java – 标记注释与标记接口
  9. python tkinter获取屏幕大小_用 Python 制作关不掉的端午安康弹窗
  10. Java程序员必备的11大Intellij插件
  11. 从 VI 编辑器谈操作系统起源及编辑器本质
  12. 【实习周记】ArrayMap源码分析
  13. 【图算法】(3) 网络的基本静态几何特征(二),附networkx完整代码
  14. 【MySQL学习笔记(十六)】之redo日志超详细讲解
  15. 微信小程序返回上一页各种方法
  16. MVP Architecture on Android
  17. snkrs暂时无法链接服务器,安卓snkrs一直出错了怎么解决 苹果snkrs无法连接服务器什么原因...
  18. C++入门:鸡兔同笼问题
  19. 【Python简明教程二十八】PIP
  20. 如何搭建属于自己的Web服务器

热门文章

  1. MySQL 5.5单实例 编译安装
  2. 年末盘点 2016 年最严重的 7 起 DDoS 攻击事件
  3. JAVA 读取图片储存至本地
  4. iOS开发UI篇—CALayer简介
  5. python xlsxwriter 在 flask 中的使用
  6. Vitamio FAQ(2012-11-20 )
  7. gitlab升级-(一)安装一台旧版本
  8. redux和react-redux的使用详解
  9. 用户与IoT同享一个WLAN时:弹性至关重要
  10. win7编程接口的一些变化