彭建山 张咪 曹宇
摘 要 针对软件逆向分析课重点培养学生逆向思维能力的教学实际,结合该课程和夺旗竞赛都存在正向逆向对抗的特点,在实践教学中引入夺旗竞赛形式,通过学习效果验证了该教学方式的有效性。
关键词 软件逆向分析 夺旗竞赛 逆向思维
中图分类号:G424 文献标识码:A DOI:10.16400/j.cnki.kjdkz.2015.05.048
Introducing CTF in Software Reverse Analysis Course
PENG Jianshan[1], ZHANG Mi[2], CAO Yu[1]
([1]PLA Information Engineering University, Zhengzhou, He'nan 450002;
[2]He'nan Province Architecture Professional Technology Institute, Zhengzhou, He'nan 450002)
Abstract The course "Software Reverse Analysis" focuses on training students' reverse thinking ability. It has the characteristic of against competition between forward and reverse thinking, so does CTF competition. We introduced CTF competition form in teaching practice, and verified the validity of this method through learning effect.
Key words software reverse analysis; CTF; reverse thinking
软件逆向分析课是我校计算机科学与技术、网络工程专业的必修课程,旨在使学生掌握软件逆向分析的原理方法和工具使用,既是对C语言、汇编语言等课程知识的综合运用,也是后续专业课程学习的重要基础。该课程重点培养学生的逆向思维能力,而逆向思维过程往往是与正向思维博弈对抗的过程。我们观察到该特点,尝试将具有典型对抗特点的夺旗竞赛(CTF,Capture The Flag)形式引入该课程的实践教学,做了一次有益的教学方式改进探索。
1 软件逆向分析课特点
软件逆向分析课安排在第五学期开设,前提课程有计算机原理、C语言与程序设计、x86汇编语言、操作系统结构等,教学内容包括反汇编原理和算法、数据流和控制流分析、逆向分析工具使用、函数工作过程、算法逆向分析实例等。该课程具有以下特点:
1.1 逆向思维与正向思维的对抗
软件逆向分析被涵盖在软件逆向工程范畴内。①软件逆向工程是软件科学和计算机科学的一个分支,它综合了加密和解密、编译和反编译、系统分析、程序理解等多种计算机技术,从可运行的程序系统出发,生成对应的源程序、系统结构以及相关设计原理和算法思想的文档等。②可见软件逆向是对已构建程序的解构还原,从二进制代码出发,逆向猜测、推理、分析出程序原本的功能、逻辑甚至源代码。由于软件在编译为二进制代码时已消除了高级语言中的语义、数据类型、数据结构等方便人们理解的信息,极大增加了逆向分析的难度,所以逆向分析不可能针对软件的所有部分,大多数时候都是在推理或猜测软件作者的意图,以作者的创作思路为线索,抓住逆向过程中的关键部分和关键点,有针对性地解决问题。这个过程与逆向思维过程十分吻合,所谓逆向思维是指从反面提出问题、分析问题、解决问题的一种思维方式,它是与正向思维相对应的一种思维。③因此软件逆向分析的逆向思维是对软件创作的正向思维的目标逆向、方向逆向和方式逆向,软件逆向分析过程可视为与软件作者的博弈对抗过程。
以逆向分析和破解软件的试用时间为例,某些软件会限制运行时间必须在某个时间范围内,否则不能正常运行。破解该保护需要先从软件作者的思考角度出发,考虑有哪几种保护方法,比如判断当前系统时间是否在允许范围内,或通过时间计数来计算已运行时间。逆向分析时应以此为线索跟踪关键函数的调用,如获取当前系统时间、获取程序运行时间等函数,再逐步回溯到判断条件处,定位关键代码。而有些软件作者会将这种破解的思路考虑进去,采用更难以猜测的方法或加入一些干扰技术手段以阻止逆向分析。这个博弈对抗过程往往会随着软件的不断升级一直持续下去。
1.2 知识向技能的转换需要大量实践
该课程的目的是培养逆向分析的思维能力和动手能力,实践是该课程学习的重要环节,有利于对学生兴趣的培养和技能的掌握。我们在实践环节安排了逆向分析工具的使用、函数工作过程的跟踪调试、注册算法的逆向分析等内容,从工具使用到综合运用,实践内容环环相扣,注重能力培养的衔接和递进。而这些实践内容具有很强的专业性,表现在大部分实践过程都是对程序的动态调试,和跟踪汇编语句的执行等操作。在实践过程中,由于汇编语言缺乏高级编程语言良好的交互性和可理解性,如果没有强烈的目的引导,学生很容易在枯燥的调试中失去兴趣。因此实践教学环节的内容和形式设计将直接影响教学效果。
2 实践教学环节存在的问题
在以往的实践教学环节,我们采用了常见的目标导向方式,即为每个实验设定一个具体目标,学生按照既定的技术路线去达到该目标。从学习效果来看,这种方式虽然能够让学生按部就班地解决某些问题,但参与感不强,缺乏举一反三的思考和创新思维意识,在枯燥的实践过程中容易失去学习兴趣。实践内容安排和结果如表1所示:
从完成度可以看出,对于较为简单的验证类实践内容,学生都能按照实验指导书要求的步骤,只要能够较为熟练地使用工具就可以完成;对于综合分析类内容,由于需要发挥学生的逆向思维能力,从看似繁杂无序的反汇编代码中定位关键代码,难度的提升导致部分学生无法完成;而对于难度最大的综合应用类内容则完成度最低,只有少数专业基础较好且兴趣浓厚的学生能够完成。通过调查和分析,主要原因在于:一是软件的加壳脱壳涉及专业知识广且深,门槛较高,学生在过程中容易产生挫败感,无法持续深入;二是加壳和脱壳本质是攻与防的关系,而实践过程中没有体现这种对抗关系,学生没有可参照对比和探讨的对象,难有参与感和自主意识。
3 夺旗竞赛规则及特点
夺旗竞赛指的是软件技术人员之间进行技术竞技的一种比赛形式,起源于1996年的DEFCON全球黑客大会,以代替通过真实攻击进行技术比拼,目前已在国内和国际上广泛流行。主要分为以下两类模式:④
(1)解题模式。又称为线上模式。举办方在互联网上设立竞赛网站,参赛者可自由组队,以团队形式对竞赛网站中的各类挑战题进行解题并在线提交结果(通常是隐含在程序中的flag标识),网站自动计算每队的得分和解题时间并实时公布。解题模式是一种开放式的竞赛形式,一般用于吸引尽量多的参赛者,从中选拔优秀队伍。
(2)攻防模式。又称为线下模式,一般由线上模式选拔出的少数队伍参加。举办方为每支参数队伍设定相同的对抗环境,参数队伍分析程序存在的脆弱性,利用这些脆弱性攻击对方服务器获得flag标识,并提交给裁判服务器获得分数,同时也要修补自身服务器的问题以进行防御。整个对抗过程一般会持续48小时以上,攻防状态会以动态方式显示出来,具有很强的观赏性和高度透明性。
在参加各类夺旗竞赛后,我们发现此类竞赛具有以下特点:(1)团队合作重要性突出。参数队伍中的每位成员分工明确,需要具备某个方面深入的专业知识和技能,知识领域互补,需要良好的沟通合作能力,参与感和自主意识都非常强烈。(2)博弈对抗性突出。攻防模式着重考查参赛队伍间的博弈对抗力,参赛者需要通过逆向思维方式寻找对手的防御弱点,同时也要根据对手的攻击策略修补自身的弱点,这种对抗升级会一直贯穿整个比赛过程。
由上可知,夺旗竞赛与软件逆向分析课在正向思维和逆向思维的博弈对抗上具有相似点,并且十分切合课程实践性强的需求,因此尝试将该竞赛形式引入教学中。
4 竞赛形式的引入和实施
我们借鉴了夺旗竞赛的攻防模式,首先对赛制做了修改以适应教学需求:
参赛队伍:根据学生总人数,分为5~10组,一般每组不超过4人。
比赛环境:在校园网架设一台公共服务器,为每支队伍设定上传账号,且可以下载其他队伍目录。
上传要求:每支队伍编写一个程序并将flag标识隐藏在程序中,隐藏的方式可以采用信息加密、信息隐藏、软件加壳等技术,同时为防止恶意设置不可解flag,要求程序的运行效果为输入密码后显示flag。将程序上传至服务器,上传后不可修改。
下载要求:参赛队伍可下载其他队伍上传的程序。
得分规则:通过软件逆向分析将其中的flag找出来并提交,每提交一个flag加10分,重复提交不得分。
刷分周期:每轮一般为4个课时,在刷分周期内尽可能多地分析出其他队伍的flag。
防御规则:在一个刷分周期后,参赛队伍可根据其他队伍对本程序的分析情况,有针对性地修改flag的隐藏方式,并更新flag内容。上传至服务器以开始下一轮比赛。
赛制的修改主要基于以下几点考虑:(1)夺旗竞赛是集中在一个时间段内完成,而课堂实践时间是碎片式的分散分布,因此将每次实践课时间设为一轮比赛周期,共有3到4轮。(2)夺旗竞赛中每支队伍的环境是相同的,由举办方事先设定。为避免学生陷入到相同的解题思路中,并充分发挥学生的创造能力和专业能力,只规定统一的出题方向,而将题目交给每支队伍自主设定。(3)夺旗竞赛的刷分周期很短,一般为5到20分钟,这种快节奏高消耗的方式适用于经验丰富的专业队伍,而对处于学习摸索阶段的学生来说,留出充分的分析思考时间更为重要,因此4个课时的刷分周期为解题时间,而将分析、消化和防御重建留到更为充裕的课后时间。
设定好赛制后,我们在软件逆向分析课的教学中实施了该竞赛,同时将课堂讲授课时缩短,增加了实践课时。共有8支队伍,4轮比赛,表2是得分情况。
从得分情况可以看出,在第一轮比赛中由于参赛者还不熟悉规则,基础最好的队伍3轻易拿到了其他所有队伍的flag获得满分(70分),很明显此轮的防御都很弱;在第二轮比赛中,各队伍的防御能力明显增强,体现在得分都有下降;到了第三轮,随着攻防经验的丰富和逆向分析能力的提升,大部分队伍得分有明显增长;最后一轮各支队伍尤其是队伍5的得分都较第一轮有了较大增长,说明逆向分析和逆向(下转第129页)(上接第101页)思维能力进步显著。
表2 竞赛得分情况
为进一步提升兴趣和参与意识,我们在赛后交流还安排了经验交流,由每支队伍给出自己的攻防思路和方法,从中发现学生的创新能力超出预期。整个过程中学生都能积极参与,主动交流和查询资料,能够分析对手的技术水平并提升自我水平,能够从每轮比赛的得分中获得成就感,具有强烈的学习兴趣、主动性和自主意识。最后我们还安排了表1的实践内容,完成度基本达到100%,证明将夺旗竞赛形式引入该课程效果明显,达到预期目的。
5 结语
结合软件逆向分析课的实践性和对抗性特点,通过引入具有典型博弈对抗特点的夺旗竞赛形式,提高了学生的参与感、自主意识和创新意识,在竞赛过程中学生保持了浓厚的学习交流热情,并完成了课程知识和能力的掌握。下一步将继续研究其他课程的特点,进一步改进教学方法以更好的达到教学目标。
基金项目:863重大科研项目(2012AA012902)
注释
① Ingle K A. Reverse engineering[M]. McGraw-Hill Professional Publishing,1994:115-120.
② 金涛,陈建良.逆向工程技术研究进展[J].中国机械工程,2002.13(16):1430-1436.
③ 刘汉民.论逆向思维[J].重庆工学院学报,2006.19(9):96-100.
④ 百度百科:CTF竞赛. [EB/OL]. [2015-02-01]. http://baike.baidu.com/link?url=_HvWv-etKFfRUEYhnovPmABy1TLQ5wTuVZrTVujhCWj7t49VZijBZN 0UqJEZV6pFD4s8f5se4NOWJAvwIu_.