查看原文
其他

看雪CTF从入门到存活(六)主动防御

看场雪 看雪学院 2019-09-16
本文为看雪论坛精华文章
看雪论坛作者ID:看场雪


精彩回顾 | 看雪CTF从入门到存活


汽车是现代生活的常用品。

为了安全,汽车设计者会在汽车上装备安全带和安全气囊,有些高级的汽车还有溃缩式车架设计,其目的都是为了防止发生设计者不愿意看到的结果:车内的人员受伤。

然而,在大多数时候,保障汽车及车内人员安全的,并不是安全带和气囊,而是刹车和方向盘。

在这个领域,安全带和气囊,被称为被动安全措施,刹车被称为主动安全措施。

显然,主动安全措施是常用部件,而被动安全措施是不得已的最后防线。




在设计KCTF的防守作品时,防守方都会在攻击方寻找正确答案的路上设置各种障碍以防止发生防守方不愿意看到的结果:被破解。

这是被动防御。

其实也可以使用主动防御。其思路是:防止攻击方走向正确答案的方向。
 
此次出题,笔者想研究尝试一下,系统化地使用主动防御技术。
 
什么是主动防御呢? 

举个栗子🌰:
 
笔者多次参加KCTF,从来没有胜出过。

Q老师说:“要想作品存活,ccfer是个巨大的威胁,最好的办法是趁比赛那2天拖他出去吃喝玩乐,不让他碰电脑,这样存活的可能性会大很多。” 

这虽然只是句玩笑话,但仔细想想,却很有道理,直接有效。

这,就是一种主动防御。
 
回到技术面来,主动防御都有哪些方法和技巧呢? 

为了寻求答案,笔者专门向某高校马克思主义学院的D教授求教。

经过D教授的悉心指导,笔者对这方面的战术有了一定的了解。
根据所学,结合具体数字化载体,设计出了叹息之墙系列作品之三:部落冲突。
 
部落冲突一题,虽然从表面上看,与叹息之墙和七十二疑冢很相似。 

但是此题中,只有两成是传统的被动防御,八成部分是主动防御。

下面,本文将详细介绍此题是如何使用这项技术的。

主动防御的目的,就是让对手不要走正确的破解之路。而不是像被动防御那样,在正确的破解之路上设置重重困难。




所谓“让对手不要走正确的破解之路” 

讲人话,就是“把对手往沟里带”。

但对手并不傻,很多时候攻击方比防守方更聪明。 

要想带对手进沟,防守方必须首先透彻了解攻击方,特别是其人性弱点(知道为什么是马克思主义学院了吧)。
 
如何利用人性弱点,把对手引上指定的路,并且雷打不动坚定不移哪怕历尽千辛万苦也无怨无悔一去不回头呢? 



理论部分





通过学习,笔者了解到,过程激励理论给出了上述问题的答案。

其中有三大理论:期望理论、公平理论、强化理论。


>>>>

1、期望理论


期望理论关注2个概念:效价和期望

效价指这个步骤对达成理想目标的重要程度。

期望指对自己能成功完成这个步骤的可能性的估计。

大致意思是:当人认为某件事做成之后对自己很有价值且自己很有可能做成此事 那么他就会很愿意去做这件事。

在本题中,如果把一件事摆在攻击方面前,并且让他意识到“只要做成了这件事就能向破解此题迈进一步”,且他是能做成这件事的,那么攻击方就会去做这件事。

那么,出题方该如何把‘沟’伪装成一件有效价且期望高的事呢?请见后文。



>>>>

2、公平理论


公平理论描述的是:心理账户追求平衡。

意思是:人人心中都有一杆秤,人人都有追求公平的欲望。

所谓公平就是:更多付出就应该有更多收获,人需要心理上的一种收支平衡。
如果让攻击方觉得此题公平,他就会继续破解下去。

反之,如果攻击方觉得,如此付出是没有收获的,或者收获不佳的,那么他就会干别的去。

公平,可以体现在两个方面:纵向公平和横向公平。

