windows2000 堆溢出 利用原理
源于0day安全一书
1.堆的分配原理
申请堆空间 HANDLE address = HeapCreate(0,0x1000,0x10000)
address就是堆的地址
在address+0x178 偏移处,是空表(用于管理堆的申请释放,里面都是空闲的堆)

空表的结构(书上的):

解释一下:free是一个指针数组(数组里面全是指针,可以理解为 Node * 类型的指针,其实就是前后堆的地址)
指针类型是自定义的数据结构 ,大概像这样:
stuct Node
{
Node * flink; //指向上一个Node,这个就是堆的地址
Node * blink; //指向下一个Node,这是另一个堆的地址
};
简单一点:free里面每一项都是一个地址,通过这个地址能找到一个8字节的数据(Node),在这8字节数据中,前4字节和后4字节都是地址(地址里面保存的是别的Node的地址)。然后互相保存地址,就形成了双向链表。
free数组每一项保存的虽然都是地址,但是堆的地址是分大小的。看图可得,每一项指向多大的堆。
如果空表里面一项是空的(没有合适大小的堆),那么它保存的两个地址都是自己。
空闲堆的结构:

在堆溢出中有用的就这几个:
self Size :堆大小(一个单位是8字节,而且要算上block head大小)
Flags:状态
Flink in freelist:前一个的地址 Blink in freelist:后一个的地址
这就是free[0]指向的堆,就这一个堆:

因为没有别的堆了,所有两个地址均指向0x520178,就是free[0]
当使用 HLOCAL h1 = HeapAlloc(address,HEAP_ZERO_MEMORY,8);申请8字节堆空间。
之前保存地址的位置变成0了,堆就从这里开始保存填数据。
(这是非调试态的堆)

如果再 HeapFree(address,0,h1);把这个堆释放了。它又会在块头(见图block head)后面加上空表指针,嵌入free[2]形成新的链表
2.错误
在空表中,因为空间申请,导致节点的卸下,引起重新赋值,而这赋值是以块的多层指针来实现的,如果该块保存的指针被改了,就出现错误的赋值

注意了:上图的(node->)等都是说的中间大大的Node
假设待分配的块的两个地址(blink,flink指向的地址)被修改为:d1,d2
会发生 [d1+4] = d2 , [d2] = d1; (前提是这两个地址必须可读可写,不然会报错)
结果就是可以让两个指定地址交换数据。
3.利用
一切都是在windows2000才成立,其他版本我还没学!!
原理:程序退出时会调用ExitProcess()
ExitProcess()将调用 RtlEnterCriticalSection() ,调用该函数是通过指针,保存该函数指针的地址是固定的,就是[PEB+0x20].
即 0x7FFDF020 ,这个地址保存的就是RtlEnterCriticalSection的函数指针(或者说地址)
如果在0x7FFDF020中填入另外的地址,那么它就会执行指定的地址。
过程:
利用memcpy函数,当拷贝的大小超过了堆的大小,会淹没掉后面空闲推的空表指针(其中就包括地址)。


shellcode的首地址就是0x520688, 在shellcode[208]处填入shellcode地址与RtlEnterCriticalSection() 地址,
将使得 [0x7FFDF020 ] = 0x520688,ExitProcess()想调用RtlEnterCriticalSection()时就跳到了shellcode处执行我们构筑好的代码。
构建好的shellcode(从5030h - 覆盖空表指针)

EB 04 跳过四个字节(因为四个字节将被0x7FFDF020覆盖,前面说了覆盖是双向的,书上并没有这么做,因为如果仅仅运行测试这点代码,不会有影响,但实际情况是不确定的)0x7FFDF020将被翻译成如下指令:

当运行到shellcode时,需要把RtlEnterCriticalSection()的地址写回去,不然要出错

