首页
社区
课程
招聘
[推荐]看雪.纽盾 KCTF 2019 Q3 | 第五题点评及解题思路
发表于: 2019-9-29 16:40 3567

[推荐]看雪.纽盾 KCTF 2019 Q3 | 第五题点评及解题思路

2019-9-29 16:40
3567

太阳升起又落下。若有若无的淡香飘散在战场,身影像舞蹈般风中摇曳,绽放出鲜血之花。舞姬貂蝉,迎着四散的逃兵寻找熟悉的身影。战神吕布,果然是不可战胜的吗?你在哪里?貂蝉焦急的寻觅着。却不知道,他们正离得越来越远。我在光明中起舞,你是我的烛之影。你在黑暗中厮杀,我是你的月之影。清风拂过山丘,扛着龙枪的男人回首战场。遍地死尸,血腥弥漫,这熟悉的味道,就像我们初遇的地方。









练习一年半的广州某技校本科生,除了签到题什么都不会的逆向蔡鸡,求大佬带。






杂杂碎:其实原本的打算是将前面的一些算法也运用在check里面,但是如此将变成算法的堆叠,感觉没多大意思,还有一点就是本来是打算魔改下DES3的,但是由于时间的问题所以也未果了(其实还是太菜了),大佬们都tql,一下就被秒了!











- End -



合作伙伴


上海纽盾科技股份有限公司(www.newdon.net)成立于2009年,是一家以“网络安全”为主轴,以“科技源自生活,纽盾服务社会”为核心经营理念,以网络安全产品的研发、生产、销售、售后服务与相关安全服务为一体的专业安全公司,致力于为数字化时代背景下的用户提供安全产品、安全服务以及等级保护等安全解决方案。


原文链接:https://mp.weixin.qq.com/s/0epD30uoplcOAUy714Y7Kw




只会签到题的蒻鶸团队成员只有签个到跑路了一个人,但实力依然不容小觑,下面是相关简介:

练习一年半的广州某技校本科生,除了签到题什么都不会的逆向蔡鸡,求大佬带。



设计思路


>>>>加密过程


输入一个字符串,第一个check,check长度是否小于等于48,第二个check使用了梅森翻转算法、xxtea加密算法,check字符串的第一个字节,以第一个字节作为随机数种子,由梅森翻转算法得到三个32bits整数,将第一个、第三个整数通过xxtea加密,密钥直接给出,为{0X67452301, 0XEFCDAB89, 0X98BADCFE, 0X10325476},得到的结果相加得到v,由梅森翻转算法得到的第二个整数减去v得到res,检查是否等于2768546039,梅森翻转算法得到的随机数可预测,xxtea可逆,但是sn限定字符集为[33,126],直接正向爆破秒解。

第三个check,check输入的字符串与"Welcome/to/this/very/simple/challenge"相加之后的md5是否等于44e4403b63620a2075d3fb2e0a6207d2,此处不可逆,主要是check长度,直接跳过上面的check逆下面的算法就可以得到sn,所以直到此处所有的check几乎都是无用的,纯属误导。以下是真正的check且可逆,首先程序将输入的字符串取前36个字节base64decode,得到decode后的字节,应为26bytes,(此处暴露了sn长度应该为36个字节),之后对这26个字节进行分割,分割为v1,v2,v3,c,分别为6、6、6、8个字节,对输入的36个字节的前二十四个进行分割,分割为key1,key2,key3,均为8字节,之后进行3DES解密,密钥为key1key2key3,密文为c,即des_decrypt(key3,c),des_encrypt(key2,c),des_crypt(key3,c),最终得到的c为8字节明文,这里视为v4,之后是md5校验(此处如上所说并没有用),最终的校验是4个迷宫check,将上述得到的v1,v2,v3,v4分别送入迷宫check,正确的话预设值+1,最终检验预设值是否为4,即四个迷宫都要走完,迷宫均为13*13矩阵,起点为'@',终点为‘#’,除第一个显示给出外,其余三个均为在第一个迷宫的基础上动态生成。