纵向公平关注的是:现在的付出比过去的付出多,那么现在的收获就应该比过去的收获多。

横向公平关注的是:自己的付出比别人的付出多,那么自己的收获就应该比别人的收获多。

如果让攻击方觉得,他在此题中的努力越多,就越有可能破解此题;他的努力比别人越多,他的破解机会就比别人更大,那么他就会愿意干下去;虽然他在这道题上花了更多的时间,但一旦成功就能获得更高的奖励。

如何让攻击方感受到这两种公平呢?请见后文。



>>>>

3、强化理论   


强化理论关注的是:刺激与行为之间的函数关系。

强化分为正强化和负强化。

正强化指:由于一刺激物在‘个体作出某种行为’后出现,从而增强了该行为发生的概率。

讲人话,当攻击者在做完一件事之后,如果能够得到某种奖励,那么他将来就会更有可能继续做这件事。

反之,如果人做完一件事后,受到了惩罚,那么他将来就倾向于避免此事,此所谓负强化。

如何能够让攻击方在走上出题方预设的错误之路时,不断得到奖励,以使之继续走下去? 

如何安排这些奖励的类型、大小、频率?请见后文。


线索和目标





在讲具体实施方法之前,笔者还想铺垫一下,先引入一个概念:线索。
 
所谓线索,是在游戏的特定阶段,给攻击方的一个提示,能够为攻击方指出本阶段的探索方向或本阶段的答案。

在每个特定阶段,可以存在一个或多个线索,这些线索可以指向同一个方向 也可能指向不同方向。


在每个特定阶段,除了线索以外,其它信息应该都是无贡献的。

线索有很多种形式 包括但不仅限于: 
一种特殊的指令(比较、跳转、异常等) 
一段特殊的数据(字符串、资源等) 
一种数学关系(满足某个方程、满足一定的过滤器等) 
 
原则上讲,所有KCTF的题目,都是由多个线索组成的,将攻击方引向最终的正确答案。

站在主办方的角度,为了公平,看雪规定必须有正确线索链,且顺着正确的线索链应该能在5分钟内走到正确终点,如果出题方无法证明这条正确线索链的存在,就算违规。

站在防守方的角度,为了胜出,根本就不想给攻击方留下线索,那些留下的 要么是不得已,要么是不小心。

我们细分一下:

1)所有的不小心,理论上都是可以避免的,这里不讨论。

不得已,可以分为主观和客观。

2)主观上的不得已,是因为必须符合看雪的规定,必须要留下正确线索链。

3)客观上的不得已,是由于技术原因,为了达成既定的业务目标,难以避免地留下了线索(上一篇已经描述过 这种不得已是可以通过单向函数或单向陷门函数所避免的)。

显然,一个无设计缺陷的CM中所留下的线索,只有一种情况:防守方为了满足规则而故意留下的线索。
 
笔者经过一些探索发现:如果出题方掌握了正确的出题框架,在出新题时避免出现过去的失误且不引入新失误,则这个过程一定能把CM引向存活。
 
但是,在这个过程中,除了能够走向存活并最终成功以外,似乎并无多少其它成果或乐趣。

相反,这是个很乏味的过程。

拿魔法森林举例,它避免了密室逃脱的“不小心”同时加大了埋藏线索的深度,最终使得破解者数量明显减少。

可以预见的是,如果作者沿此数学模型继续加大埋藏线索的深度,这个破解人数还会继续下降,直至最终为零。

但同样可以预见的是,此题存活胜出之日,也就是此出题思路寿终正寝之时,躯体活下来的那天,也就是灵魂死掉的那天。
 
当笔者想明白了这一点后,跟一些“老人”交流。发现他们大多早就已经参透了这一点,早已经不是为了名次和胜出而参赛 而是追求一些更高的东西。
 
于是,笔者也决定改变出题目标,将来不再以存活作为目标,而是更倾向于实战,同时尽可能多创造些乐趣。

在新出题时,会使用到一些将来在商业实战环境下用得上的方法和技巧。

