CTF逆向选手入坑指南
2020-02-27 17:35:09 Author: www.secpulse.com(查看原文) 阅读量:255 收藏

       从实际业务来看逆向包括很多的方面,比如拿到某个无源码的程序根据其在OD或IDA中的生成的反汇编代码逆向还原某功能的实现逻辑来进行功能的仿造,或找到其程序验证部分直接修改跳转达到破解其收费的目的,又或者分析出某收费商业软件或勒索病毒的加密算法来编写批量生成注册码的注册机或着勒索病毒解密工具等等,这些都要用到逆向技术。逆向技术在实际业务中一般应用于以下几个方面:二进制漏洞挖掘、软件破解、恶意代码分析、竞品分析等。

       在这里实际业务中的逆向因为涉及的知识面太广且鄙人水平有限就先不提了,就聊一聊CTF中的逆向吧,因小弟以前是搞PC端病毒分析和软件破解的,CTF中的逆向也是刚接触,有写的不对的地方还请各位大佬斧正。


       PWN和MISC中的某些涉及到一些逆向知识的题目就先不提了,就谈在CTF中最常见的逆向题吧。

      其实CTF逆向题无论是哪种语言(python、CC+、java等),哪个平台(Windows、Linux、Android等)都离不开这两大项:

1、 暴力破解:逆向中的暴力破解和web中的爆破还不一样,这里的暴力破解主要是通过修改汇编代码来跳过程序验证部分(俗称打补丁)的形式来过掉程序的最终校验,进而满足题目要求来获取flag,此类题目比较考验选手查找程序中验证代码的能力。

2、 算法破解:这类题目通常需要逆向分析其程序加密部分汇编代码,然后还原其加密算法实现过程,然后根据分析结果编写出对应的解密程序,进而算出flag,此类题目比较考验选手的耐心和细心程度,不仅需要选手有扎实的逆向功底,还需要选手具备一定的编程能力。


1、 突破保护:拿到程序时先查看程序属于哪平台下的,例如windows X86/X64、android、linux等,有没有设置保护措施,例如:代码混淆、保护壳、各种反调试等,如果有则通过去混淆、脱壳、反反调试等技术来去除或绕过这些保护措施。

2、 定位关键代码:我们需要将目标软件进行反汇编,然后结合IDA和OD快速定位到关键代码(例如验证函数)。

3、 动静结合:我们找到程序的关键代码之后就要对其进行详细的逆向分析了,如果程序在IDA中F5可以生成伪代码,那么我们就先根据伪代码进行静态分析,然后模糊不清的地方可以结合OD进行动态调试观察来验证自己的猜想。

4、 破解验证算法:我们详细分析完程序的关键代码(例如:验证算法)之后,我们就要根据我们分析出的结果来进行暴力破解或者进行代码的编写,对算法进行破解来编写逆算法生成flag。

常见的验证算法通常有以下几种(以下为还原后的源码展示,比赛中肯定不会给你源码):

1.     直接比较验证密钥一般没有经过加密,直接跟内置的key进行比较,此类题型比较简单。

           图 1 直接比较验证源码示例

2.     加密比较验证:密钥一般进行了例如异或、base64、MD5、R’C”4′等形式的加密,此类题型需要识别出其加密方式,然后再根据其算法特点还原出相应的key,幸运的是比赛中的加密方式有限,自己可以针对练习,但是现实竞赛中也有可能出现密钥用不同加密算法分段加密或嵌套验证等多种加密组合起来的方式,也需要自己去分辨。

                     图 2 加密比较验证源码示例

3.     逆向自己实现的算法:这类题目就需要选手自己去逆向题目作者自己编写的算法了,例如下图的迷宫问题题目,选手需要识别出其是迷宫问题题目然后分析出其每个函数代表什么操作来进一步解题,需要逆向算法的题目一般都比较难,需要理清算法实现思路,跟踪自己输入的数据使用算法进行了哪些处理,最后变成了什么和什么比较,需要有一定的耐心和细心,建议多加练习。

                          图3 算法逆向源码示例

4.    其他类型的加密题目:实在解不出来的,也可以看其是否可以绕过或暴力破解穷举等。


       上面讲了题目相关的内容,那么究竟做题目之前需要哪些基础呢,这里就以windows平台下为例子,因为一旦你某个平台下的知识体系建立了,想要学习其他平台也就很好学习了:

