View on GitHub

紫宸

计算机学院拔尖人才工程组

系统能力敏捷之路:安全的逆袭

计算机系统能力培养从来都不简单,要写操作系统,要写编译器…,有没有捷径呢?快速,高效,易于入手(当然,必须有打硬仗,和坚持坚韧的心)。

如果是以前,我会说没有,15年的积累,我们真的探索出了一条非常有效的道路。我称为逆向析构+轻量级构建的系统能力培养。

从2004年开始,积累了8年后,系统能力培养的第一个阶段,逆向析构法成熟了。它是以逆向析构为抓手,快速融合并使用各种系统知识。这以《老码识途》的出版为标志。但其缺点是构建少了,所以不够扎实快速。

2014年~2019年,经过实践,我们形成了以病毒撰写为抓手,通过精心构建的阶梯教程使得学生能轻松快速地掌握病毒的相关机制,并以此为核心,通过汇编的撰写,快速地形成颇为客观的系统能力。结合逆袭工程。形成更为全面扎实的培养。

在大学一年级和二年级的少数学生中实施了该方案,观察到了可喜的结果。他们在大约半年的业余时间学习后,不仅完成了插件化画板,还能撰写病毒。而之后,他们就自动具备了一定深度的逆向分析能力,而且,在之后的自学中就能独立完成实验性的操作系统撰写。他们在画板练习和病毒撰写中,并未学习过C++,汇编语言,计算机组成原理,操作系统,数据结构等相关知识。只是会一点最基本的C语言。因此,他们完全是采取了做中学的方式。

为什么在如此多的基本课程没有学习的情况下,他们能自学成功。我以为是因为主线—病毒的实验和教学材料,进行了诱导式,阶段化的细分和引导,才能慢慢帮助他们度过难关。这又涉及到系统级思维训练的内容了。总之,初期精心的诱导性设计,加后期的放飞,就解决了中国学生开始不知所措,野外生存没有方法可借鉴的问题。我问过两个学生,他们并没有病毒的基础,在50个实验中,他们没有参考任何纸质或网上的关于病毒的资料。这就是考验教学内容的设计了。

它包括以下几个阶段,其中时间包含了正常学习在内,并非全部用于完成此教程。

我初略算了下,全部完成大约需要15.5个月,也就是1年又3个月。如果算上暑假和寒假能有更多利用的时间,充分利用真的可能在二年级上学期全部完成此教程。这时,你真的可以称为一个高手了,远超许多同龄人和许多研究生。慢的话,用整个一二年级来完成,也是完全能做的到的。

当然,你可以进行不同的裁剪。

最精简版:

(1)(2)(3)的3.1.1,3.3.1,3.4.1共6个月,完全可以在1年级完成。

扩展版

(1)(2)(3)共9个月,做得快可在一年级或,二年级上学期完成。

安全路线

(1)(2)(3)(4)完成了第二版后,如果你想转攻安全攻防。则增加第(4)部分,共需11个月。这时你有可能在二年级第二学期开始时完成。

完整版

(1)(2)(3)(4)(5),那就是再花半年写个小操作系统了,这就完美了。争取在三年级开始时已经完成这一任务吧。你已经是一个绝对的系统级高手了。

具体的5个阶段如下:

  1. 画板系统实现 (1~1.5个月)

    这个阶段大约用1个月来完成。只需要具备基本的C语言基础即可。它的目的有几个:一是积累代码量,形成代码的语感。二是在不断的迭代中体验软件开发中的迭代和维护对设计的需求,从而导入面向对象设计,设计模式,插件式编程,C++对象模型等。这些经历,许多研究生都未经历过。是否觉得太难。难,也不难。主要开你怎么学,主要看你遇到了什么样的教学设计。

    这时,基于dll的真正的插件实现在这里暂时搁置下来。因为我们需要底层能力,才能真正理解这部分。它将在(2)完成后,回来实现。

  2. 病毒撰写(3个月)

    我撰写了700页ppt和5000行代码的实验资料。通过最多3个月的撰写,你就具有了基本的底层能力。这是本学习路线中最精华的部分。许多系统重要的概念都在这里面打磨形成,什么代码重定位、程序加载、PE格式、自定位代码都在这里面活灵活现。

    你不仅具有了直接的安全能力,更具有了能很好自学扩展的底层基本能力核,这就是我们的系统观。

    这里面有几个练习题,比较有挑战性:

    实现多引导的程序

    实现运行时库的感染和检测

  3. 逆向淬炼(13周)

    这三个部分可以选择。3.1和3.3是必须做的,最多用6周。而3.3也可以用更精简的做法,大约是4.5周即可。

    • 3.1 这时,我们会直接做两个难度不同的逆向分析题目。(两周)

      • 3.1.1一是逆向分析出fort的中获得listen端口的进程名的函数的名字与用法,并用C语言实现一个。(3天到一周)

      • 3.1.2二是破解win.rar的注册提醒机制。(一周)

    • 3.2 当然也可以进行更多的逆向分析练习(两周)

      比如:

      分析VC的异常机制的实现(一周)

      分析java的死循环是通过什么样的机制终止循环(3天)

      分析.net的JIT即时编译是实现机制(3天)

    • 3.3

      • 3.3.1期间,可以将《老码识途》的第1章第2章做一遍(特别是第二章中解决telnet管道的问题,最好自己先解决,再来参考。这是个非常有趣有挑战性和应用价值的考验。),然后将第4章和第6章做一遍。依据第4,6章的知识,将第(1)步中画板的插件式编程这正实现为基于dll的插件。(三周)

      • 3.3.2然后,利用自定位代码实现第7章中的GUI框架。(一周)

      • 3.3.3最后,完成一个简单的API钩挂的实现。(4天)

      本阶段完成,我们会有了足够的逆向底层运用能力。不仅是逆向分析,更用它完成了框架设计。对框架设计也有了进一步的斩获。

    • 3.4 链接的学习 2周

      • 3.4.1学习《老码识途》中关于链接的初步。完成3.3节的内容,特别是3.3.3小节看懂了一定要自己实现。

      • 3.4.2写一个coff格式的lib的符号查找器

      • 3.4.3完成基于链接的钩子

    • 3.5 做一个pE的加载器 2周

  4. 安全线提升 2月

    • 4.2 学习溢出攻击

    • 4.3 利用钩子隐藏进程和文件列表

    • 4.4 实现一个通用的钩子框架

    • 4.5 实现基于钩子的windows下端口复用框架

    • 4.6 用C++写shellcode

  5. 撰写一个小操作系统 6个月