老样子,先把文件放进ida里面,
先找到含有flag的可疑函数Decry(字符串搜索ALT+T即可):
发现使用Decry函数的是main函数(右边函数列表可以查看到),并按空格查看图形化格式,并对main进行解析φ(* ̄0 ̄) (Ps:此题解不解析main函数其实都无伤大雅)
发现flag就藏在Decry函数中,打开此函数:
由函数得知,text最终会和str2比较。
text是由key3和v9合成而来。
str2是由输入的flag+key加密得到。
key是由key1和src合成而来。
-
src和v9均可以用脚本得到:
得出src为“SLCDN”,v9为“wodah”。 -
key3以及key1,均可以寻地址找到值,其分别为
key3为“kills”,key1为“ADSFK”
-
将text和key合成,得到如下:
text为“killshadow”,key为“ADSFKNDCLS”
这里为什么后面是反着拼接呢?据说是根据存储和读取的方式有关系,我也是后面flag怎么都不对,才发现的,(((φ(◎ロ◎;)φ))) -
下面一段函数,是将key化成小写:
-
最后一段,就是根据后面的while循环,写一段脚本。
#include<bits/stdc++.h>
using namespace std;
const int MX=1e5+9;
char text[11]="killshadow";
char key[11]="adsfkndcls";
char s[11];
int main()
{
for( int i=0 ; i<10 ; i++ ){
int pos=text[i]-97;
for( int j=0 ; j<8 ; j++ ){
int p=j*26+pos;
p=p-97+39+key[i];
if( 65<=p && p<=90 ) {
printf("%c",p);
break;
}
if( 97<=p && p<=122 ){
printf("%c",p);
break;
}
}
}
return 0;
}
输出就是答案了。
仔细看看这个while算法,其实这里的v3完全可以看做是v2,简单一点说,就是正着怎么来得,怎么倒着给它弄回去,关于mod的问题,这里假设还给了它j个26。
其实这题主要难的,还是那个字符串反着装的问题。第一次见,(((φ(◎ロ◎;)φ)))