oday安全:软件漏洞分析技术第二章例子_1
在0例子的基础上植入代码:
首先要植入的代码存在password.txt文件中,通过文件读取进入进程内存
其次利用verify_password( )函数中的strcpy把读取到的文件内容(包含要植入的代码)拷贝到buffer内存中
最后找到buffer(植入的代码处于buffer的起始位置)的地址,用这个地址覆盖掉调用verify_password( )函数之后的返回地址,就会执行我们的代码了
1、我们要植入的汇编代码,对应16进制如下图:
注意上面连续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地址
buffer地址:0x0012FAE4
password地址:0x0012FB64
(两处的内存是一样的,用哪个地址都可以)
MessageBoxA地址:0x77D507EA
5、把两个地址填入password.txt文件对应处
6、调试
返回到0x12FB64地址代码(我们植入的代码)
转到我们植入的代码并弹出消息框
上一篇: 牛客网华为机试【密码验证合格程序】
下一篇: 浅谈Java中强制类型转换的问题