BypassDEP(数据执行保护)

介绍

DEP的主要作用是阻止数据页(默认的堆,栈以及内存池页)执行代码。用来弥补计算机对数据和代码混淆这一天然缺陷的。
DEP 的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入 shellcode 时,
程序会尝试在数据页面上执行指令,此时 CPU 就会抛出异常,而不是去执行恶意指令。

Vs设置DEP

在使用VS编译的时候也有DEP选项。(VS2019示例)默认情况下是开启的。
通过右键单击项目属性–>链接器–>高级–>DEP保护。

目标程序

#include<windows.h>
#include<tchar.h>
#include <iostream>
#define PASSWORD "1234"
void* VerifyPassword(byte* pRet, void* pszPassword, int nSize) {
    char szBuffer[50] = { 0 };
    *pRet = strcmp(PASSWORD, (char*)pszPassword);
    return memcpy(szBuffer, pszPassword, nSize); //通过拷贝溢出
}
int _tmain(int argc, _TCHAR* argv[]) {
    void* pszPassword = NULL;
    int   nFileSize = 0;
    byte  bFlag = FALSE;
    FILE* fp;
    LoadLibraryA("user32.dll");
    if (fopen_s(&fp, "password.txt", "rb")) {
        MessageBoxA(NULL, "打开文件失败", "error", NULL);
        return 0;
    }
    fseek(fp, 0, SEEK_END);
    nFileSize = ftell(fp) + 1;
    rewind(fp);
    pszPassword = ZeroMemory(malloc(nFileSize), nFileSize);
    fread(pszPassword, nFileSize, 1, fp);
    VerifyPassword(&bFlag, pszPassword, nFileSize);
    if (bFlag) printf("密码错误\n");
    else       printf("密码正确\n");
    fclose(fp);
    system("pause");
    return 0;
}

BypassDEP

由于程序开启了数据执行保护导致无法再栈执行代码,是因为栈上没有执行权限,所以我们调用virtualProtect函数来更改权限即可

//函数原型

BOOL VirtualProtect
(
LPVOID lpAddress, // 目标地址起始位置
DWORD dwSize, // 大小
DWORD flNewProtect, // 请求的保护方式
PDWORD lpflOldProtect // 保存老的保护方式
);

问题是该如何调用此函数,只能通过碎片化执行程序,在栈上放零散的我们需要执行指令的地址,利用ret就可以跑到程序原有的指令上,完成我们需要的功能

我们要完成的功能是调用 VirtualProtect函数 利用寄存器在栈上构建调用函数的栈环境,使用碎片化执行代码完成对寄存器的赋值,最后pushad即可入栈

执行pushad以后寄存器入栈顺序

所以我们如下安排寄存器的赋值

EDI    溢出点
ESI     VirtualProtect 
EBP    VirtualProtect 函数的返回地址
ESP    lpAddress
EBX     dwSize
EDX    flNewProtect
ECX    lpflOldProtect 
EAX     9090      //滑板指令
shellcode

接下来构建碎片化指令给寄存器赋值 EDI是溢出点 也就是返回地址 因为要给edi赋值所以 要找到

pop edi ret的指令 规律就是一句指令一句数据 

 程序测试

利用返回地址 执行我们构建好的碎片代码

 

 以此类推....................

寄存器入栈 构建执行virtualprotect函数的栈环境 

 

 返回地址的指令 直接跳到栈顶执行代码

 当前栈顶 执行自己的shellcode

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值