代码编织梦想

目录

一、预备知识

二、实验环境

三、实验代码

四、实验步骤


一、预备知识

        堆管理系统的三类操作:堆块分配、堆块释放和堆快合并归根结底都是对链表的修改。堆溢出利用的精髓就是用精心构造的数据溢出下一个堆块的块首,改写块首中的前向指针(flink)和后向指针(blink),然后在分配、释放、合并等操作发生时伺机获得一次向内存任意地址写入任意数据的机会。这种能够向内存任意地址写入任意数据的机会称之为“DWORD SHOOT”。

        通过DWORD SHOOT,攻击者可以劫持进程,运行shellcode,主要有如下情形:

点射目标(target)子弹(payload)改写后的结果
栈帧中的函数返回地址shellcode的起始地址函数返回时,跳去执行shellcode
栈帧中S.E.H句柄shellcode的起始地址异常发生时,跳去执行shellcode
重要函数调用地址shellcode的起始地址函数调用时,跳去执行shellcode

        举一个例子说明DWORD SHOOT究竟时如何发生的。将一个结点从双向链表中“卸下”的函数很可能是这样的:(参考数据结构)

int remove (ListNode * node) 
{ 
    node -> blink -> flink = node -> flink; 
    node -> flink -> blink = node -> blink; 
    return 0; 
}
        当堆溢出发生时,非法数据可以淹没下一个堆块的块首。这时,块首是可以被攻击者控制 的,即块 首中存放的前向指针( flink )和后向指针( blink )是可以被攻击者伪造的。当这个堆 块被从双向链表中“卸下”时, node -> blink -> flink = node -> flink 将把伪造的 flink 指针值写入伪造的 blink 所指的地址中去,从而发生 DWORD SHOOT。过程如下:
        注:图5.3.1为正常“拆卸”,图5.3.2为异常拆卸!!!

 

         !!!另外,请特别注意实际内存中的前向指针和后向指针示意图:(与数据结构中有一点点不一样,图中释放顺序为h1、h3、h4)

二、实验环境

        操作系统:Windows 2000 professional

        软件版本:原版OD(实时调试状态)、VC++6.0(release)

三、实验代码

#include <windows.h>

main()
{
	HLOCAL h1, h2,h3,h4,h5,h6; 
    HANDLE hp; 
    hp = HeapCreate(0,0x1000,0x10000); 
    h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8); 
    h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8); 
    h3 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8); 
    h4 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8); 
    h5 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8); 
    h6 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
	

	_asm int 3//used to break the process 
    //free the odd blocks to prevent coalesing 
    
    HeapFree(hp,0,h1); 
    HeapFree(hp,0,h3); 
    HeapFree(hp,0,h5); //now freelist[2] got 3 entries 
    //will allocate from freelist[2] which means unlink the last entry h5
    
    h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8); 

    return 0;
}
        注意:
        (1 )程序首先创建了一个大小为 0x1000 的堆区,并从其中连续申请了 6 个大小为 8 字节
的堆块(加上块首实际上是 16 字节),是从初始的尾块中“切”下来的。
        (2)释放奇数次申请的堆块是为了防止堆块合并的发生。
        (3)三次释放结束后, freelist[2] 所标识的空表中应该链入了 3 个空闲堆块,它们依次是 h1 h3 h5 。 (链入尾部)
        (4)再次申请 8 字节的堆块,应该从 freelist[2] 所标识的空表中分配,这意味着最后一个堆
h5 被从空表中“拆下”。
        (5)如果我们手动修改 h5 块首中的指针,应该能够观察到 DWORD SHOOT 的发生。

四、实验步骤

        1、编译程序,直接进入OD界面,停在断点处:

         2、F8释放三次内存,手动更改H5的前向指针为0x44444444,后向指针为0x00000000.

         3、执行内存申请的指令,会发现编译器运行错误。

         根据:

node->blink->flink=node->flink
        无法将0x44444444写入0x00000000。

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_55202378/article/details/127156557

dword shoot_zh_explorer的博客-爱代码爱编程

简介 Dword shoot,一种很简单的漏洞溢出技巧,所以就简单的说明一下吧。dword shoot漏洞是出现在双向链表表删除的时候出现的一种漏洞类型。(双向链表是什么不用我解释吧)在进行双向链表的操作过程中如果因为处置

