1.夺取俄罗斯 so easy
首先点开连接,下载该文件,然后发现是个exe的可执行程序。但是打不开。所以试一下把文件后缀改为.txt,打开发现是一长串字符串。
第一反应是去试一下base64,但是失败了,然后查阅资料才发现还有base58这种东西。网站在线解密没找到,所以直接去找一个python的代码,把它解出来。
最后得到一长串字符串。
前面有data:image/bmp;base64,因为这是base64转图片的标志,所以我们直接用base64转图片,在线网站解密,找到了一张二维码。
扫一下,得到flag。
剩下的都是密码题了。
2.东帝汶,贝斯家族三英战群魔
打开文件,是好长的一串十六进制串。其实从题目就可以看得出来,本题考的就是base16 32 64 的编码。
然后根据字符串的不同类型,用相对应的base去解。
顺序是base16,32,64,16,32,64,16,32,64.
网址:https://www.qqxiuzi.cn/bianma/base.php?type=16
3.秘鲁——罗马帝国的奠基者
有罗马那就大概率会出现凯撒加密。打开题目出现了一串字符串,还说格式是jactf{},此时我们比较一下二者的ascii码就不难发现,字符串第一个向右移两位得到j,第二个向右移三位得到a,等等等等,以此类推。
此时那个{最不合群,因此分析时我们应该先把{去掉。这也是这道题最坑人的地方。最后的结果我们还要自己手动加上{}。我们可以直接编写一个C语言程序来跑一遍更快。代码如下:
#include<stdio.h>
int main()
{
char str[100];
int i,k;
scanf("%s",str);
k=2;
for(i=0;str[i];i++)
{
str[i]=str[i]+k;
k++;
}
puts(str);
return 0;
}
最后加上{}就ok啦!
4.斯威士兰——绝密情报
文件中有N和e ,说明与RSA有关,用在线网站分解大整数。
网址:www.factordb.com/
明文是一串base64的字符串,我们用base64来解码,可以得到一连串的数字。这就是我们需要解密的密文。
我是用python2的一个rsa算法算的,由于每次复制代码都直接出现卡屏,我就不展示出来了。最后会算出很多个ascii码。
然后解出ascii码
U2FsdGVkX1/8DKBmhvO87/SOLaawwxvAdHLB9AV62nC6LhXzhatpvBcg6tlK7Fs5然后是个意想不到的DES解密。。。。
5.布基纳法索——贝叶斯
解压出zip文件,能得到一个题目和encode。
题目里说是贝叶斯的密码本其实就是base64解密的象征。解密出来的一串字符仔细看其实就是一种密码本。
这个密码本包含了大小写字母,数字,空格,{和}。
然后来看看encode,这是用伪码写的一种加密算法。
分析后可知加密方法就是每读取一个明文字符,就遍历密码本,看看在第几位,然后用仿射密码加密那个位数得到新的位数,再从密码本找到这个新的位数的字符输出。解密过程也就是反过来而已。
但其中仿射密码的a,b和x不知道一度让我有点困惑。其实x就是密码本的长度,a和b我们要自己找。用C语言从1开始循环a和b到x就可以了。其中最重要的是仿射密码的解密是要算出乘法逆元的。最后直接找到flag。(是jactf开头的)
下面附上C语言代码
#include<stdio.h>
#include<string.h>
exgcd(int x3,int y3,int x2,int y2)
{
int m;
int t2,t3;
int q;
m=x3;
while(1)
{
if(y3==0)
{return x3;}
if(y3==1)
{
if(y2<0)
y2=y2+m;
return y2;}
q=x3/y3;
t2=x2-q*y2;
t3=x3-q*y3;
x2=y2;x3=y3;
y2=t2;y3=t3;
}
}
int main()
{
char str[99]="zQWERTYUIOPxcvbnmasdfASDFGHJKLghjkl_qwZXCVBNMert{yuiop}0123498765";
char a[]="gf9C{YQ34KHN3sOwhCz3RzH3CKj3Ndpm1Bt7";
char c[99];
int i,n,j,l,d,k,b,t;
l=strlen(str);
for(b=0;b<l;b++)
{
for(k=0;k<l;k++)
{
for(i=0;a[i];i++)
{
for(j=0;str[j];j++)
{ if(a[i]==str[j])
n=j;
}
d=exgcd(l,b,0,1);
n=((n-k+l)*b)%l;
c[i]=str[n];
}c[i]=0;
for(i=0;c[i];i++)
{
if(c[i]=='c'&&c[i+1]=='t'&&c[i+2]=='f')
{printf("%d.",k); puts(c);}
}
// printf("\n");
}
}
return 0;
}