堆溢出 对DWORD SHOOT的原理进行简单了解

2023-11-20 16:40

本文主要是介绍堆溢出 对DWORD SHOOT的原理进行简单了解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码

#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//break the processHeapFree(hp,0,h1);HeapFree(hp,0,h3);HeapFree(hp,0,h5); _asm int 3h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);return 0;
} 

实验目的

简单理解DWORD SHOOT

实验准备

环境:windows xp
编译器:vc++
调试器:OD

实验过程

1.根据之前动调空表的经验直接找到申请的堆块的位置,六块申请了8个字节的空间,算上堆头8个字节,就相当于六块16个字节的内存,直接从尾块上面“切”下来。

在这里插入图片描述

2.释放奇数位的堆块,防止堆块合并
发现h1,h3,h5都链入了Freelist[2]

在这里插入图片描述
此时堆块的占用状况

NAMEFlag向前指针向后指针
h11 占用态0x003a06a8 (h3)0x003a0188(Freelist[2])
h20 空闲态NULLNULL
h31 占用态0x003a06c8 (h5)0x003a0688(h1)
h40 空闲态NULLNULL
h51 占用态0x003a0188(Freelist[2])0x003a06a8 (h3)
h60 空闲态NULLNULL

如果这时候对某一串数据的向前指针或是向后指针进行修改,那么就能使自己的shellcode成功的载入进程序里面.

MOV ECX,DWORD PTR DS:[EDI+0C]
MOV EAX,DWORD PTR DS:[EDI+8]
CMP EAX,ECX    
MOV DWORD PTR DS:[ECX],EAX
MOV DWORD PTR DS:[EAX+4],ECX

堆块的装载最后有类似以上的代码,如果将h3中的后向指针改为0x12345678前向指针改成0x11111111,那么最后执行链表拆卸的时候就是把0x12345678指向的东西移到前向指针的位置上。如果把这些地址换成shellcode的地址就成功装入程序了。
实际上堆块的分配、释放、合并操作都能引发 DWORD SHOOT,因为都涉及到了链表,只要修改指针就能导入恶意代码。

摘抄《0day安全》

这本书简单的介绍了一下溢出的攻击方式,感觉介绍的也比较全面,所以直接摘抄一手。
(1)内存变量:修改能够影响程序执行的重要标志变量,往往可以改变程序流程。例如,更改身份验证函数的返回值就可以直接通过认证机制。栈溢出时溢出的数据必须连续,而 DWORD SHOOT 可以更改内存中任意地址的数据。
(2)代码逻辑:修改代码段重要函数的关键逻辑有时可以达到一定攻击效果,例如,程序分支处的判断逻辑,或者把身份验证函数的调用指令覆盖为 0x90(nop)。
(3)函数返回地址:栈溢出通过修改函数返回地址能够劫持进程,堆溢出也一样可以利用DWORD SHOOT 更改函数返回地址。但由于栈帧移位的原因,函数返回地址往往是不固定的,甚至在同一操作系统和补丁版本下连续运行两次栈状态都会有不同,故 DWORD SHOOT 在这种情况下有一定局限性,因为移动的靶子不好瞄准。
(4)攻击异常处理机制:当程序产生异常时,Windows 会转入异常处理机制。堆溢出很容易引起异常,因此异常处理机制所使用的重要数据结构往往会成为 DWORD SHOOT 的上等目标,这包括 S.E.H、F.V.E.H、进程环境块中的 U.E.F 、线程环境块中存放的第一个S.E.H 指针。
(5)函数指针:系统有时会使用一些函数指针,比如调用动态链接库中的函数、C++中的虚函数调用等。改写这些函数指针后,在函数调用发生后往往可以成功地劫持进程。但可惜的是,不是每一个漏洞都可以使用这项技术,这取决于软件的开发方式。
(6)P.E.B 中线程同步函数的入口地址:天才的黑客们发现在每个进程的 P.E.B 中都存放着一对同步函数指针,指向 RtlEnterCriticalSection()和 RtlLeaveCriticalSection(),并且在进程退出时会被 ExitProcess()调用。如果能够通过 DWORD SHOOT 修改这对指针中的其中一个,那么在程序退出时 ExitProcess()将会被骗去调用我们的 shellcode。由于 P.E.B 的位置始终不会变化,这对指针在 P.E.B 中的偏移也始终不变,这使得利用堆溢出开发适用于不同操作系统版本和补丁版本的 exploit 成为可能。这种方法一经提出就立刻成为了 Windows 平台下堆溢出利用的最经典方法之一,因为静止的靶子比活动的靶子好打得多,我们只需要把枪架好,闭着眼睛扣扳机就是了。

这篇关于堆溢出 对DWORD SHOOT的原理进行简单了解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/395995

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

uva 10387 Billiard(简单几何)

题意是一个球从矩形的中点出发,告诉你小球与矩形两条边的碰撞次数与小球回到原点的时间,求小球出发时的角度和小球的速度。 简单的几何问题,小球每与竖边碰撞一次,向右扩展一个相同的矩形;每与横边碰撞一次,向上扩展一个相同的矩形。 可以发现,扩展矩形的路径和在当前矩形中的每一段路径相同,当小球回到出发点时,一条直线的路径刚好经过最后一个扩展矩形的中心点。 最后扩展的路径和横边竖边恰好组成一个直

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu