这个也是I**C比赛的题目(比赛仍然没有结束QAQ)
下载下来是一个zip文件
打开后看一下内容:
蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條戶囗 萇條戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條戶囗 萇條戶囗 萇條戶囗 萇條戶囗 萇條蓅烺計劃 洮蓠朩暒戶囗 萇條
emmm,不明所以
细节分析一波
发现有些规律
总共有流浪 计划 逃离 木星 户口 长条 这六个词组成
由此想到了社会主义核心价值观编码
2^6=64
所以我考虑到可能是base64的编码
流浪 计划 逃离 木星 户口 长条 这六个词按照一定的顺序排列 出现的记为1,未出现的记为0
所以根据我的推算,得到了如下的排列顺序:
长条户口流浪计划逃离木星
所以 例如流浪计划 就可以被翻译成001100 即12
如此写一个脚本 将他们全部转换成二进制数值
再得到base64的编码
最后用Python解码 就能够得到flag了
所以我们为了这个脚本更容易处理,首先将流浪地球的字符串处理一下
即:将长条换成1,逃离换成2,以此类推
所以得到新处理的一组数据:
45,236,16,145,2345,236,16,145,2345,236,16,145,236,16,145,2345,2345,236,16,145,2345,2345,2345,236,145,236,16,145,2345,236,16,16,145,236,16,16,16,145,236,16,145,236,145,2345,236,145,2345,236,145,236,145,236,145,2345,236,16,145,236,145,2345,2345,2345,236,16,145,236,145,2345,2345,2345,236,16,145,236,145,236,16,16,16,16,145,236,145,236,145,236,16,16,145,236,145,2345,2345,236,145,236,145,236,145,2345,236,16,145,2345,2345,236,145,2345,2345,2345,236,16,145,236,145,2345,236,16,16,16,145,236,145,2345,236,16,145,236,145,236,145,2345,2345,236,145,236,145,236,16,16,16,16,145,236,1
然后就可以通过这串数据写出脚本代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<iomanip>
#include<typeinfo>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
int main()
{
int n = 0;
int buffer[512] = { 45,236,16,145,2345,236,16,145,2345,236,16,145,236,16,145,2345,2345,236,16,145,2345,2345,2345,236,145,236,16,145,2345,236,16,16,145,236,16,16,16,145,236,16,145,236,145,2345,236,145,2345,236,145,236,145,236,145,2345,236,16,145,236,145,2345,2345,2345,236,16,145,236,145,2345,2345,2345,236,16,145,236,145,236,16,16,16,16,145,236,145,236,145,236,16,16,145,236,145,2345,2345,236,145,236,145,236,145,2345,236,16,145,2345,2345,236,145,2345,2345,2345,236,16,145,236,145,2345,236,16,16,16,145,236,145,2345,236,16,145,236,145,236,145,2345,2345,236,145,236,145,236,16,16,16,16,145,236,1 };
int Buffer[512] = { 0 };
for (int i = 0; i < _countof(buffer); i++)
{
for (; buffer[i] != 0; buffer[i] /= 10)
{
switch (buffer[i] % 10)
{
case 1:
Buffer[i] += 100000;
break;
case 2:
Buffer[i] += 10000;
break;
case 3:
Buffer[i] += 1000;
break;
case 4:
Buffer[i] += 100;
break;
case 5:
Buffer[i] += 10;
break;
case 6:
Buffer[i] += 1;
}
}
}
for (int i = 0; i < 512; i++)
{
if (Buffer[i])
{
n++;
}
}
for (int i = 0; i < n; i++)
{
cout << Buffer[i];
cout << ",";
}
return 0;
就此得到处理后的数据
110,11001,100001,100110,11110,11001,100001,100110,11110,11001,100001,100110,11001,100001,100110,11110,11110,11001,100001,100110,11110,11110,11110,11001,100110,11001,100001,100110,11110,11001,100001,100001,100110,11001,100001,100001,100001,100110,11001,100001,100110,11001,100110,11110,11001,100110,11110,11001,100110,11001,100110,11001,100110,11110,11001,100001,100110,11001,100110,11110,11110,11110,11001,100001,100110,11001,100110,11110,11110,11110,11001,100001,100110,11001,100110,11001,100001,100001,100001,100001,100110,11001,100110,11001,100110,11001,100001,100001,100110,11001,100110,11110,11110,11001,100110,11001,100110,11001,100110,11110,11001,100001,100110,11110,11110,11001,100110,11110,11110,11110,11001,100001,100110,11001,100110,11110,11001,100001,100001,100001,100110,11001,100110,11110,11001,100001,100110,11001,100110,11001,100110,11110,11110,11001,100110,11001,100110,11001,100001,100001,100001,100001,100110,11001,100000
然后通过记事本的替换处理一下
0b110,0b11001,0b100001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100001,0b100110,0b11110,0b11110,0b11001,0b100001,0b100110,0b11110,0b11110,0b11110,0b11001,0b100110,0b11001,0b100001,0b100110,0b11110,0b11001,0b100001,0b100001,0b100110,0b11001,0b100001,0b100001,0b100001,0b100110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100110,0b11110,0b11001,0b100110,0b11001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11001,0b100001,0b100001,0b100001,0b100001,0b100110,0b11001,0b100110,0b11001,0b100110,0b11001,0b100001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11110,0b11001,0b100110,0b11001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11110,0b11110,0b11001,0b100110,0b11110,0b11110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100001,0b100001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11001,0b100110,0b11110,0b11110,0b11001,0b100110,0b11001,0b100110,0b11001,0b100001,0b100001,0b100001,0b100001,0b100110,0b11001,0b100000
然后再写一个转换脚本
int main()
{
int n = 0;
int buffer[512] = { 0b110,0b11001,0b100001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100001,0b100110,0b11110,0b11110,0b11001,0b100001,0b100110,0b11110,0b11110,0b11110,0b11001,0b100110,0b11001,0b100001,0b100110,0b11110,0b11001,0b100001,0b100001,0b100110,0b11001,0b100001,0b100001,0b100001,0b100110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100110,0b11110,0b11001,0b100110,0b11001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11001,0b100001,0b100001,0b100001,0b100001,0b100110,0b11001,0b100110,0b11001,0b100110,0b11001,0b100001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11110,0b11001,0b100110,0b11001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11110,0b11110,0b11001,0b100110,0b11110,0b11110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100001,0b100001,0b100001,0b100110,0b11001,0b100110,0b11110,0b11001,0b100001,0b100110,0b11001,0b100110,0b11001,0b100110,0b11110,0b11110,0b11001,0b100110,0b11001,0b100110,0b11001,0b100001,0b100001,0b100001,0b100001,0b100110,0b11001,0b100000 };
char Buffer[64] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',0,1,2,3,4,5,6,7,8,9,'+','/' };
for (int i = 0; i < 512; i++)
{
if (buffer[i])
{
n++;
}
}
for (int i = 0; i < n; i++)
{
cout << (char)Buffer[buffer[i]];
}
return 0;
}
GZhmeZhmeZhmZhmeeZhmeeeZmZhmeZhhmZhhhmZhmZmeZmeZmZmZmeZhmZmeeeZhmZmeeeZhmZmZhhhhmZmZmZhhmZmeeZmZmZmeZhmeeZmeeeZhmZmeZhhhmZmeZhmZmZmeeZmZmZhhhhmZg
得到了一串这个东西
很明显。。。。不是base64。。
WTF!我明明已经费了这么多功夫写出来了脚本,,,居然没有用。。。
对着这串字符串稍加分析可得。。。
这就是一个简单的二进制加密QAQ。。。
枉费我这么长的时间和精力。。。
所以我再次分析:
将蓅烺計劃 洮蓠朩暒替换为1
将戶囗 萇條替换为0
然后得到
0b10011001,0b10010011,0b10011110,0b10011000,0b10000100,0b10110110,0b10101100,0b10111100,0b10111100,0b10100000,0b10101000,0b10111010,0b10110011,0b10111100,0b10110000,0b10110010,0b10111010,0b10000010
直接转ASCII码
int main()
{
int n = 0;
char buffer[512] = { 0b10011001,0b10010011,0b10011110,0b10011000,0b10000100,0b10110110,0b10101100,0b10111100,0b10111100,0b10100000,0b10101000,0b10111010,0b10110011,0b10111100,0b10110000,0b10110010,0b10111010,0b10000010 };
for (int i = 0; i < strlen(buffer); i++)
{
cout << (char)~buffer[i];
}
return 0;
}
得到flag