64位,进入ida,查看字符串,
我是从这里跟进来的,进入主函数,有一堆putchar,一般来说,这就是输出的是flag,猜的,纯属猜测
进入字符看一看,注意后面的DATA XREF 就会发现.这些字符都用了同一个函数,但是有一个用的是另外一个,这个就很奇怪了对吧,就顺理成章的进去看一看发生了什么
sub_140013580
这里从下往上看 result == 607052314
然后 result = sub_140011384((unsigned int)dword_140021190)
猜测这个可能是一个加密的函数,----把dword_140021190 加密后成为result
就看一看 dword_140021190 是什么,结果这是个空的,啥也没有
那就看加密函数
很简单的一个加密,位运算,又知道了result的结果.就用爆破把他算出来
dword_140021190 输出结果位123456
后面跟着个for循环 ,byte_140021008 也是有的,就写个脚本看看输出了什么
结果是: flag{MD5(theNum)}
还是猜,数字,MD5加密,那数字可能就是刚刚算出来的123456
最后出啦,flag{e10adc3949ba59abbe56e057f20f883e}
脚本
#include <iostream>
using namespace std;
int main(){
int index = 0;
int a1=0,v5;
char flag[44];
char m[]={0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 0x4,
0x75, 0x68, 0x34, 0x28,0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D};
int result;
for(a1=0;a1<14549743;a1++){
v5=(a1 << 8) ^ (a1 >> 12);
v5*=291;
if ( v5 )
result = v5;
else
result = 987i64;
if(result == 607052314){
cout<<a1<<endl;
break;
}
}
for(int i=0;i<17;++i){
flag[i]=(char)a1 ^ (char)m[i];
index++;
}
flag[index] = '\0';
cout<<"结果是: "<<flag<<endl;
system("pause");
return 0;
}