首页
社区
课程
招聘
看雪CTF.TSRC 2018 第七题 魔法森林 分析
发表于: 2018-12-15 09:52 7824

看雪CTF.TSRC 2018 第七题 魔法森林 分析

2018-12-15 09:52
7824

注意:下面有很多数学上不严谨的地方,且省略了大量的细节。

题目(又³)给出了一个 32 位控制台应用程序,无任何保护。

程序里的各种 timestamp 写的都是 Mon Dec 10 09:34:29 2018,只能说出题人有背景啊,作为防守方在比赛开始之后还能改题的,其他人做得到吗,呵呵呵呵呵。

从读取输入的方式来看,非常的看场雪了。

程序明面上的逻辑比较简单,可参考如下代码。

后面的计算是在 hexdecode 过的输入上做的,而后面的计算过程又受一个用 hexdecode 之前的输入上算出来的某种 CRC or 上 0xA4A4A4A4 生成的 table (后文称作 ControlDword)有关。这大概就是描述中的“鸡生蛋,蛋生鸡”的部分吧。简单观察后面的计算,不妨设其在 ControlDword 确定的情况下解唯一。这里可以控制用来造出这个行为的变量看起来只有 kTableInput。看起来作者是先确定了 ControlDword 和后面的解之后再构造的前面的部分。具体构造方法比较简单,感兴趣的读者可以自行推一推,只要注意到 CRC32 是线性的,修改一段输入的任意32 bit即可构造出任意输出值就不难理解。根据之前接触到的“看场雪”所出的题目来看,作者是个十分喜欢自hi的人,不妨认为 ControlDword 就是描述中提到的“天书”,并且其至少包含一段有意义的文本。

注意到 0xA4A4A4A4 包含 12 位,因此实际有效的输入只有 20 bit,不妨直接枚举一遍,按照原程序中的 GenerateControlDword 的逻辑算出输出,然后找里面有 “森林” 两个字的。结果可以得到如下文本(GBK 编码,共 1958 字节):

呵呵呵,一如“看场雪”既往的不说人话。还“不是我看不起对手故意放水”,咋看着就这么像呢?

不妨认为现在 ControlDword 已经确定了,接下来只要看后面的计算即可。
后面的计算只包含一种操作,即查一张 255 x 255 的表,看起来是把某个原群 (Q, •) 的二元运算 • 的结果打成了表而不是直接写出运算过程,以此来对程序进行混淆,这也是一种通用方法。注意到 ControlDword 用来控制运算的左右顺序,所以多半这个二元运算不是可交换的,验证一下可以发现确实如此。同时注意到这张表是一个 Latin square,因此它是一个拟群。简单验证一下其他容易发现的性质可以发现不满足结合律,但存在恰好一个幂等元素 89。

注意到后面一通运算的输入和输出都是可见字符串,我们只能控制中间混合进去的 serial,这个 challenge 整体的形式是给出一组“明文”和“密文”对,求满足运算的“密钥"。这个拟群一定是通过某种形式构造的,具有某种性质,否则很难实现以上这一点。

显然,本题的秘密就藏在这个拟群的构造方式上了。观察 a•b/a 的结果(这里中间当然有一番各种其他尝试):

这提示了我们这个拟群可能是 medial 的。验证一下发现确实如此。阅读一会儿各种 pdf,发现有一个叫 Bruck-Murdoch-Toyoda theorem 的东西,接下来就是体力活了。Bruck-Murdoch-Toyoda 定理告诉我们,对于任意 medial quasigroup (Q, •),都存在一个阿贝尔群 (Q, +),满足

x • y = φ(x) + ψ(y) + c

其中 φ、ψ 是 (Q, +) 上的自同构映射,c 是 Q 中的一个元素。我们只要能找出这两个映射,就可以找出这个 mask 过的运算在 (Z_{255}, +) 上的等价表示,从而方便我们后续的求解。

这两个映射可以不同,这不太方便我们后续的处理。从我们的目标出发考虑,我们希望找到一种方法,将运算表示为 (Z_{255}, +) 上的线性运算,否则的话将还是难以求解。因此我们猜测这里实现的运算实际上是:

