任务

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
void Attack()
{printf(“Hello!: - ) : - ) : - )\n”);
exit(0);
}
void fun()
{
char password[6] =”ABCDE”;
char str[6];
FILE *fp;
if(!(fp=fopen(“password.txt”,”r”)))
{
exit(0);
}
fscanf(fp,”%s”,str);
str[5]=’\0’;
if(strcmp(str,password)==0)
printf(“ok.\n”);
else
printf(“no.\n”);
}
int main()
{
fun();
return 0;
}
我们的目的是使该代码中的Attack()函数执行。

思路

通过分析main函数可以知道现在是不会执行Attack函数,那么我们就需要修改函数的返回地址对该函数进行执行。通常情况下一般是通过修改函数的返回地址对其他的函数进行调用。所以我们需要寻找Attack()函数的函数入口和fun函数的返回地址。

操作

将代码的exe文件放入IDA和OD中进行反编译。找到了Attack()函数的入口地址为00401500

下一步对fun函数的返回地址进行寻找ida中fun函数的retn汇编指令在地址004015AE,所以在OD中对该汇编指令设置断点,以完成对return地址的定位。


我们只要将return的地址改为00401500就可以完成目标,通过栈溢出的方法对return地址进行修改。将password.txt文件中的数据进行增加以达到栈溢出的效果。对fscanf函数进行利用,在OD中在fscanf函数后地址为00401579处设置断点。


将最后的8bit改为Attack()函数的地址,即可以对其Attack函数进行利用


得到结果