看雪CTF是圈内知名度最高的技术竞技
其规则设置严格周全 既给了防守方足够的施展空间 也避免过度浪费攻击方的时间
从攻防两个角度看 都是个难得的竞技和学习机会
本人初步涉足这个领域 见识了许多大佬们的‘惊人’能力
例如:精通数学的ccfer、无坚不摧的风神、每‘猜’必中的po叔 等等
每次打开精化wp 都觉得醍醐灌顶脑洞大开
对dalao的仰慕之情 如滔滔江水。。。
(好 下面我们开始说正题)
我曾思考 是否存在一种可公开的通用方法 它能够设计出无限量个算法不相同的CrackMe 使之都能满足看雪CTF的规则且无人能攻破?
常识告诉我们 这个答案应该是不存在的
因为 如果它存在的话 那么应该会有人在CTF比赛中使用过吧?应该战绩不错吧?
我们来看看历届比赛‘存活’下来的作品:
1)看雪 2016CrackMe 攻防大赛 第十二题。未公开wp 不好判定该方法是否可以继续产出其它算法不同且不会被攻破的CM
2)看雪.Wifi万能钥匙 2017CTF年中赛 无作品存活。
3)看雪.TSRC 2017CTF秋季赛 有2件作品存活
3.1)第九题 九重妖塔。此题除了使用‘动态地址加载dll’、‘静态完整性检查’、‘用校验和解密代码’、‘监视调试寄存器’等常规反跟踪反调试手段以外 最重要的防护是‘自定义安全算法’、‘双重VM’,堪称CM防守作品的代码流防守典范之作
3.2)第八题 cm2017-ccfer。此题涉及知识包括:IFFT变换、频域滤波器等 除此以外还利用整数运算替代了浮点运算并使用查找表加速。可以说 此题是CM防守作品的算法流防守典范之作
(是否有的作品其实设计思路很好 但是因为‘阴沟里翻船’而未能存活下来呢?应该会有。但是我们暂时无法进行评价)
在欣赏了高手作品以后 让我们来静静想一想 他们的手法是可复制的吗?
我所说的‘复制’并不是copy他们的代码 而是 他们的设计思路还能产出更多的CM吗?
他们思路产出的更多CM 依然能够像他们的第一次CM作品那样 在比赛中存活下来吗?
此时我们不得不回头来考量一下攻击者们
看雪是个交流和学习的好场所 其中有像我一样的初学者 也有让人不可望其项背的高人 而更多的活跃者是正在快速进步的战士们
虽然攻击者参差不齐 但如果作品想存活下来 当然只能瞄准那些破解高手的水平了
让我们来看看这些高手们具备哪些特征吧
1)在CrackMe相关领域中 但凡是已知的成熟技术和工具 就没有这些高手不熟练的(只要是有成熟技术能解决的问题 没有他们解决不了的)况且他们还有自制的神器
2)这些高手是可以不吃不睡不上班的(其实实际情况是 就没有几道题能迫使他们这样做)
3)尽管高手们一般不需要帮助 但任何人都无法阻止高手们互相帮助(所以不能假设高手有知识盲区 高手们私底下关系都很好)
OK,看完这些 作为防守方 你该绝望了吧
其实 我也绝望过
当我认识到上述事实之后 我知道 这些高手是不可阻挡的 至少是我不可阻挡的
可毕竟有作品活下来了呀?!
让我们回顾一下 那些曾经的存活作品
那些靠‘代码级’防护手段能存活下来的作品 用一句不客气的话说 叫‘见光死’!(如果冒犯了作者,请恕罪)
同样的防护手段 如果故技重施 恐怕难以达到‘第一次上市’时的存活期
如果下次还想存活 必须要绞尽脑汁设计新的‘坑’
而那些‘算法流’的防护手段呢?感觉好一些
假如作者换一个算法 应该又能挡住一波攻击者 似乎可以立于不败之地
但是 这种方法 对普通参与者来说 是不可复制的 因为普通参与者难以具备算法牛那样的理论功底
而且 即便是算法牛 每次要给出一个新的算法 新的CM 也都需要付出不小的设计和实现代价
所以 看起来 不管是走哪条路 防守方付出的成本都远高于攻击者的成本(48小时或者至多1周)
想得到一种公开通用的方法 能够低成本地产出CM且每个CM都能有效阻挡破解者 真的就不可能吗?
让我们来换个角度看问题
假如看雪的规则放宽一些 允许防守方保留一个解密私钥
那么防守方将很容易设计出一种‘基于非对称密码算法’的CM 轻松挡住所有的破解者(就如同WannaCry的设计那样)
当然 这是看雪规则所禁止的!
但是 这个例子说明了一个道理:之所有防守作品能够存活下来 是因为CM中隐藏了某些‘攻击方不知道的知识’,或者‘攻击方暂时没找到的秘密’
让我们来看看 这个道理对不对
1)在九重妖塔中 双重VM及其handle就是这个秘密。在攻击者还不知道有2层VM时 不知道每个指令的handle时 不知道OnTimer中检查了硬中断寄存器时 破解是困难的。但一旦破解者知道了这些秘密 破解只是个时间问题 而且不会很长。而下次作者如果还想获得这样的存活期 恐怕代价远不止1周
2)在cm2017-ccfer中 IFFT变换和梳理滤波是大多数攻击者不知道的知识。但一旦见光了 这招就不好用了。下次作者再换个题目 至少也得多白1根头发吧(开个玩笑哈)
而我前面说过了 “不能假设高手有知识盲区”
换句话说 能够挡住破解者的唯一方法就是:在CM中隐藏一个‘攻击方暂时没找到的秘密’
到这里,摆在我们面前的问题是:CM到底怎样隐藏这个秘密 才是破解者暂时找不到的呢?
我的好朋友Q老师劝告我 此问题是无解的
因为CM一定是可以运行的 且处于白盒攻击环境 所以此题无解
这里我解释一下白盒这个词 它的意思是:
1)攻击者可以任意查看执行的代码,可以任意修改代码
2)攻击者可以任意查看运行的数据,可以任意修改数据
3)攻击者可以任意反复执行上述操作
看雪CTF比赛 正是这种白盒攻击环境
不仅是Q老师 有其他高人也持有与他相同的观点 劝我死了这条心
但是我很执(pian)着(zhi),一定想去试一试
于是 我抛出了‘密室逃脱’一题
这道题代码很短 算法很直白 但是我在其中隐藏了一个秘密
我的设计是:只有找出了这个秘密 才能逆推出正确的序列号
(我希望CM尽可能简单 这样就能让攻击者直接下手挖掘这个秘密 以验证我的设计是否安全)
但是 对不住观众的是,我的题目很快就被攻破了 而且全部都是‘非预期解’
没有一个破解者是真的挖掘出了我隐藏的这个秘密而破解此题
反而是因为找到了我不小心留下的2个bug而迅速破解了
好尴尬。。。(其中那个‘不逆推而顺着跑’的破解思路 实在是令人钦佩)
虽然这一题已经被破解了 但到目前为止 并无人宣称 真正发现了我隐藏的秘密
(也许是因为题目已破 他们不再有兴趣了)
但这对于我来说 也算是一种鼓励
至少 对于我提出来的这个问题 并没有被立刻拍死 我还是有机会成功的!
最后 感谢看雪的平台 感谢各位大佬们垂青出手!
争取下次再奉献上更好的作品!
(我还会回来的 的 的...)
看场雪
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-1-11 19:24
被kanxue编辑
,原因: