实验内容:修改程序执行流程
引用书的原话:”用键盘输入字符的ASCII表示方位有限,很多值(如0x11、0x12等符号)无法直接用键盘输入,所以我们把实验的代码做了下改动,将程序的输入改由文件读取出字符串“
源码贴出:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define PASSWORD "1234567"
int verify_password(char *password)
{
int authenticated;
char buffer[8];
authenticated = strcmp(password,PASSWORD);
strcpy(buffer,password);//over flowed here!!!
return authenticated;
}
void main()
{
int valid_flag = 0;
char password[1024];
FILE *fp;
if(!(fp=fopen("password.txt","rw+"))) //判断文件是否存在
{
exit(0); //不存在则直接exit出程序
}
fscanf(fp,"%s",password); //从password.txt读取字符串,参数为文件指针,读取类型等..
valid_flag = verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n");
}
else
{
printf("Congratulation! You have passed the verifycation!\n");
}
fclose(fp);
}
直接修改上个笔记的password进行修改这里使用ultraedit进行编写:
在verify_password函数指令中的strcpy后下段,此时已经完成了打开password.txt并且读出内容,把那个且放到buffer里面了,转到OD看下栈情况:
可以看到,我们已经成功修改了返回地址,让程序运行,测试下是否成功跳转:
跳转是成功了,不过我忘了修改了源码,我们重新定位下跳出成功验证的指令地址
小尾存放,是1F 11 40 00
结果:
我们已经成功了修改了流程,本来的返回地址应该是
F9执行完后终端可以看到,
以上实验结束,经过我们的修改,已经成功地修改了程序流程,使其直接跳转到我们的指令地址(即弹出验证成功的信息)