堆溢出利用_wangtiankuo的博客-爱代码爱编程_堆溢出利用

本文整理自《0day安全:软件漏洞分析技术》 1 堆 2 代码 #include "stdafx.h" #include <Windows.h> int _tmain(int argc, _TCHAR* argv[]) { //HANDLE和HLOCAL 是 void* HLOCAL h1,h2,h3,h4,h5,h6; HA

堆溢出,堆喷射简介_kernweak的博客-爱代码爱编程

堆简介 堆上分配内存,就是比如malloc,就是从堆上把这块内存的链表,摘下来共我们使用。堆上自己是按桶的结构进行管理(一个hash表),从2^1,2^2,2^3,2^4.....,如果申请一个50字节内存,就从,2^6分配,64-50=14,有14个内存碎片。我们申请内存就是从这个内存表中把某一个节点从这个双向链表中摘掉。即 Node->bp-

《0day安全》中的堆溢出利用调试-爱代码爱编程

0x01 堆的工作原理 实验环境: 推荐使用环境备注操作系统Windows2000虚拟机分配策略对操作系统非常敏感编译器Visual C++ 6.0默认编译选项编译选项默认编译选项VS2003/VS2005的GS选项将导致实验失败build 版本releaseVS2003/VS2005的GS选项将导致实验失败调试器Ollydbg需要配置Make Oll

《0day安全》堆溢出利用(上)——DWORD SHOOT-爱代码爱编程

堆溢出利用原理 溢出利用的精髓就是用精心构造的数据去溢出下一个堆块的块首,改写块首中的前向指针(flink)和后向指针(blink),然后在分配、释放、合并等操作发生时伺机获得一次向内存任意地址写入任意数据的机会。 我们把这种能够向内存任意位置写入任意数据的机会称为“DWORD SHOOT”。注意:DWORD SHOOT 发生时,我们不但可以控制射击的目

《0day安全》堆溢出利用(下)——代码植入-爱代码爱编程

常用狙击目标(xp sp1前) 与栈溢出中的“地毯式轰炸”不同,堆溢出更加精准,往往直接狙击重要目标。精准是DWORD SHO OT 的优点,但“火力不足”有时也会限制堆溢出的利用,这样就需要选择最重要的目标用来“狙击”。  1.内存变量:修改能够影响程序执行的重要标志变量,往往可以改变程序流程。(比如改了绕过身份验证)  2.代码逻辑:修改代码段重要函

《0day安全》堆溢出利用(上) DWORD SHOOT-爱代码爱编程

堆溢出利用的精髓就是用精心构造的数据去溢出下一个堆块的块首,改写块首中的前向指针(flink)和后向指针(blink),然后在分配、释放、合并等操作发生时伺机获得一次向内存任意地址写入任意数据的机会。 我们把这种能够向内存任意位置写入任意数据的机会称为“DWORD SHOOT”。 在调试中体会“DWORD SHOOT” 代码 #include <

dword 占用多少信_堆溢出 对DWORD SHOOT的原理进行简单了解-爱代码爱编程

代码 #include main() { HLOCAL h1, h2,h3,h4,h5,h6; HANDLE hp; hp = HeapCreate(0,0x1000,0x10000); h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8); h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,

dword 占用多少信_利用DWORD SHOOT实现堆溢出的利用(先知收录)-爱代码爱编程

原文链接:https://xz.aliyun.com/t/4009 1.0 DWORD SHOOT是什么捏? DWORD SHOOT指能够向内存任意位置写入任意数据,1个WORD=4个bytes,即可以通过执行程序将4bytes的数据写入4bytes地址中,从而实现某种恶意操作。 是不是还不清晰咩? emmm,通过下面这个完整的堆溢出利用例子进

hitcon_ctf_2019_one_punch(libc2.29 tcache tashing unlink)_nqoinaen的博客-爱代码爱编程

目录: 程序分析:漏洞点:解题思路:解题步骤:0x01 tcache tashing unlink 绕过后门检测:0x02 用后门功能读取flag: gdb调试出add rsp,48?完整exp: 程序分析

堆溢出dword shoot原理_dwordshoot原理-爱代码爱编程

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