oday安全:软件漏洞分析技术第三章例子_jmp esp

源代码在前面例子的基础上做一下修改:

1、buffer大小改为4字节(节省空间)

2、读取文件内容放弃fscanf( )函数,使用fread( )代替

代码如下:

#include 
#include 

#define PASSWORD "123456"

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

	LoadLibraryA("user32.dll");
	FILE * fp=NULL;
	if( !(fp=fopen("D:\\password.txt","rb")) )
	{
		printf("open file fail!\n");
		exit(0);
	}
	// fscanf函数读取文件全部内容有弊端
	fseek(fp, 0, SEEK_END);
	size=ftell(fp);
	fseek(fp, 0, SEEK_SET);
	fread(password,1,size,fp);
	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;
}

找到2处地址:

1、进程空间固有指令jmp esp的地址

在user32.dll库中搜索,运气好找到了,0x77D29353

oday安全:软件漏洞分析技术第三章例子_jmp esp_第1张图片

在od中确认,该地址下确实有指令jmp esp

2、ExitProcess函数地址:0x7C81D20A

password.txt文件内容修改如下:

oday安全:软件漏洞分析技术第三章例子_jmp esp_第2张图片

1、前12字节0x90用来覆盖buffer[4]、authenticated、上一个栈的ebp值

2、0x77D29353用来覆盖返回地址的值(即jmp esp指令地址)

3、0x77D507EA是MessageBoxA函数地址

4、0x7C81D20A是ExitProcess函数地址

一、编译程序生成pe文件

二、od调试:

1、strcpy执行前栈内容

oday安全:软件漏洞分析技术第三章例子_jmp esp_第3张图片

2、strcpy执行后栈内容

oday安全:软件漏洞分析技术第三章例子_jmp esp_第4张图片

3、ret返回到系统中固有的jmp esp指令

oday安全:软件漏洞分析技术第三章例子_jmp esp_第5张图片

4、执行jmp esp指令,注意esp值oday安全:软件漏洞分析技术第三章例子_jmp esp_第6张图片

5、跳转到指定代码处oday安全:软件漏洞分析技术第三章例子_jmp esp_第7张图片

 

关于使用fread函数替换fscanf函数,看下面2张图对比:

1、数据中间出现0x0A,内容没有被全部读取

oday安全:软件漏洞分析技术第三章例子_jmp esp_第8张图片

2、0x0A修改成0xAA,内容全部被读取

oday安全:软件漏洞分析技术第三章例子_jmp esp_第9张图片

结合fscanf(fp,"%s",password)代码中的%s,大概明白了吧!

你可能感兴趣的:(oday安全:软件漏洞分析技术)