如果胜出,则说明这些方法和技巧是有实用价值的,也算是对所有参与者的一种回馈。
 
铺垫结束,下面开始详细介绍,如何给对手挖沟。


如何给对手挖沟?


>>>>

1、纵深  


CM一定有一条解题捷径(否则违规)。

值得注意的是,出题方应该在不违规的条件下,尽可能隐蔽这条正确线索链 这样才能为后面的“挖沟”留下足够的纵深。

打个比方:如果攻击方需要走10步才能看到正确线索链的第一个线索,那么那些有意布置的误导线索链的起点必须在10步以内。

也就是说,正确线索链越是隐蔽,那么可挖沟的空间就越大。

这里,不得不提到一个硬性要求:正确线索链的总长度不能超过5分钟。

如果正确线索链由5个线索构成,那么第一个线索大约就1分钟。

如果想挖沟,那么沟的起点必须在这1分钟之内出现。


>>>>

2、起点


根据期望理论,首先要给出有吸引力的效价! 

在部落冲突中,一眼望去,数据看上去都是随机的。

看到什么,才会让攻击者觉得是对破解有价值的呢?
 
答案是:任何看上去不随机的数据 都会显得有价值! 
 
什么样的数据会不随机呢? 

笔者一共设计了3道沟:字符串、机器码、素因子。

1)字符串是肉眼可见的。

随机数据中是不易出现可读字符串的。

此题中选用的字符串是:暴 风 雪(题目中已给提示)。

首次出现时,用的是明文,且出现在串首,极易被发现。

2)机器码是十六进制的可执行代码 。

随机数据通常不是可执行机器码。

此题中选用的机器码是来自于经典的exe代码片段。

一般人不容易识别出来,但是职业破解者大多能一眼看出来(如果攻击者把它当作代码看的话)。

3)素因子是指一个整数的最大素因子。

随机整数的最大素因子的长度通常是整数长度的70%左右 如果长度偏离太远 说明这个整数异常(可能不随机)。

此题中选用的首个数字是一个素数,它的最大的素因子就是它自己,其素因子长度达到了其整数长度的100%。

这一线索一般人难以识别,但是对于算法神经特别敏感的人,这个特征非常明显。
 
这3道沟的起点,类型不同,难度不同,分别适合于不同偏好的破解者。

总结:根据期望理论,给出对攻击方有明显吸引力的线索,并且让他感觉到 这条线索十分清晰,很有把握。


>>>>

3、强化


如果光是一个起点,且时间不超过1分钟,哪怕能暂时吸引到攻击方的注意力,也消耗不了多少时间,不足以掩护正确线索链,所以需要使用强化理论持久地拖住破解者。

由于部落冲突的大部分数据都是随机的,不会给攻击方有吸引力的线索,已经走了极端,没有比这更加“负面”的反馈,因此在此题中无法采用“惩罚”之类的负强化手段,只能使用正强化。

讲人话,只能在破解者走上误导线索链时,给出鼓励,而不能在其摸到正确线索链时给出否定(那就成了此地无银了)。
 
所以,在破解者遵循了前面给出的线索时,应该让其得到鼓励,能看到下一个线索。

如果破解者不遵循前面给出的线索,就不让他看到任何有价值的信息。

于是,一系列预设的线索,就构成了线索链,一步一步黏住破解者。

但是,问题来了。

第一个线索是破解者不超过1分钟就要能找到的,如果每个线索都只能消耗破解者1分钟的时间,要想拖过48小时,至少需要2880个线索。
 
有更好的设计方式吗?

有的!

在攻击方在沿着线索链不断推进的过程中,要让其体会到一些成就感,以作为正面强化刺激物为延长‘单点线索粘连时间’创造条件。

虽然,顺着线索能够找到下一个线索,本身就已经是一种鼓励了,但事情不是这么简单。

根据强化理论,获得成就感的强度,是与为了达成此成就所需要付出的代价成正比(原来女方要求那么重的聘礼 是为了让男方有成就感啊)。
 
代价可以分为:工作量和难度。