>>>>解题思路


去混淆,整理出四个迷宫,依据迷宫规则推导出v1,v2,v3,v4,其中v1、v2、v3为6bytes,v4为8bytes,前三个迷宫有且只有一条长度为18的路径,第四个迷宫有且只有一条长度为24的路径,至于v1、v2、v3、v4的长度由程序可以直接得到,根据迷宫规则目测即可非常快速的得到路径,也可写脚本得到,之后对v1、v2、v3分别进行base64encode得到key1,key2,key3,对v4进行3des加密,密钥为key1,key2,key3,最后对得到的结果c进行base64encode得到一个12bytes的字符串,将key1,key2,key3和c拼接就可得到长度为36bytes的sn。

四个迷宫分别为:


maze1:

*************

*@***********

*-***********

*--**----****

*-***-**-****

*-***#**-****

*--*****-****

**-*****-****

**-------****

**-*-----****

**---**-*****

**-****--****

*************

maze2:

*************

*@***********

*-***********

*-***-**-****

*--**----****

*-***#**-****

*--*****-****

**-*****-****

**-*-----****

**---**-*****

**-------****

**-****--****

*************

maze3:

*************

*@***********

*-***********

*-***-**-****

*--*****-****

*-***#**-****

*--**----****

**-*****-****

**-****--****

**---**-*****

**-*-----****

**-------****

*************

maze4:

*************

**-------****

*--*****-****

*-***-**-****

*--*****-****

*-***#**-****

*-***-**-****

*-***-**-****

*--**----****

**---**-*****

*--*****-****

*@***********

*************


很容易得到四个迷宫的最短路径为:


ssss sdss dddd ddww wwwa aass

ssss sdss sddw dddd wwww aaas

ssss sdss sdds dddw wdww aaaw

wdww awww wwwd wddd ddds ssss ssaa awww


迷宫规则为00 w 01 s 10 a 11 d。所以可以得到4个迷宫check的内容分别为:


v1 = b'\x55\x75\xff\xf0\x02\xa5'

v2 = b'\x55\x75\x7c\xff\x00\xa9'

v3 = b'\x55\x75\x7d\xfc\x30\xa8'

v4 = b'\x30\x80\x03\x3f\xfd\x55\x5a\x80'


接下来就是DES3加密了。
key为base64encode(v1+v2+v3),
m为v4
sn = key + base64encode(v4)

import base64

from Crypto.Cipher import DES3

from hashlib import md5

v1 = b'\x55\x75\xff\xf0\x02\xa5'

v2 = b'\x55\x75\x7c\xff\x00\xa9'

v3 = b'\x55\x75\x7d\xfc\x30\xa8'

v4 = b'\x30\x80\x03\x3f\xfd\x55\x5a\x80'

key = base64.b64encode(v1+v2+v3)

print('key:',key)

print('m:',v4)

c = DES3.new(key, DES3.MODE_ECB)

cipher = base64.b64encode(c.encrypt(v4))

sn = key + cipher

assert(md5(sn+b'Welcome/to/this/very/simple/challenge').hexdigest() == '44e4403b63620a2075d3fb2e0a6207d2')

print('sn:', sn.decode())


get sn:VXX/8AKlVXV8/wCpVXV9/DCogeWKJMtrmeY=

杂杂碎:其实原本的打算是将前面的一些算法也运用在check里面,但是如此将变成算法的堆叠,感觉没多大意思,还有一点就是本来是打算魔改下DES3的,但是由于时间的问题所以也未果了(其实还是太菜了),大佬们都tql,一下就被秒了!



解题思路


本题解题思路由看雪论坛KevinsBobo提供:



题目分析


1. 往输入后面追加一段字符串Welcome/to/this/very/simple/challenge,输入的字符串加上这段内容大小不能超过0x55。


2. 调用btea加密算法验证输入的正确性。


3. 将输入的内容做base64解码,若输入中有等号且等号位置小于等于35,则只解析等号及前面的数据,否则只解析前36位数据。



