2016年京津冀大学生网络安全知识技能挑战赛writeup

0x01 签到题

原图半天没扫出来,做了个反色,再扫,成功。

 

 

 

 

0x02 Hello

查看页面的代码发现如下表达式,要求sha1(var)==Ciphertext,显然这里的Ciphertext应该是个变量。

 

 

发现请求页面时响应头部有Ciphertext的值。

 

 

那思路就很清晰了:访问页面获得sha1()括号中的字符串以及头部的Ciphertext的值,通过暴力穷举的方式找到满足条件的三个数字

脚本如下:

 

 

跑了之后竟然得到这个,还需要算个表达式;

 

 

大同小异,继续提取页面中的表达式eval()计算提交即可:

 

 

0x03 crack MD5

访问页面得到如下返回,大意是第二行的是md5密文,其对应的明文就是第三行的那些字母,不过顺序被打乱了。

 

 

看明白题思路就清晰了:首先访问页面,提取密文及明文字符串,对明文字符串进行排列组合并加密,将结果与已给的密文比较即可。

 

 

但是这样做很耗时,大部分情况都是too late,不过还好,时不时能跑出来一次。

 

 

0x04 破解

文件是个压缩包,解压还要密码,丢到某破解软件中,提示加密的文件为0。

 

 

那应该是伪加密了,用十六进制编辑器打开,将文件相应的标志位0900修改为0800即可。

 

 

解压文件得到noflag.gif。

 

 

并没有什么,想用记事本打开图片,竟然把我电脑卡死了。继续用winhex打开。

 

 

发现有一大长串似乎是base64码的字母,提取出来解码,发现解码后还是base64,有情况啊!继续解码,还是base64,三次之后解出含gif字样的内容,应该是张图片。

用base64直接解码成图片

 

 

图片是动的,flag一闪一闪很难定格。用gif编辑器打开图片得到flag。

 

 

0x05 tryhard

加密部分算法,flag{******}每个字符会生成一个两位的16进制形式的字符,而密文40位,所以flag{*****}共20位,其中key=******长14位,对于从flag{*****}开始的每一个字符,加密过程由key中的[0,7],[1,8]……位依次参与迭代运算:

 

 

加密算法迭代化简一下就更清晰了:

 

 

由于flag{********}中flag{}及其对应的密文是已知的,在mod251之后i,j可认为是[0,251]之间的数,带进去暴力破解即可

 

 

求得i,j分别等于15和198。

 

 

现已知i,j那么密文中flag{*****}对应*******的那一串根据化简出来的表达式,反带即可

 

 

 

 

0x06 re50

这是我队友做的,打完比赛他就出去玩了,我帮他写一下,不周之处还请包涵。IDA载入看到verify函数,里面的v2[]数组即是flag。

 

 

0x07 cry50

首先base64解码密文Ot7lAO72opsedkxTngbD3FhwP50x8sosA f9oL OkIpr8PN7J0Omq7nWxvgvaiRn+Tp95zcTDj,

 

 

解码后的密文前16位即是salt,后面是crypt()加密的结果,key已知,salt已知,则sha1(key+salt).digest()可知,然后将结果及解码后密文crypt()加密的部分丢进去,解密即可得到flag。