因此,为了提升成就感,就需要提升获得线索的工作量和难度。

1)提升工作量 

一般的游戏中,第一关往往都比较短,通常只是用来让玩家了解游戏规则的,但是后面的关会变长,有的甚至会很久都冲不到球门跟前,需要玩家更加地坚韧。

在破解者寻找下一条线索的过程中,出题方应逐渐扩大搜索规模,使得破解者干的时间变长。

只有延长时间,才能让破解者尽兴。

但增长的幅度不能一次太大,否则容易一下子拖垮“玩家”(一旦破解者不在这玩了 就有可能晃到正确线索链上去玩 那样就不好了)。

 
但是,提升工作量,累的只是机器,破解者并无多少脑力输出。

只是这样还不行,还需要让破解者脑子别闲着。

 2)提升难度 

下一步的线索,不能与以前的线索相同,否则,攻击方针对以往的线索,一次性地编写了搜索程序,就能顺便找出后面的线索。

新的线索 一定要在“质”上突破前面线索的规律,才能把破解者(人)卷进来,因此,分别针对3道沟,此题给出的难度提升方案是:

1.1 字符串 

字符串的种子是从集合{暴、风、雪}中选出的,首次使用时是顺序选择的,但后期改为随机选择。

字符串出现的位置,首次使用时是在串首,但后期改为随机整字节位置,再后期改为随机比特位置。

字符串的值,首次使用时是种子的原始值,后期异或上一个随机干扰值,干扰值的汉明重量从0开始逐渐增加。

1.2 机器码 

机器码是一个程序片段。

首次出现时,用的是一段编译器产生的标准开场白。

但后期改为CM中的某个代码片段。再后期改为某个代码片段。

1.3 素因子

线索是一个定长整数(256bit)。

首次出现时,其最大素因子的长度是256bit。

但后期,其最大素因子的长度变为256-m bit左右,m从0开始逐渐增加。

这3道沟,随着线索链向后延伸,线索将变得越来越模糊,分析的难度将越来越大,发展到后期就如同泥牛入海(但依然是可分析的)。

这3道沟,理论上是可以复用的,复用后可以起到更好的迷惑作用。

但是,为了掩护正确线索链,这3道并未复用,而把复用的机会让给仅有的正确线索链。


 3)不要矜持,再露骨一点。

是的,当破解者沿着前面的线索,付出了脑力,付出了工作量,找到了新的线索,的确是会有成就感,算得上是正强化,但是还是含蓄了。
 
来点更直接的吧! 

在攻击者沿着出题方既定的误导线索链艰难摸索的路上,我们干脆拉出横幅 用看得见的方式喊出对攻击者的爱! 

“恭喜你!……” 

这种做法,如果是一个一般敌手所为,也许会让破解者反生疑惑“这会不会是个陷阱?” 

但是,如果这话是一个知名的“喜欢讲故事、喜欢给对手提示的骚包”讲出来的,几乎不会有人警觉到自己走错了路。

4)强化策略 

强化理论指出,固定频率地给出强化和增加强度,并不能达到最理想的效果。

推荐强化策略是:在开始的阶段即时强化,到了后期应该逐步转向间隔强化。

强度不应是简单递增,而应该是潮汐式增涨,一波一波地涨起来。

具体细节:略。


实施





本题通过铺垫三条不一样的线路以完成把对手引向沟里去的目的。

具体过程如下:

这三条线路各自起着不同的作用:

第一条线路是一个诱饵,既包含正确的思路答案,其中也有精心布置的大坑。

这条诱饵起着让鱼儿上钩的作用。

三种坑铺路,难度递增,总共20步。
 
第二条线路则是在诱饵将对手引到错误的道路上后对对方所选择的道路的进一步肯定。

让对方以为自己走上了正确的道路。

同样三种坑铺路,难度递增,总共128步。

这便是主动防御的目的。

因为如果对方走上错误的道路,其发现正确道路的概率便又降低了一点。
 
第三条线路则是正确的道路。

clue为随机性异常,三步一设,总共30步即可。



情感




>>>>

