Amy's Code
放入ida中查看,主函数如下
很显然,重点函数是sub_411433和sub_4115FF
先从验证函数开始分析,也就是sub_411433
里面是一排数据和一个字符串,重点在这个循环
很显然,v4的值就是内一排数据,由v6+str得到,str就是我们输入的flag经过sub_4115FF得到,接下来看sub_4115FF
逻辑非常简单,就一个异或,好,开始写脚本
运行后得到flag
How_decode
Ida打开
发现一排数据,下面的功能主要由encode函数实现,点进去看看
发现是个xxtea加密,但有一些变动,sum的处理变成了减,所以解密脚本也要有对应的变化
#include <stdio.h>
#include <stdlib.h>
#define DELTA 1640531527 //0x61C88647//0x9e3779b9
#define MX ((y ^ sum) + (z ^ key[e ^ p & 3])) ^ (((4 * y) ^ (z >> 5)) + ((y >> 3) ^ (16 * z)))
int main()
{
signed int v[] = {
-685738603,1455085884,-1790959305,-1803723433,
2048519359,-570374864,-1444019902,1565487515,-1608389593,
-2448347,-264877247,-1225587955,1807886879,1211382368,
-1994197741,-640361855,359063046,596576564};
unsigned int key[] = {73,83,67,67};
signed int sum = 0;
signed int y,z,p,rounds,e;
int n = 18;
int i = 0;
rounds = 6 + 52/n;
y = v[0];
sum = (rounds*(-DELTA));//这里DELTA取负值
do
{
e = sum >> 2 & 3;
for(p=n-1;p>0;p--)
{
z = v[p-1];
//v[p] = (v[p] - MX) ;
y = v[p] -=MX;
}
z = v[n-1];
//v[0] = (v[0] - MX) ;
y = v[0] -=MX;
sum += DELTA;//这里改为+=
}while(--rounds);
for(i=0;i<n;i++)
{
printf("%c",v[i]);
}
return 0;
}
运行后得到flag
GetTheTable
纯纯签到
发现Base58
直接base58解密密文得到flag
Bob's Code
进入主函数分析,4个重点关注函数,倒着逐个分析
sub_4116E0
很显然,这个是rot2加密,没啥好说的,下一个
sub_412D10
这个函数作用就是把a3加入字符串的a4位置,写还原脚本的时候给这个位置的字符去掉就行,继续下一个
sub_4127C0
这里是Base64加密,但需要注意他稍微做了一些变动,将”=”替换成了”.”并且还对码表做了些处理
写脚本的时候也需要使用处理过的码表,好的这个函数结束,继续下一个
sub_4116C7
标准的base64,没啥好说的,开写脚本
第一部分,解密rot2和去除加入的两个字符
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a2 = 2;
string Str = ".W1BqthGbfhJWdG5BBGW1u.iXVojNqXbGyX1tEu1p5oZpqtMRbVYzyV1fkoF0.";
for(int i = 0; i < Str.length();i++)
{
if ( Str[i] >= 97 && Str[i] <= 122 )
{
if(Str[i] - a2 < 97)
Str[i] = Str[i] +26 -a2;
else{
Str[i] = Str[i] -a2;
}
}
else if(Str[i] >= 65 && Str[i] <=90)
{
if(Str[i] - a2 < 65)
Str[i] = Str[i] +26 -a2;
else{
Str[i] = Str[i] -a2;
}
}
}
cout << Str << endl;
string Str2 = "";
for(int i = 1; i <22;i++)
{
Str2 += Str[i];
}
for(int i = 23; i < Str.length();i++)
{
Str2 += Str[i];
}
cout << Str2 << endl;
}
第二部分,得到处理过的码表
第三部分,解密base64,解密前顺手给密文最后一个字符“.”换成“=”
运行得到flag
VigenereLike
Ida打开
这题需要先验证id,id正确之后才能输入flag,先不管id,这玩意加密算法有点离谱,直接看flag
也不是很好搞,倒着来吧,从校验的部分开始,给出了密文,明显是个base64,字符串搜索也看到了码表,是标准码表。然后看最后一个加密函数
有个base64加密,再看看下面的加密函数
属于是点题函数了,一个魔改过的维吉尼亚加密。再往上看
一个异或,继续看下一个
Flag在这加了个id啥啥的,需要去掉
再往上就没什么重要的了,开始写脚本
#include<iostream>
#include<string>
using namespace std;
int ret_i(char a)
{
string key = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
for(int i = 0; i < key.length();i++)
{
if(key[i] == a)
{
return i;
}
}
return -1;
}
int main()
{
string a1 = "rJFsLqVyFKZOjlFHqmOZSpLsFuyqkIdxMummCrv=";
string a2 = "";
string key = "ISCCYESISCCYESISCCYESISCCYESISCCYESISCCY";
string key2 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ";
int v7 = 0;
int res[50]{0};
for(int i = 0; i < a1.length(); i ++ )
{
int v11 = ret_i(a1[i]);
int v8 = ret_i(key[i]);
//cout << "v11 :" << v11 << " v8: " << v8 << endl;
if(v11 == -1)
{
res[i] = a1[i];
continue;
}
if(v11 < v8 )
{
v11 += key2.length();
v7 = v11 - v8;
//cout << v7 << " ";
}
else if(v11 > v8){
v7 = v11 -v8;
}
else if(v11 == v8){
res[i] = key2[0];
continue;
}
res[i] = key2[v7];
}
for(int i = 0; i < 41 ;i ++)
cout << char(res[i] );
cout << endl;
string ans = "Sguawub,u@O4e]oi.5t~I7S:gQOWN";//res base64解密得到的
for(int i =0; i < ans.length();i++)
{
ans[i] ^= ((i%7) + 1);
}
cout << ans;
return 0;
}
跑出来结果
删掉最后四个字符得到flag