1.     基础知识:汇编语言、C语言(培养编程思维对逆向来说很重要)、一门脚本语言(建议python)、windows核心编程(掌握常用API)、PE文件格式、程序加载流程、各种过保护手段(反混淆、反反调试、脱壳等)。

2.     常用工具:查壳工具(DIE、PEID、EXEINFO、LordPE、ResourceHacker等)、常用脱壳工具或脱壳脚本(专属壳的脱壳器例如upx等、各种壳的脱壳脚本)、十六进制编辑器(010Editor、winhex等)、反汇编工具(IDA、Hopper)、调试器(Ollydbg、gdb、windbg等),这些都是比较常用的逆向工具。其中特别要熟练使用IDA与Ollydbg,IDA一般用来做静态分析,其中的F5功能更是强大到没朋友,新手必备。Ollydbg简称OD一般用来做动态调试使用,两者结合使用堪比倚天剑和屠龙刀,可谓是神挡杀神佛挡杀佛。

3.     定位验证代码:如果给你一个程序需要你找到他验证部分的代码,那么你如何查找呢?这里给大家总结了几个常用的方法:

1.     顺序跟踪:如果大家拿到的程序较小,代码量不多且主函数入口好找,即可使用顺序跟踪法,从程序主函数入口顺序跟踪,一步步看完整个程序的执行过程,基本就知道程序的验证部分了,至于各个类型程序主函数的查找方法大家可以自行百度,这里还需要分清楚程序入口点和main函数的区别,大家一般需要找main函数,但也不全是找main函数,如果遇到了MFC的程序大家还需要根据具体情况具体分析,如果有条件大家也可以自己编写相应程序然后反汇编来练习查找程序的主函数,这个需要大家平时多练习、多积累、多总结。

2.     字符串查找:如果给定的程序没有做混淆处理而且还有比较明显的字符串提示,那么我们就可以根据程序运行的提示使用字符串查找功能查找程序所提示字符串的方式来反向查找其被引用的地址,例如IDA中shift+F12的字符串窗口,OD中查找->所有参考文本字串,字符串搜索的优先级很高,很多情况下对我们解题有奇效,所以拿到程序后可以优先尝试。

3.     API断点:如果程序非常大而且也没有啥字符串提示信息可以利用,那么我们就可以根据程序所使用的API来定位关键验证代码,这需要大家掌握C语言还有windows核心编程的知识,熟悉哪些API具有哪些功能,例如:程序出现了一个弹窗,那么程序就有可能调用了Messagebox这个API,如果程序出现了输出,那么程序就有可能调用了printf这个API等等,所以我们可以通过程序所表现出的状态来下相应的API断点,然后栈回溯反向查找其引用位置,进而找到关键代码。


       那么很多小伙伴们说了,大道理都懂,但是学起来小情绪难以自控,想让推荐一本能够构建逆向知识体系的书,那么就向大家着重推荐几本:

《C Primer Plus》和《C++ Primer Plus》:学习C和C++不错的入门书,比较全面。

       《逆向工程核心原理》:韩国人写的,通俗易懂,用来入门逆向很不错的书籍,帮助快速构建逆向知识体系。

       《加密与解密第四版》:看雪论坛段钢老师出版的,二进制安全界圣经级别的书籍,知识点比较全,用来做工具书不错,我曾经的老师也参与了编写(嘻嘻(●’◡’●)),想想还有点小激动呢。

       《汇编语言基于x86处理器》:讲汇编语言挺不错的,推荐看前十章,没必要看完,PS:学逆向不推荐看王爽老师的汇编书。

       《IDA pro权威指南 第二版》:学习IDA的工具书。

       《PE权威指南》:学习PE文件格式,Windows下逆向必须对PE文件格式烂熟于心。

       剩下的就是多练习破解一些crackme,多刷CTF逆向题,提高自己的实战能力。

       推荐完图书了,那么我们还需要搭建各个平台的逆向环境,比如windows、Linux、Android等平台的逆向环境都需要搭建好,各个平台所需要的逆向环境和工具大家也可以从看雪论坛吾爱破解下载到,工具也都是比较全的。

       大家搭建好了平台之后,就可以从网上各个平台去寻找逆向题目去做了,推荐大家几个寻找题目的好地方:看雪论坛、攻防世界、CTFwiki吾爱破解等都可以找到逆向题目来做。


       其实逆向总结起来就一句话:入门难、进阶难、精通更难。所以说我们入门了逆向之后还需要进阶一下,下面来介绍一下逆向进阶所需要攻克的难点:

