黑客赚钱的路子有多野?CTF逆向入门指南

1、背景

在CTF比赛中, CTF逆向题目除了需要分析程序工作原理, 还要根据分析结果进一步求出FLAG。逆向在解题赛制中单独占一类题型, 同时也是PWN题的前置技能。在攻防赛制中常与PWN题结合。CTF逆向主要涉及到逆向分析和破解技巧,这也要求有较强的反汇编、反编译、加解密的功底。

文末免费分享《黑客&网络安全入门&进阶学习资源包》

CTF中的逆向题目一般常见考点

1、常见算法与数据结构。

2、各种排序算法, 树, 图等数据结构。

3、识别加密算法与哈希算法代码特征,识别算法中魔改的部分。

4、代码混淆, 代码虚拟化, 修改代码流程, 反调试等。

5、软件加密壳是软件保护技术的集中应用。

CTF逆向题目两大主题:暴力破解、算法分析破解

1、暴力破解:通过修改汇编代码而跳过程序内部校验部分,从而改变程序的正常逻辑,最后满足题目要求来获取flag。这就考验在逆向分析样本时候,对样本验证代码定位能力。

2、算法破解:这主要需要分析样本中的加密部分的汇编代码,将其加密算法进行还原,并根据分析结果写出对于的解密程序,最后算出flag。这就考验了对样本分析过程中的耐心和扎实的逆向能力和一定的代码开发能力。

逆向解题常见技巧

1、逆向分析与功能猜测结合, 通过逆向分析进行缩小猜测范围, 猜测为逆向指出方向, 逆向再验证猜测的思路。

2、结合样本中汇编代码上下文与整体程序功能, 关注程序中给出的文字提示信息。

3、实际比赛的逆向题目多数是为出题而出题, 有目的性强, 功能结 构单一, 无关代码少等特点。

4、遇到程序代码量极大时, 可以先判断是否引用了较多的开源的代码, 而程序的主逻辑相对简单。

2、逆向基础

CTF逆向常用工具

Ollydbg、IDA、PCHunter、Exeinfo PE(PeTool)、CFF Explore、exeScope、ApiMonitorTrial、winhex。

CTF逆向需涉及知识点

汇编知识:window下的X86和X64; android下的ARM和ARM64。

文件结构:windox下的PE文件; android下的dex文件和ELF文件。

反调试技术: window和android下的调试和反调试对抗技术。

加壳和脱壳:PE的加壳和脱壳、 ELF和dex的加壳和脱壳。

开发能力:C、C++、python等语言的开发能力。

CTF样本逆向解题流程

1、突破保护:

获得样本程序时先用ExeInfoPePE工具进行查看程序属于哪平台下的,例如windows X86/X64、android、linux等,是否采用代码保护措施,例如:代码混淆、保护壳、各种反调试等,如果有那么在进行分析样本之前,需要先过掉样本混淆、脱壳、反反调试等技术来去除或绕过这些保护措施。

2、定位关键代码:

我们需要将目标软件进行反汇编,然后结合IDA和OD快速定位到关键代码(例如验证函数、关键字符串信息、程序导入表)。

3、动静结合:

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

4、破解验证算法:

通过详细逆向分析完,程序的关键代码(例如:验证算法)之后,接着就要根据分析出的结果,进行暴力破解或者进行算法解密代码的编写以此来获取或生成flag。

CTF中常见的验证算法

1、 直接比较验证:

密钥一般没有经过加密,直接跟内置程序中的key进行比较(也就是硬编码方式比较),此类题型比较简单。

2、加密比较验证:

密钥一般会进行如异或、base64、MD5、RC4等形式的加密,此类题型需要识别出其加密方式,然后再根据其算法特点还原出相应的key值,现实CTF比赛中可能出现密钥用不同加密算法分段加密或嵌套验证等多种加密组合起来的方式,也需要去深入识别分辨。

3、 逆向自定义实现的算法:

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

4、其他类型的加密题目:

实在解不出来的,也可以尝试是否可以绕过或暴力破解穷举等方式。

定位关键代码的方法

1、顺序跟踪法:

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

2、 字符串查找:

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

3、系统函数断点:

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

3、汇编基础

(以下知识点只起到抛砖引玉的作用)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值