-
-
[原创]漏洞分析入门(一)
-
发表于:
2018-11-20 11:52
4636
-
代码来源于 0day安全:软件漏洞分析技术。帖子主要说一说 分析心得和编译环境与书中环境不一样的时候遇到的问题的解决方法。大佬勿喷,新手可以看看
系统:win7 sp1
编译器:vs2015
// Crack1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#define PASSWORD "1234567"
int verify_password(char *password)
{
// verify_password 栈示意图
//| ---------- |
//| ---------- |
//| ---------- |
//| ---------- | ebp-c buffer
//| ---------- |
//| ---------- | ebp-4 authenticated
int authenticated;
char buffer[8];
authenticated = strcmp(password, PASSWORD);
strcpy(buffer, password);
return authenticated;
}
int main()
{
int valid_flags = 0;
char password[1024];
while (true)
{
printf("please input password: ");
scanf("%s", password);
valid_flags = verify_password(password);
if (valid_flags)
{
printf("incorrect password\r\n");
}
else
{
printf("right password\r\n");
break;
}
}
system("pause");
return 0;
}
该实例中主要原理是用 strcpy(buffer, password) 会导致buffer溢出,从而修改authenticated来达到修改返回值的目的。
从代码中可以看出 buffer=ebp-c 大小8个字节 authenticated = ebp-4. 当password长度>7的时候buffer就会溢出。由于字符串结尾是个null,所以当
password=8的时候 结束符null刚好覆盖了authenticated的地位从而达到修改了 返回值的目的。 例如输入 qqqqqqqq
代码编译时要注意的问题。 基本运行时检查 改为默认值, 安全检查:禁用gs 。否则会出现buffer和authenticated不是临近内存,溢出后报错的问题
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!