下载题目得到一个MFC程序,打开看一下有一个窗口。任意输入一串字符串看一下返回结果貌似没啥用。
通过IDA打开该程序,打开字符串窗口(如果是有字符串的程序,搜索字符串最便捷)
看到这两个字符串很可疑,感觉可以从这找到突破点
双击字符串,可以在程序中找到这串字符
选择字符串,键盘输入“x”查看交叉引用
按F5查看伪代码
这段伪代码的意思是通过接收一个变量a1来控制数组aAbcdefghiabcde的角标获取数组中的字符并赋值给Str1,通过Str1与字符串“KanXueCTF2019JustForhappy”进行比较,如果相同则返回pass!
理清了思路,现在只要求出控制这串字符串的变量a1即可解出此题。所以我们继续向上找寻sub_4017F0这个函数,按“x”查看在哪引用了这个函数
可以看到这里通过对用户输入的判断以及运算返回一个值v5,这个值将传给上面的a1。
经过对伪代码的分析,我写了下面一段C程序解出flag,仅供参考。
#include<stdio.h>
intmain(){
chara[]=”KanXueCTF2019JustForhappy”;
charb[]=”abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ”;
intc[25];
inti;int j;
for(i=0;i<sizeof(a);i++){
for(j=0;j<sizeof(b);j++){
if(a[i]==b[j])
c[i]=j;
}
}//计算每个字符在字符串中的位置
intx;
for(i=0;i<25;i++){
for(j=48;j<=122;j++){
if(j>57||j<48){
if(j>122||j<97){
if(j>90||j<65)
continue;
else
x=j-29;
}
else
x=j-87;
}
else
x=j-48;
if(x==c[i])
printf(“%c”,j);//此处直接将ASCII码值转换为字符串
}
}
printf(“\n”);
return0;
}
来源:freebuf.com 2019-03-25 13:28:03 by: 凯信特安全团队
请登录后发表评论
注册