1.将输入数据长度再次增大,使其溢出到覆盖函数返回地址
输入4321432143214321431:
此时0019FAD4已经被覆盖,正常情况下,函数返回retn执行时,栈顶元素刚好是返回地址,retn指令将返回地址压入到指令寄存器EIP中。由于找不到有效的指令地址,程序奔溃。若是这个将这个返回地址设置为有效的地址,程序就会跳转到设定的返回地址处执行。
报错:
2.指定函数返回地址
将输入保存在.txt文件中,使用16进制编辑器修改输入值,完成指定返回地址设置。
将返回地址设置为通过验证congratultions:
成功:
注意:password.txt保存位置,fopen时权限设置。
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define PASSWORD "1234567";
int verify(char *password)
{
int authenticated; //注意authenticated,buffer[]声明位置
char buffer[8];
authenticated = strcmp(password, "1234567");
strcpy(buffer, password);//创造栈溢出的条件
return authenticated;
}
int main()
{
int valid_flag = 0;
char password[1024];
FILE *fp;
fp=fopen("password.txt","rw+");
if(!fp)
{
exit(0);
}
fscanf(fp,"%s", password);
valid_flag = verify(password);
if (valid_flag)
{
printf("incorrect!");
}
else
{
printf("congratultions!");
}
system("pause");
fclose(fp);
}