常用狙击目标(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>