2019掘安杯原题复现

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;
}
发布了8 篇原创文章 · 获赞 13 · 访问量 2627

猜你喜欢

转载自blog.csdn.net/jcbx_/article/details/89155857