x • y = a * x + b * y + c

其中 * 为 (Z{255}, +) 上的“乘法”,a, b 为常数。当然,由于给定的运算表并不是定义在 Z{255} 上的,因此直接带入原始问题中的值 / 运算表的时候需要经过一次映射,这个任意可以是 (Q, +) 上的任意自同构映射。

这里 a、b、c 的范围都是 [0, 255),我们可以直接枚举。剩下的问题就是如何找出这个映射。这可以通过刻画这个拟群上元素的一些性质(比如每个元素的阶等),和枚举出来的结果进行匹配,这是一个体力活。如此这般,确实可以找到几组合理的匹配,说明这个操作是可以等价到 (Z_{255}, +) 上的线性运算的,因此可以解。

经过一番体力活之后,我们可以得到程序里的 kBinOpTable 的其中一种可能的构造是下面这个玩意:

注意到映射的过程可以拿出来放到输入和输出的时候做,也就是说映射到 Z_{255} 上之后这个运算是线性的,所以可以直接解。

Sage 代码。

运行即可得到答案 64AD6A44B63F9EA5630D4E13335D54A6,验证可以发现 CRC 也符合,运行一下会发现程序输出了 “恭喜你走出森林了”。

 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-9-25 03:27 被Riatre编辑 ,原因:
收藏
免费 6
支持
分享
最新回复 (10)
雪    币: 10845
活跃值: (1054)
能力值: (RANK:190 )
在线值:
发帖
回帖
粉丝
2
感谢楼主的抬举!看场雪从来“不说人话”
楼主对看场雪人性深处的了解 是快速做出此题的一个先决条件
所谓金蛋和天书 其实就是一个引导破解者突破第一关的关键线索
如果不是楼主对看场雪的自hi性格有如此深刻的了解 恐怕是很难猜到“森林”二字的。
看场雪“找到知己了!”

关于楼主的“设计目标”疑问,看场雪对此题的设计寿命是24小时,已经达到了!

关于“擦边球”的问题,
请问哪里擦边了?还请明示
如果版主判定违规,那就下不为例

至于20181109,想必是一个值得纪念的日子
最后于 2018-12-16 09:30 被看场雪编辑 ,原因: 用词不当
2018-12-15 13:24
0
雪    币: 50169
活跃值: (20520)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
出题和解题都厉害!
2018-12-15 14:36
0
雪    币: 6435
活跃值: (441)
能力值: ( LV12,RANK:831 )
在线值:
发帖
回帖
粉丝
4
看场雪 感谢楼主的抬举!看场雪从来“不说人话”[em_19] 楼主对看场雪人性深处的了解 是做出此题的一个先决条件 所谓金蛋和天书 其实就是一个引导破解者突破第一关的关键线索 如果不是楼主对看场雪的自h ...
猜到“森林”两字并不是必要条件,我当然可以对这 2**20 种可能的 ctrl 都解一遍再验证,你这两部分其实完全是独立的。

