atum@Tencent % cat blog/how-to-make-a-good-ctf-challenge.md

怎样出一道高质量的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 外卡赛)
    → 以高级赛题和顶级赛题为主。

智障赛题和垃圾赛题应尽可能少地出现在任何比赛中。