大端序 小端序
解题步骤
- 将得到的文件放入查壳工具中,可以看到是无壳64位程序
- 使用64位IDA打开,查看主函数伪代码:
- 可以看到一个
Decry()
函数,并点击进入函数
- 可以在函数末尾看到
Congratulation!
,然后看到上面是将text
字符串和str2
字符串相对比,一样就说明我们输入的flag对了
- 往上翻可以看到
text
字符串的来源,是将key3
字符串和v9
字符串进过join()
函数操作得到
- 进入
join()
函数,可以看出该函数作用是将两个字符串拼接到一起,所以text
字符串是k3 + v9
,但事实上正确的scr和v9是转换之后字符串的倒序,一个是小端存储一个是大端读取
- 点击
k3
可以看到它的值为kills
,v9
的值为wodah
,故text
的值为killshadow
- 根据这两句函数可以得到
key
的值为key1 + src
,所以key
的值为ADSFKNDCLS
- 看到下方对
key
进行了一番操作,我们用用代码复现出来,得到操作后的key
为adsfkndcls
,同时我们也可以看到
#include<bits/stdc++.h>
using namespace std;
signed main() {
char key[] = "ADSFKNDCLS";
int v5, v3 = 0;
v5 = strlen(key);
for ( int i = 0; i < v5; ++i ) {
if ( key[v3 % v5] > 64 && key[v3 % v5] <= 90 )
key[i] = key[v3 % v5] + 32;
++v3;
cout<< key[i];
}
}
- 然后就来到最关键的地方,可以看到是一直输入到换行符为之,空格则跳过操作。
if ( v1 <= 96 || v1 > 122 )//筛去小写字母
{
if ( v1 > 64 && v1 <= 90 ) //筛选大写字母
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97; //操作
++v3;
}
}
else
{
str2[v2] = (v1 - 39 - key[v3 % v5] + 97) % 26 + 97; //操作
++v3;
}
- 然后我们只需要编写一段程序将操作反向运行即可得到flag
#include<bits/stdc++.h>
using namespace std;
signed main() {
int v2, v3 = 10, v5 = 10, n = 0;
char flag[100];
char text[] = "killshadow";
char key[] = "adsfkndcls";
char v1;
for (int j = 0; j < 10; ++j)
for (v2 = 0; v2 < 10; ++v2) {
v1 = text[v2] - 97 + 26 * j - 97 + key[v3++ % v5] + 39;
if ((v1 >= 65 && v1 <= 90) || (v1 >= 97 && v1 <= 122)) {
flag[v2] = v1;
if (++n == 10)
printf("%s\n", flag);
}
}
}