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

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

  关键来了,

  【1】双向链表上a与b之间有从左往右的一条线(这条线体现在:每个堆块都在距离自身堆块块首的相对第9~12字节保存他前方那个堆块(远离链表头的方向)的块数据的地址)连起来.

  【2】又有从右往左的一条线连起来(这条线体现在:每个堆块都在距离自身堆块块首相对13~16字节处保存他屁股后面那个堆块(当前堆块屁股位置是靠近链表头地址的那边)的块数据的地址);

  以此类推每2个相邻堆块之间由于双向可循,由于每个堆块上都记载着往该块左边或右边方向走的下一个地址(即上述9~12、13~16字节数据均为地址值),所以断掉一个块(暂称为块b)时,该断掉的块的左右两边欲形成新连接,必须知道彼此的地址。这个重新知晓相互地址的任务由即将被拆下来的堆块去处理,因为它才同时熟悉两边的邻居,知道他们地址,知道他们联系电话,QQ号,微信号。。。于是该堆块(又叫节点)把他身上距离头顶第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,这个以后再分享了。

转载于:https://www.cnblogs.com/taonull/p/3930054.html

堆溢出的DWORD Shoot核心原理-口语化相关推荐

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

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

  2. 堆溢出DWORD SHOOT原理

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

  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. CVE-2012-1876 Internet Exporter堆溢出漏洞分析

    文章目录 漏洞描述 IE浏览器组件介绍 分析环境 POC 漏洞分析 漏洞利用 参考资料 漏洞描述 该IE浏览器漏洞的成因在mshtml.dll这个模块的CTableLayout::CalculateM ...

  9. CVE-2014-6321 schannel堆溢出漏洞分析

    cssembly · 2014/12/05 12:09 0x00 背景 MS14-066 (CVE-2014-6321) 是存在于Microsoft的schannel.dll中的TLS堆缓冲区溢出漏洞 ...

最新文章

  1. Python机器学习:训练Tesseract
  2. 20个将 JavaScript 用到极致的网站
  3. 《深度探索C++对象模型》--2 构造函数语意学
  4. win环境下,django+postgresql配置
  5. BZOJ 1834 Luogu P2604 [ZJOI2010]网络扩容 (最小费用最大流)
  6. 记录kafka-flink bug
  7. drools dmn_DMN 1.1 XML:从建模到使用Drools 7.0的自动化
  8. Web Service 学习
  9. Hakase and Nano【博弈】
  10. [转载] 中华典故故事(孙刚)——31 千里送鹅毛_礼轻情义重
  11. QImage使用说明
  12. C盘空间不够?win10自带mklink命令给C盘软件搬家减负【计算机小白必备】
  13. 外卖行业现状分析_O2O模式下的外卖行业的发展现状和前景分析
  14. 【解决】UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xef in position 0: ordinal not in range(128
  15. 将计算机与局域网互连 需要_,计算机与局域网连接需要的硬件是什么
  16. PGSQL 模糊查询不区分大小写
  17. Office For Mac 中的 Excel 表格怎样换行
  18. stm32f103系列开发板控制对数码管来显示自定义时间(自主学习)
  19. android12.0(S) Launcher3 导入 AndroidStudio 调试编译
  20. Android实现重力小球

热门文章

  1. mysql 5.1.62_MySQL 5.5.62 安装方法(标准配置版)
  2. 乐高计算机发展史教程,【乐高产品发展史特别篇】乐高恐龙发展史
  3. 按频率对元素进行排序
  4. go zap去除程序名称_适用于Zip,Zap和Zoom游戏的Python程序
  5. java uuid静态方法_Java UUID getLeastSignificantBits()方法与示例
  6. c# 前导0_C#| 用前导零填充整数
  7. 打开eclipse出现Failed to load the JNI shared library “D:\java\jdk\bin\...\jre\bin\server\jvm.dll”如何解决?
  8. librtmp分析(接收数据包处理)
  9. java解析excel的js页面,Java导入Excel文件页面实现JS
  10. mysql 学习笔记03修改表以及其他操作