看雪ctf—流浪者 – 作者:凯信特安全团队

下载题目得到一个MFC程序,打开看一下有一个窗口。任意输入一串字符串看一下返回结果貌似没啥用。

图片.png图片.png通过IDA打开该程序,打开字符串窗口(如果是有字符串的程序,搜索字符串最便捷)

图片.png看到这两个字符串很可疑,感觉可以从这找到突破点

图片.png双击字符串,可以在程序中找到这串字符

图片.png选择字符串,键盘输入“x”查看交叉引用

图片.png按F5查看伪代码

图片.png这段伪代码的意思是通过接收一个变量a1来控制数组aAbcdefghiabcde的角标获取数组中的字符并赋值给Str1,通过Str1与字符串“KanXueCTF2019JustForhappy”进行比较,如果相同则返回pass!

图片.png理清了思路,现在只要求出控制这串字符串的变量a1即可解出此题。所以我们继续向上找寻sub_4017F0这个函数,按“x”查看在哪引用了这个函数

图片.png

可以看到这里通过对用户输入的判断以及运算返回一个值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: 凯信特安全团队

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论