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

堆溢出比栈溢出更精准,通过修改内存变量、代码逻辑或函数指针实现攻击。本文聚焦于狙击P.E.B中的RtlEnterCriticalSection()函数指针,当程序退出时,通过ExitProcess调用我们的shellcode。通过DWORD SHOOT,当分配内存时,覆盖P.E.B中的函数指针,导致shellcode被执行。
摘要由CSDN通过智能技术生成

常用狙击目标(xp sp1前)

与栈溢出中的“地毯式轰炸”不同,堆溢出更加精准,往往直接狙击重要目标。精准是DWORD SHO OT 的优点,但“火力不足”有时也会限制堆溢出的利用,这样就需要选择最重要的目标用来“狙击”。
 1.内存变量:修改能够影响程序执行的重要标志变量,往往可以改变程序流程。(比如改了绕过身份验证)
 2.代码逻辑:修改代码段重要函数的关键逻辑有时可以达到一定攻击效果。(例如,程序分支处的判断逻辑,或者把身份验证函数的调用指令覆盖为 0x90(nop))
 3.函数的返回地址:由于栈帧的移动,函数返回地址不固定。是个移动靶,不好打。
 4.攻击异常处理机制:当程序产生异常时, Windows 会转入异常处理机制。
 5.函数指针
 6.PEB线程同步函数入口地址:每个进程的 P.E.B 中都存放着一对同步函数指针,指向 RtlEnterCriticalSection()和 RtlLeaveCriticalSection(),并且在进程退出时会被 ExitProcess()调用。如果能够通过 DWORD SHOOT 修改这对指针中的其中一个,那么在程序退出时 ExitProcess()将会被骗去调用我们的 shellcode。由于 P.E.B 的位置始终不会变化,这对指针在 P.E.B 中的偏移也始终不变,这使得利用堆溢出开发适用于不同操作系统版本和补丁版本的 exploit 成为可能。


狙击 P.E.B 中 RtlEnterCritical-Section()的函数指针

当进程退出时,ExitProcess要做很多善后工作,必须用到临界区函数RtlEnterCriticalSection和RtlLeaceCriticalSection来同步线程防止“脏数据”的产生。
Windows 2000在 0x7FFDF020 处存放着指向 RtlEnterCriticalSection()的指针,在 0x7FFDF024 处存放着指向 RtlLeaveCriticalSection()的指针。
本次实验以0x7FFDF024处的RtlEnterCriticalSection()指针为目标, 联系DWORD SHOOT 后,劫持进程、植入代码的全套动作。

#include "stdafx.h"
#include <windows.h>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值