首页
社区
课程
招聘
[原创]漏洞分析入门(一)
2018-11-20 11:52 4009

[原创]漏洞分析入门(一)

2018-11-20 11:52
4009
代码来源于 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不是临近内存,溢出后报错的问题




[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞3
打赏
分享
最新回复 (1)
雪    币: 1535
活跃值: (695)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
开花的水管 2018-11-21 09:57
2
0
短小精悍
游客
登录 | 注册 方可回帖
返回