MOV EAX,7FFDF020 "\xB8\x20\xF0\xFD\x7F"
MOV EBX,77F89103(这个不是固定的,得看0x7FFDF020原来保存的指针 ,自己找) "\xBB\x03\x91\xF8\x77"
MOV [EAX],EBX "\x89\x18"
其他都是shellcode,实现了弹个框。
windows2000 堆溢出 利用原理的更多相关文章
- 旧书重温:0day2【10】第五章 堆溢出利用2
好久没有发帖子啦!最近一直很忙!但是还是抽空学习啦下! 前段时间匆匆忙忙的把0day2上的堆溢出实验做啦! 可能当时太浮躁啦,很多细节没注意!结果:实验结果很不满意!所以就有啦这一篇!! 上一篇是发布 ...
- Windwos堆管理体系以及溢出利用
<0day安全>学习笔记,主要讨论WIndows2000~WIndowsSP1平台的堆管理策略. 0X01 堆与栈的区别 栈空间是在程序设计时已经规定好怎么使用,使用多少内存空间.典型的栈 ...
- 利用DWORD SHOOT实现堆溢出的利用(先知收录)
原文链接:https://xz.aliyun.com/t/4009 1.0 DWORD SHOOT是什么捏? DWORD SHOOT指能够向内存任意位置写入任意数据,1个WORD=4个bytes,即可 ...
- linux下堆溢出unlink的一个简单例子及利用
最近认真学习了下linux下堆的管理及堆溢出利用,做下笔记:作者作为初学者,如果有什么写的不对的地方而您又碰巧看到,欢迎指正. 本文用到的例子下载链接https://github.com/ctfs/w ...
- Linux 堆溢出原理分析
堆溢出与堆的内存布局有关,要搞明白堆溢出,首先要清楚的是malloc()分配的堆内存布局是什么样子,free()操作后又变成什么样子. 解决第一个问题:通过malloc()分配的堆内存,如何布局? 上 ...
- 堆溢出学习笔记(linux)
本文主要是linux下堆的数据结构及堆调试.堆溢出利用的一些基础知识 首先,linux下堆的数据结构如下 /* This struct declaration is misleading (but a ...
- Linux堆溢出漏洞利用之unlink
Linux堆溢出漏洞利用之unlink 作者:走位@阿里聚安全 0 前言 之前我们深入了解了glibc malloc的运行机制(文章链接请看文末▼),下面就让我们开始真正的堆溢出漏洞利用学习吧.说实话 ...
- 【转载】利用一个堆溢出漏洞实现 VMware 虚拟机逃逸
1. 介绍 2017年3月,长亭安全研究实验室(Chaitin Security Research Lab)参加了 Pwn2Own 黑客大赛,我作为团队的一员,一直专注于 VMware Worksta ...
- vmware漏洞之一——转:利用一个堆溢出漏洞实现VMware虚拟机逃逸
转:https://zhuanlan.zhihu.com/p/27733895?utm_source=tuicool&utm_medium=referral 小结: vmware通过Backd ...
随机推荐
- java并发初探ThreadPoolExecutor拒绝策略
java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...
- python学习笔记(三)---高级特性
一.切片 取无数多个list元素 不用一个个取得笨方法就用切片 对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作. 对应上面的问题, ...
- JavaScript之this的用法
本文我们介绍下js中this的用法. 由上图可得,默认this指向window,而在node.js中this默认指向global. 由上图可得: 1.原型链为o->MyClass.prototy ...
- 「CF600E」Lomsat gelral
传送门 Luogu 解题思路 线段树合并板子题(也可以 dsu on the tree) 好像没什么好讲的,就是要注意开 long long . 细节注意事项 咕咕咕 参考代码 #include &l ...
- LR的深入理解资料汇集
今天面试被问到LR的算法的梯度和正则化项,自己不太理解,所以找了一些相关资料,发现LR的算法在梯度下降,正则化和sigmoid函数方面都有很深的研究,期间也发现一些比较好的资料,记录一下. 这篇论文推 ...
- Spring声明式事物原理分析
基础准备 pom <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...
- 用 k8s 运行一次性任务【转】
容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...
- HihoCoder第四周:Trie图
第四周的题目是前两周的综合,综合在一个是KMP算法的思想,一个是树的这么一个数据结构. 题目 : Trie图 输入 每个输入文件有且仅有一组测试数据. 每个测试数据的第一行为一个整数N,表示河蟹词典的 ...
- Timer(阿里CTF)
下载文件之后发现是.apk类型文件,于是百度搜索了一下推荐再电脑上安装安卓模拟器,都尝试了一下逍遥安卓是真的不好用,小白觉得还是BlueStacks好用一些,下载之后去安装打开就看到了, 什么都没有发 ...
- 程序员如何 10 分钟用 Python 画出蒙娜丽莎?
之前看到过很多头条,说哪国某人坚持了多少年自学使用excel画画,效果十分惊艳.对于他们的耐心我十分敬佩. 但是作为一个程序员,自然也得挑战一下自己. 这种需求,我们十分钟就可以完成! 基本思路 ...