1. 绕过软件保护:例如windows程序常见的加壳(大部分是压缩壳和简单的加密壳,一般不会出很难的加密壳或者虚拟机壳这种强壳因为这种壳都不是短时间内能够脱掉的)、混淆(对反汇编代码进行变形使人难以逆向)、花指令(添加无用代码或函数浪费逆向者时间,摧毁其心态)、反调试(检测调试状态、检测调试器、检测断点、检测跟踪、检测补丁等)、反虚拟机等。我们要克服软件保护这个难点的话需要熟悉操作系统调试相关的知识,推荐大家一本张银奎的《软件调试》这本书,只需要膜拜就完事了哦,我们还需要对我们日常遇到的软件保护手段多做总结,因为招式是有限的,我们总结的多了也就会见招拆招了。

2. 理解各种目标程序的特性:

指令集:x86、x64、arm、arm64等;

平台:Windows、Linux、Android、ios等;

语言:C、C++、Java、Python、C#、VB、.Net、易语言等;

编译器:VS、GCC、VC、易语言等;

库与框架:MFC、QT、STL、易语言库等;

要想克服语言难点,我们除了需要了解各个语言的语言特性、运行、开发环境等,达到可以进行一定的正向开发的程度之外,我们还需要根据目标程序所用语言找到其专用的反编译工具(可以从githubgoogle上找),比如android程序所用到的的androidkiller,python程序的EasyPythonDecompiler、MFC程序的xspy、C#的ILspy等,这些工具有时都可以直接把源程序反编译成近乎源码形式,让我们解题事半功倍,除了这些特定语言程序之外,剩下的常规的程序一般都是IDA静态分析和OD动态调试结合分析。

3.     理解各种算法:大家还需要一些算法的功底,因为有时候出题使用的算法和公开的算法会有一些区别,比如进行了简单的修改或者变形,用通用的解密方法解密不了,这时候就需要自己编写解密脚本来进行解密,所以大家还需要对算法有一定研究。想要克服算法难点的话需要大家了解常见的数据结构和算法实现,多在ACM平台练练题等。


          本着由易到难,由浅入深的原则,如果一上来就接触比较难的逆向题会打击到大家的积极性,那么就先给大家一些比较甜蜜的(新手向)CTF逆向题来练练手,网盘中题目文件夹包括三个部分,1.题目附件、2.题目介绍、3.writeup(解题过程),大家做的时候先看一看题目介绍,然后自己做一做题目,尝试找到或算出题目flag,最后如果实在不会做再看writeup。本人后续也会持续发布有代表性的CTF逆向练习题,并且会对每次发布的CTF逆向练习题中所用到的知识点进行详细的讲解,不过后面发布的CTF练习题难度会逐渐上升,所以需要大家把基础打牢,万丈高楼平地起学习逆向没有捷径,希望大家多多关注我们Tide安全团队来获取资源和答疑。

练习题:https://pan.baidu.com/s/1x6pRb5TxD46YqELISBnTXQ

提取码:4l6d


       逆向这门技术没有速成可言,不可能看几个帖子几篇文章就学会了,它需要你有扎实的基础,一颗不急不躁的心,善于反思,循序渐进的来提高。因为工作原因最近半年都在搞渗透,所以以前的逆向知识也有些地方忘记了,这篇文章也是边回忆边写的,在此感谢XCTF攻防夏令营的周老师指引了许多写作方向。初次写关于CTF逆向的文章肯定有写的不好不全的地方,还望各位大佬多多包涵,提出宝贵意见,小弟感激不尽。

E

N

D

本文作者:TideSec

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/124037.html


文章来源: https://www.secpulse.com/archives/124037.html
如有侵权请联系:admin#unsafe.sh