首页
论坛
专栏
课程

[原创]看雪ctf—流浪者

2019-3-19 19:48 355

[原创]看雪ctf—流浪者

2019-3-19 19:48
355

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



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


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


双击字符串,可以在程序中找到这串字符


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


按F5查看伪代码


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


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


可以看到这里通过对用户输入的判断以及运算返回一个值v5,这个值将传给上面的a1。

经过对伪代码的分析,我写了下面一段C程序解出flag,仅供参考。

 

#include<stdio.h>    
int main(){ 
char a[]="KanXueCTF2019JustForhappy";
char b[]="abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ";     
int c[25];   
int i;int j;   
for(i=0;i<sizeof(a);i++){     
       for(j=0;j<sizeof(b);j++){    
             if(a[i]==b[j])    
              c[i]=j;                      
       }                   
}//计算每个字符在字符串中的位置   
int x;               
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");        
return 0;            
}     

    


[公告][征集寄语] 看雪20周年年会(12.28上海) | 感恩有你,一路同行

最新回复 (0)
游客
登录 | 注册 方可回帖
返回