第一个缓冲区溢出的实现(1)

前言

这里的内容是根据我之前学习的0day安全:软件漏洞分析技术来写的,记得两三年前刚买这本书的时候,有很多都看的不太理解,现在重新来学习,别是一番滋味.

  • 什么叫缓冲区溢出,它的原理是什么?

通常往程序的缓冲区里面所填充的数据超过了缓冲区的长度,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的.造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数.

准备工作

1.设置为release
这里写图片描述
2.右击—>属性
这里写图片描述
这里写图片描述
3.c/c++—>优化–>优化(已禁用)

4.链接器–>高级—>数据执行保护(DEP)—>否

5.c/c++—->代码生成—>安全检查—>禁用安全检查

6.链接器–>高级—>随机基址–>否(关掉它是因为要保证每次缓冲区的地址不变,
如果没有关掉,那么每次给栈分配的地址都不一样,缓冲区地址也不一样!!!)
生成exe,运行起来

源代码:

#include "stdafx.h"

#include <windows.h>
#define  PASSWORD "15PB"

int VerifyPassword(char* pszPassword, int nSize)
{
    char szBuffer[50];
    memcpy(szBuffer, pszPassword, nSize);
    return strcmp(PASSWORD, szBuffer);
}
int main()
{
    int nFlag = 0;
    char szPassword[0x200];
    FILE*fp;
    LoadLibraryA("user32.dll");
    if (NULL == (fp = fopen("password.txt", "rb")))
    {
        MessageBoxA(NULL, "打开文件失败", "error", NULL);
        exit(0);
    }
    fread(szPassword, sizeof(szPassword), 1, fp);
    nFlag = VerifyPassword(szPassword, sizeof(szPassword));
    if (nFlag)
    {
        printf("密码错误\n");

    }
    else  printf("密码正确\n");
    fclose(fp);
    system("pause");
    return 0;
}

这两个地方都要有.txt文件
这里写图片描述
这里写图片描述
.txt文件中内容:
这里写图片描述
运行程序会发现程序崩溃:
这里写图片描述
通过事件查看器查看:
这里写图片描述
说明在下图中附近:
这里写图片描述
修改成:(为了锁定在具体在哪里)
这里写图片描述
重新生成一下:
这里写图片描述
0x62对应的是b的ASCII码
说明在text文件中bbbb那边!!!
直接将txt拖到010里面,
这里写图片描述
改成Hex格式:(在此之前获得MessageBoxA地址:CTRL+G—>搜索MessageBoxA,(找到之后,按空格键就会显示CALL 75E3FAA0)—–>获得其地址: 75E3FAA0)
这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
用此时MessageBoxA的地址覆盖缓冲区的返回地址,用0填充了MEssageBoxA后面的数值,原来值为形参,现在将0当做是它的参数了
再次运行一波:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/richard1230/article/details/79929296