溢出漏洞原理及利用(1)

本文介绍了溢出漏洞的基本原理,通过一个简单的Windows程序示例,演示了如何利用溢出导致程序崩溃,并通过查看事件查看器的崩溃日志来定位错误。通过手动修改输入,确认了溢出的发生位置。最后,使用x32dbg调试器验证了溢出导致返回地址被覆盖的状况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

溢出漏洞原理及利用

本文是作者学习过程的笔记整理而来的,如有错误,还请见谅!

实验环境

  • Windows 10
  • Visual Sutdio 2015
  • x32dbg(x64dbg)
  • *010Editor

实验目的

  • 学习溢出漏洞的原理
  • 学会手工查看程序崩溃日志
  • 利用程序的溢出漏洞执行自己的代码

编写一个简单的有溢出漏洞的程序

代码:

// ConsoleApplication_shellcode.cpp : 定义控制台应用程序的入口点。
//即与ConsoleApplication_shellcode.exe是一个程序

#include "stdafx.h"
#include<windows.h>

int VerifyPassword(char* pszPassword,int nSize)
{
    char szBuffer[50]={0};
    memcpy(szBuffer, pszPassword, nSize);
    return strcmp("Hades", szBuffer);
}

int main()
{
    int nFlag = 0;
    char szPassword[0x200] = {0};
    FILE* fp;
    LoadLibraryA("user32.dll");
    if (NULL == (fp = fopen("password.txt", "rb")))
    {
        MessageBoxA(NULL, "Open File Fail", "error", NULL);
        exit(0);
    }
    fread(szPassword, sizeof(szPassword), 1, fp);
    nFlag = VerifyPassword(szPassword, sizeof(szPassword));
    if (nFlag)
    {
        printf("password err\n");
    }
    else
    {
        printf("password ok\n");
    }
    fclose(fp);
    system("pause");
    return 0;
}

项目设置:
为了程序忽视警告正常生成,也为了之后测试方便,需要配置一下项目环境
这里写图片描述
这里写图片描述
这里写图片描述
编译运行:
代码完成,项目设置完成,直接编译成exe
运行前新建一个password.txt,打开其输入一些字符,双击测试exe
这里写图片描述
程序崩溃(自己故意写的崩溃代码,这效果是当然正常.其实崩溃在函数返回),一个有溢出漏洞的测试程序完成.

查看程序崩溃日志,找到崩溃点

查看日志
打开 控制面板-管理工具-事件查看器-Windows日志-应用程序
找到崩溃程序的日志,查看信息如图
异常代码:0xC0000005—————表示内存访问异常
异常错误偏移量:0x38383838—–即输入的8888的ASCII码
这里写图片描述
定位错误
为了定位错误,把文本改为如下图字符串
(中途VS程序出现问题,重新又写了一次源程序,所以程序名称有点不一样,实际
ConsoleApplication_bug.exe==ConsoleApplication_shellcode.exe):
这里写图片描述
再次运行程序,查看崩溃日志
这里写图片描述
找到password.txt中的0xE3E4处,改成1111测试
这里写图片描述
错误偏移量正好是1111的ASCII码,所以正确定位到了错误地址处.
调试验证
使用x32dbg调试器打开程序验证刚才测试的溢出地址
这里写图片描述
执行过memcpy函数
这里写图片描述
栈中的地址数据为0x31313131.
所以验证正确.memcpy函数拷贝字节过多,淹没了VerifyPassword函数栈中的返回地址.所以返回时找不到错误数据地址中的代码.(如果地址为系统领空,系统拒绝访问,自然报异常0xC0000005)
这就是一个简单的例子,也是溢出漏洞的产生原理

PS:
本来是个很长的文章,后边会简单说利用这个溢出地址执行一些简单代码.但是今天很晚了,明天写在下一篇文章里吧
第一次写博客文章.跟笔记不一样,总是改改改.大家见谅.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值