4. 将输入的base64字符串分成0-8、8-16、16-24,再分出base64解码后的18位之后的部分。


5. 有两个加解密函数,猜测是魔改des,因为搜其使用的数据表搜到了看雪很早前的一篇破解魔改des的文章,怀疑是作者留下的线索。在这里暂且称f_des_opt_01为加密函数,f_des_opt_02为解密函数。


6. 根据上图可以看出:
先将base64解码的数据18位以后的数据用base64字符串的16-24位的数据作为key加密;
18位以后的数据用8-16位的数据作为key解密;
18位以后的数据用0-8位的数据作为key加密;

7. 有了以上的推断,当需要反推数据时,直接调试,替换加解密函数的参数就可以反向操作了。

8. 然后就是走迷宫的操作了,识别迷宫是通过找到迷宫字符串数据后,结合使用时采用map[][13]二维数组的方式,推测出是迷宫地图。



9. 使用MD5校验放多解

找出迷宫


1. 在main函数前利用全局变量注册了一个初始化函数,里面给第一个迷宫赋值,并且也给防多解用的md5字符串赋值。


2. 迷宫走法



3. 通过调试抓出几次变换后的迷宫,一共四组,结合上面的代码可以看出,@代表移动的对象,#代表终点。


1

*************

*@***********

*-***********

*--**----****

*-***-**-****

*-***#**-****

*--*****-****

**-*****-****

**-------****

**-*-----****

**---**-*****

**-****--****

*************

2

*************

*@***********

*-***********

*-***-**-****

*--**----****

*-***#**-****

*--*****-****

**-*****-****

**-*-----****

**---**-*****

**-------****

**-****--****

*************

3

*************

*@***********

*-***********

*-***-**-****

*--*****-****

*-***#**-****

*--**----****

**-*****-****

**-****--****

**---**-*****

**-*-----****

**-------****

*************

4

*************

**-------****

*--*****-****

*-***-**-****

*--*****-****

*-***#**-****

*-***-**-****

*-***-**-****

*--**----****

**---**-*****

*--*****-****

*@***********

*************


4. 找出四组迷宫的走法。


0 上

1 下

2 左

3 右

第1次

1111

1311

3333

3300

0002

2211

// 55 75 FF F0 02 A5

第2次

1111

1311

1330

3333

0000

2221

// 55 75 7C FF 00 A9

第3次

1111

1311

1331

3330

0300

2220

// 55 75 7D FC 30 A8

第4次

0300

2000

0003

0333

3331

1111

1122

2000

// 30 80 03 3F FD 55 5A 80


反推答案


1. 由前面的拆分和加解密可得知,输入的base64字符串的前24位是不变的,需要变化的是24位之后的数据。

2. 将第四组迷宫的走法数据和每次对应的分解出的key数据整理出来,调试时按照相反操作放入到魔改des的加解密操作函数中,执行的结果就是反推出的数据;具体操作就不截图了,反推结果如下。


key data

VXX/8AKl 30 80 03 3F FD 55 5A 80  解密

VXV8/wCp 3F 33 22 50 73 E7 DE 50  加密

VXV9/DCo A7 E9 5A 25 48 CA 28 96  解密

==>

81 E5 8A 24 CB 6B 99 E6

3. base64_encode(第一组迷宫的走法数据 + 第二组迷宫的走法数据 + 第三组迷宫的走法数据 + 解密后的数据) = key。


55 75 FF F0 02 A5 55 75 7C FF 00 A9 55 75 7D FC 30 A8 81 E5 8A 24 CB 6B 99 E6

VXX/8AKlVXV8/wCpVXV9/DCogeWKJMtrmeY=




- End -



合作伙伴


上海纽盾科技股份有限公司(www.newdon.net)成立于2009年,是一家以“网络安全”为主轴,以“科技源自生活,纽盾服务社会”为核心经营理念,以网络安全产品的研发、生产、销售、售后服务与相关安全服务为一体的专业安全公司,致力于为数字化时代背景下的用户提供安全产品、安全服务以及等级保护等安全解决方案。