感受公平


让攻击方在沿着误导线索链探索时,始终保持着良好的情感状态,对于此题的胜出是至关重要的。

公平理论在这里发挥了重要的指导作用。

为了让攻击方感受到公平,除了在攻击方成功找到下一个线索时给出相应的正强化(纵向公平)。
 
还应让攻击方感受到横向公平。

因此,本题在那些露骨的横幅中,增加了与其他攻击方对比的话语:“恭喜你!你已经领先看雪14%的破解者”。
 
(14% 27% 37% 46% 54% 60% 66% 71% 75% 79% 82% 84% 87% 88% 90% 92% 93% 94% 95%) 

稍微有点理智的人都不会相信这些数字,但这不重要。

重要的是,这是一种心理暗示,暗示着这是一场公平的比赛。

出题方除了希望让攻击方拥有良好的情感状态以外,还有一些注意事项。



>>>>

控制焦虑


控制攻击方的焦虑程度,对引导战局非常重要。
过度焦虑,会导致人的分析力和判断力迅速下降(警方在与劫持人质的罪犯谈判时经常用这一招)。
相反,完全顺风时毫无紧张,也会使人创造力发挥不出来。
唯有适度的焦虑,能够有效激发破解者体内的创造力,脑洞大开,对防守方最不利。
所以,出题,要么让破解者很爽,没有机会发挥创造力,要么让其极度焦虑 甚至心态崩溃,尽量不要让破解者处于可控范围的焦虑中。

>>>>

避免质疑


质疑也可以认为是对自己的反省,检视自己过去的做法是否有误,是动物的一种让自己脱困的本能。
所以,要想把破解者困在沟里,就要尽量避免他产生质疑(那些在警察的劝阻之下,依然要坚决转账的可怜的老人家,显然是被切断了质疑神经)。 为了让破解者在此题的沟中安心淘宝,必须要使其坚信:如果有宝贝,那它就一定在这沟里!
所以,在出题时,是首先在沟的尽头真的安放了“国王”设计完此题,然后最后替换成”王后“。

觉悟

为什么攻击方会在误导线索链上折腾几个小时,甚至几十个小时,却没有跳出来想想: “不对呀,这题应该在5分钟之内就可解的,我怎么折腾了这么久?是不是路子不对呀?” 
不是他们没想过,而是,即使想了一下,但却又回到了老路上,原因是: 1)并无明显迹象表明,还有什么线索是没有被发现的。
关于这个问题,前面提及的“3道沟不复用,唯有正确线索链复用”的设计,起着关键性作用。
所有看起来能够有线索的地方,都已经被找出过线索了。
貌似没有什么地方是应该有线索而未被发现的。

2)被强化的神经,不愿意放弃。
既然前面已经付出了那么多,而且每步都得到了鼓励和肯定,现在又没有什么更好的选择,难道就这么放弃,从头来过? 除非是心理特别强大的人,否则一般做不出’壮士断腕’的选择。
更何况,种种迹象表明,此题与看场雪有着密切的联系。
以此人过往的所作所为推断,这一连串的线索之后,一定有名堂。
否则,如果这样绕了一大圈,最后又没什么结果,看他怎么跟看雪交代。



禁手

由于KCTF只是一个游戏,不能对攻击方形成实质性伤害。
因而“致残”、“致死”等方法,不能在出题时使用。
随之“威慑”、“恐吓”等方法也没有用。
另外,利用破解者的同情心,引其进沟的方法,也不能使用。
因为破解者根本没有这个弱点。



- End -



看雪ID: 看场雪

https://bbs.pediy.com/user-697893.htm  


*本文由看雪论坛 看场雪 原创,转载请注明来自看雪社区




9月10日正式来袭!



推荐文章++++

Web漏洞分析之zzcms多个CVE分析

常见的WMI攻击检测方法

VMP学习笔记之反汇编引擎学习

某企业办公APP逆向TCP协议分析

FART正餐前甜点:ART下几个通用简单高效的dump内存中dex方法













“阅读原文”一起来充电吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存