怎样出一道高质量的CTF赛题
我们战队 r3kapig 为刚刚结束的 DEFCON 外卡赛之一的 Baidu CTF 提供了 10 道赛题(一共 13 道),并作为比赛的总裁判把控了比赛的赛制、部分规则以及赛题质量。 Baidu CTF 是一个新生的外卡赛,我们也做了一些尝试,比如让 AEG 战队和人类顶尖战队在比赛中同场 PK。虽然在不断试新的过程中出现了不少小问题,但是在大家的共同努力下,我们还是贡献出了一场合格的外卡赛。
今天,我想以这场比赛为契机,来谈一谈我个人对 CTF赛题的理解
一场 CTF 应该考什么?
在进入正题之前,我想问一个开放性问题:
一场 CTF 应该考什么?
你可能会回答:PWN / RE / Crypto / WEB。
这个回答很棒。
如果我进一步问:
PWN 应该考什么?
你的答案或许是各种各样的漏洞利用技术的熟练掌握,如:
- house of orange
- house of roman
- fastbin attack
- unsortedbin attack
- tcache attack
- …等等等等。
如果参与过比较接近实战的 CTF 比赛,你的答案也可能是各大主流平台的漏洞利用技术,如:
- 浏览器利用
- 虚拟机逃逸
- 内核提权
- 等等。
考了这些,也就相当于填上了 CTF 跟实战之间的鸿沟。
不过,这些都不是我的答案。
而且,我认为这个问题本身就问得略失偏颇。
所以接下来,我想从这些问题出发,介绍我现阶段对 CTF 的一些想法和观点。
这些观点和想法并不一定是正确的,但是,我非常希望这些观点能够抛砖引玉,促使大家一起去思考这些问题。
一场 CTF 不应该是考试
我认为 CTF 不应该被定位为考试。
众所周知,考试的主要目的是考察选手对知识的掌握和灵活应用。
将 CTF 定义为考试,也就意味着赛题大多数都是侧重于考察主流技术的掌握和灵活应用。
然而,安全技术的发展是非常迅速的。
对于安全研究而言,探索新的挑战的能力更为重要。
不幸的是,现在国内的大多数比赛都将 CTF 定位为考试。
赛题的考察内容大多也都是已有知识的掌握,如我在开头中提到的这些各种各样的漏洞利用技术等。
有的比赛甚至像考试那样全程电磁屏蔽,使得引导选手探索新的技术成为了不可能(因为上不了网)。
因此,这个问题应该换一种问法:
一场 CTF 比赛应该有怎样的赛题?
一场 CTF 应该有怎样的赛题?
在回答这个问题之前,我首先要介绍一下我认为的 CTF 的 赛题类型:
1. 智障赛题
考察点为无意义的脑洞,或考察点太过于简单。
例子:给一个带密码的 zip 包,提示是“弱口令”,然后让大家去猜。
这类题现在越来越少,这是一个好现象。
2. 垃圾赛题
考察点有难度却较为无聊。
例子:某些混淆后的代码的逆向。
如果题目只考察选手能否耗费巨量时间把带混淆的代码逆明白,那就是垃圾。
正确的做法应该是通过精巧设计来分享一种新的混淆或反混淆方法。
然而在一些自认为高质量的比赛中,这类题目仍经常作为“高质量难题”出现。
3. 初级赛题
主要考察对主流技术的掌握和灵活应用。
比如:考察 glibc 堆中各种利用技巧。
做题人只要熟练掌握这些技术,无需 Google 即可解出题目。
4. 中级赛题
可以说是初级赛题的加强版,但仍无创新。
例如,通过增加限制来增加堆题的解题难度,但仍然可以用已有利用技巧来绕过。
我认为现在国内大多数比赛中,初级赛题和中级赛题仍是主流。
5. 高级赛题
这类题目在国际赛中比较常见。
赛题的考察点对绝大多数选手来说是陌生且有趣的,出题人通过精心设计,引导选手学习新的 idea 和知识。
例子:
- DEFCON 27 Quals 的 Hotel California
- 考察 Intel TSX(事务性内存)的使用。
- TSX 对大多数人来说陌生,但题目能引导选手去学习相关知识。
- 不过最后的利用技巧与 TSX 关系跨度较大,容易误导思路。
6. 顶级赛题
满足高级赛题的所有条件,且对选手来说更加友好。
例子:
- HITCON CTF 2017 的 babyfs
- 引导选手学习 glibc File Object 的内部机制。
- 难度高,但过程能持续学习新知识。
值得注意的是:
当一个新的利用技巧第一次被引入时,它是高级或顶级赛题。
但当它广为人知后,再用同样技巧出题,就会沦为初级或中级赛题。
高质量 real world 赛题的兴起
现在 real world 赛题 慢慢开始火起来,并被认为是高质量赛题。
我认为一个重要原因是:
real world 攻防对多数做题者来说既陌生又有趣。
但同时,这也意味着:
如果未来有一天大家都掌握了主流平台的利用技术,那么再想出一题高质量的 real world 题将变得非常困难。
最后的总结
一场 CTF 比赛应该有怎样的题目?我的看法如下:
面向新手选手(如校赛)
→ 以初级和中级赛题为主,引导他们学习新的知识。面向兼顾老队与新秀的比赛
→ 平衡初中级与高级赛题比例,兼顾难度与成本。面向国际顶级战队(如 DEFCON 外卡赛)
→ 以高级赛题和顶级赛题为主。
智障赛题和垃圾赛题应尽可能少地出现在任何比赛中。