欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oday安全:软件漏洞分析技术第二章例子_1

程序员文章站 2024-03-11 22:15:43
...

在0例子的基础上植入代码:

首先要植入的代码存在password.txt文件中,通过文件读取进入进程内存

其次利用verify_password( )函数中的strcpy把读取到的文件内容(包含要植入的代码)拷贝到buffer内存中

最后找到buffer(植入的代码处于buffer的起始位置)的地址,用这个地址覆盖掉调用verify_password( )函数之后的返回地址,就会执行我们的代码了

1、我们要植入的汇编代码,对应16进制如下图:

oday安全:软件漏洞分析技术第二章例子_1oday安全:软件漏洞分析技术第二章例子_1

注意上面连续0x90:

第一个连续4字节0x90:需要填入MessageBoxA( )函数地址,

第二个连续3字节0x90:补齐我们植入的代码,使其是4字节的整数倍

第三个连续8字节0x90:覆盖authenticated局部变量和用来保存main函数的ebp

第四个连续4字节0x90:需要填入verify_password( )函数中buffer的地址或者main函数中password的地址(两者地址不同,值一致)

2、C代码如下,buffer改为32字节,main函数中加载user32.dll库LoadLibraryA("user32.dll")

#include <stdio.h>
#include <Windows.h>

#define PASSWORD "123456"

int verify_password(char * password)
{
	int authenticated;
	char buffer[32];
	authenticated=strcmp(password,PASSWORD);
	strcpy(buffer,password);
	return authenticated;
}
int main()
{
	int valid_flag=0;
	char password[1024];

	LoadLibraryA("user32.dll");
	FILE * fp=NULL;
	if( !(fp=fopen("D:\\password.txt","r")) )
	{
		printf("open file fail!\n");
		exit(0);
	}
	fscanf(fp,"%s",password);
	fclose(fp);
	fp=NULL;

	valid_flag=verify_password(password);
	if(valid_flag)
		printf("incorrect password!\n");
	else
		printf("Congratulation! You have passed the verification!\n");

	system("pause");
	return 0;
}

3、编译生成debug版本,记得编译选项:

基本运行时检查:默认值(就是两者都不用)

缓冲区安全检查:否

4、od调试找到buffer地址或者password地址和MessageBoxA地址

oday安全:软件漏洞分析技术第二章例子_1

oday安全:软件漏洞分析技术第二章例子_1

buffer地址:0x0012FAE4   

password地址:0x0012FB64

(两处的内存是一样的,用哪个地址都可以)

MessageBoxA地址:0x77D507EA

5、把两个地址填入password.txt文件对应处

oday安全:软件漏洞分析技术第二章例子_1

6、调试

返回到0x12FB64地址代码(我们植入的代码)

oday安全:软件漏洞分析技术第二章例子_1

转到我们植入的代码并弹出消息框

oday安全:软件漏洞分析技术第二章例子_1