原文链接:https://mp.weixin.qq.com/s/0epD30uoplcOAUy714Y7Kw


只会签到题的蒻鶸团队成员只有签个到跑路了一个人,但实力依然不容小觑,下面是相关简介:



输入一个字符串,第一个check,check长度是否小于等于48,第二个check使用了梅森翻转算法、xxtea加密算法,check字符串的第一个字节,以第一个字节作为随机数种子,由梅森翻转算法得到三个32bits整数,将第一个、第三个整数通过xxtea加密,密钥直接给出,为{0X67452301, 0XEFCDAB89, 0X98BADCFE, 0X10325476},得到的结果相加得到v,由梅森翻转算法得到的第二个整数减去v得到res,检查是否等于2768546039,梅森翻转算法得到的随机数可预测,xxtea可逆,但是sn限定字符集为[33,126],直接正向爆破秒解。

第三个check,check输入的字符串与"Welcome/to/this/very/simple/challenge"相加之后的md5是否等于44e4403b63620a2075d3fb2e0a6207d2,此处不可逆,主要是check长度,直接跳过上面的check逆下面的算法就可以得到sn,所以直到此处所有的check几乎都是无用的,纯属误导。以下是真正的check且可逆,首先程序将输入的字符串取前36个字节base64decode,得到decode后的字节,应为26bytes,(此处暴露了sn长度应该为36个字节),之后对这26个字节进行分割,分割为v1,v2,v3,c,分别为6、6、6、8个字节,对输入的36个字节的前二十四个进行分割,分割为key1,key2,key3,均为8字节,之后进行3DES解密,密钥为key1key2key3,密文为c,即des_decrypt(key3,c),des_encrypt(key2,c),des_crypt(key3,c),最终得到的c为8字节明文,这里视为v4,之后是md5校验(此处如上所说并没有用),最终的校验是4个迷宫check,将上述得到的v1,v2,v3,v4分别送入迷宫check,正确的话预设值+1,最终检验预设值是否为4,即四个迷宫都要走完,迷宫均为13*13矩阵,起点为'@',终点为‘#’,除第一个显示给出外,其余三个均为在第一个迷宫的基础上动态生成。

去混淆,整理出四个迷宫,依据迷宫规则推导出v1,v2,v3,v4,其中v1、v2、v3为6bytes,v4为8bytes,前三个迷宫有且只有一条长度为18的路径,第四个迷宫有且只有一条长度为24的路径,至于v1、v2、v3、v4的长度由程序可以直接得到,根据迷宫规则目测即可非常快速的得到路径,也可写脚本得到,之后对v1、v2、v3分别进行base64encode得到key1,key2,key3,对v4进行3des加密,密钥为key1,key2,key3,最后对得到的结果c进行base64encode得到一个12bytes的字符串,将key1,key2,key3和c拼接就可得到长度为36bytes的sn。

四个迷宫分别为:
maze1:

*************

*@***********

*-***********

*--**----****

*-***-**-****

*-***#**-****

*--*****-****

**-*****-****

**-------****

**-*-----****

**---**-*****

**-****--****

*************

maze2:

*************

*@***********

*-***********

*-***-**-****

*--**----****

*-***#**-****

*--*****-****

**-*****-****

**-*-----****

**---**-*****

**-------****

**-****--****

*************

maze3:

*************

*@***********

*-***********

*-***-**-****

*--*****-****

*-***#**-****

*--**----****

**-*****-****

**-****--****

**---**-*****

**-*-----****

**-------****

*************

maze4:

*************

**-------****

*--*****-****

*-***-**-****

*--*****-****

*-***#**-****

*-***-**-****

*-***-**-****

*--**----****

**---**-*****

*--*****-****

*@***********

*************


很容易得到四个迷宫的最短路径为:

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-10-10 14:46 被Editor编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//