至于设计目标,我指的是你所谓的“执念”而不是活多久。
至于 24 小时……你开心就好。我是觉得做出来的人 <= 5 的问题看最早被解出的时间基本没意义。因为愿意做的人太少,最早被解出的时间大部分取决于愿意做的这几个人这两天有没有时间,什么时候有时间,由于人数太少,随机性相当大。(比如事实上我在第一天晚上的时候已经解了第二部分,只是第二天一整天都有活动实在没空写代码解完而已)。
最后于 2018-12-15 16:07 被Riatre编辑 ,原因:
2018-12-15 16:01
0
雪    币: 10845
活跃值: (1054)
能力值: (RANK:190 )
在线值:
发帖
回帖
粉丝
5
Riatre 看场雪 感谢楼主的抬举!看场雪从来“不说人话”[em_19] 楼主对看场雪人性深处的了解 是做出此题的一个先决条件 所谓金蛋和天书 其实就是一个引导破解者 ...
同意
但是 给“善于透视对手心理”的高手留下一条捷径 不是也很有趣味吗?
2018-12-15 16:09
0
雪    币: 11067
活跃值: (3324)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
6
感谢Riatre的参与和精彩分享!赛题征集于论坛广大会员,但可能部分会员设计题目时不够严谨存在bug,我们也会进行简单测试并让会员提交题目后再思考是否设计严谨。如果发现问题并反馈后,我们会问清楚修改原因,并参照会员提交的设计说明,在不改变原有设计思路和解题思路的前提下给予一定时间修复bug。
2018-12-15 17:26
0
雪    币: 10845
活跃值: (1054)
能力值: (RANK:190 )
在线值:
发帖
回帖
粉丝
7
楼主的2个观点 都有价值
1)破解人数很少的题 由于样本太少 所以可能会有各种因素的影响 真不一定能够确定 到底是题目太难?还是题目太无聊?还是比赛期间大家太忙?
个人有个建议:除了以最短破解时间来衡量防守方的分数以外,还可以单独设立一些特色奖项。例如:“你最欣赏的作品奖”
为防止有人恶意灌票,只允许在本届比赛中破解成功过的会员参与投票。破解成功1次 可以投1票,成功n次投n票。
这样就能充分体现参与者心目中最喜欢的作品。
2)关于看场雪的执念。看起来这次比赛是难以得到肯定的验证了。不过 相对于上一个版本(密室逃脱)的确是有了一定的进步 从6小时提升到了至少12小时(感谢楼主告知了实际破解时间)这说明 看场雪对于密室逃脱的这次升级是有效的 但是幅度还远远不够。至少还需要在魔法森林的基础上 再把难度提升6倍 才能接近48小时。
2018-12-15 20:44
0
雪    币: 11067
活跃值: (3324)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
8
设立特别趣味设计奖作为最高奖,由攻击方选手投票,是个不错的想法。
2018-12-15 21:15
0
雪    币: 13141
活跃值: (5783)
能力值: ( LV5,RANK:77 )
在线值:
发帖
回帖
粉丝
qux
9
一群怪物
2018-12-16 22:28
0
雪    币: 73
活跃值: (5304)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wsc
10
看场雪 楼主的2个观点 都有价值 1)破解人数很少的题 由于样本太少 所以可能会有各种因素的影响 真不一定能够确定 到底是题目太难?还是题目太无聊?还是比赛期间大家太忙? 个人有个建议:除了以最短破解时间 ...
感谢很赞 
2018-12-17 10:07
0
雪    币: 10845
活跃值: (1054)
能力值: (RANK:190 )
在线值:
发帖
回帖
粉丝
11
x • y = a * x + b * y + c,这的确是此题真正的起点。其它的部分都是跑龙套的。能看到这一层,就算是破解成功了。
我们为了等LZ点破这一层,也等了将近一年。终于不虚此等。虽然过去一年了,但出题当时的想法还历历在目。现在此题的起点已经大白于天下,然而它看上去却是那么的朴素,它的理论基础也是几十年乃至几百年前的人确立的,而此题的解题难度却明显高于平常。
不得不说,在无边的数学海洋中随手捧起一滴,都可以制造出“旷世难题”。如果大家都能认识这一点,那么我的执念也就不再成其为执念了。

魔法森林一题虽战绩不错,但还不能被称为一个好题。因为不论是出题思路还是解题方法,都不能被大多数会员们所理解和欣赏。说的好听叫“神仙打架”,不好听的叫“一群怪物”。本人自省,自从参赛以来,多题倍受争议,甚至有点带偏了风气(自大了),所以希望以规范规则来防止“不正当出题”,以弥补所造成的损失。然而似乎也不算成功。严厉的规则不仅挡住了不正当出题,也挡住了“趣味”与“创新”。两害相权,还是取轻吧!毕竟,能不正当出题的人是极少数。首先规范一下自己就好了。尽管最终没有坚持到底,但也算努力弥补过了,不遗憾。

执念,没有了
水至清,又无鱼
剩下的路,该往哪里走?
2019-10-4 16:10
0
游客
登录 | 注册 方可回帖
返回
//