堆溢出 对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

相关文章

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#