缓冲区溢出漏洞利用--调用白板Messagebox函数两次

//******有漏洞的程序*************
//漏洞函数VerifyPassword 由于文件大小是可变的 但是szBuffer大小只有50 当文件大小大于50的
//时候就会产生缓冲区溢出的异常 我们就可以利用这个异常溢出到函数返回地址 达到执行我们代码的目的
#include<windows.h>
#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;
}

编译环境配置:Release版,关闭优化,关闭安全检查(GS),关闭数据执行保护(DEP),关闭随机基址(ASLR)

看源代码可知 接收文件的缓冲区大小为50 我们文件数据只要大于50就可以实现缓冲区溢出

用段有规律的连续字符去构造一个明显可以溢出的文件

A0A1A2A3A4A5A6A7A8A9B0B1B2B3B4B5B6B7B8B9C0C1C2C3C4C5C6C7C8C9D0D1D2D3D4D5D6D7D8D9E0E1E2E3E4E5E6E7E8E9F0F1F2F3F4F5F6F7F8F9G0G1G2G3G4G5G6G7G8G9H1H2H3H4H5H6H7H8H9I0I1I2I3I4I5I6I7I8I9J0J1J2J3J4J5J6J7J8J9K0K1K2K3K4K5K6K7K8K9

现在直接运行程序 程序就会崩溃  

此电脑->右键->管理->事件查看器->Windows日志->应用程序  查看我们的程序崩溃的信息

配合OD调试 可以看到 在函数ret的时候 返回地址是0x39433843  ASCII码是C8C9 也就是说把我们那串有规律的连续字符C8C9改为我们要执行函数的代码即可执行我们的代码

 

 现在使用messagebox去测试一下 首先用OD找到函数的地址 找到messagebox的地址为0x77092d90 调用两次messagebos

双击程序 就会调用两次messagebox函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值