CTF逆向工程简单介绍以及解题通用思路入门
CTF逆向工程简单介绍以及解题通用思路入门
CTF逆向工程简单介绍以及解题通用思路入门
一、软件逆向工程的简介
(1)、软件的生成
软件的编写语言经历了从机器语言到汇编语言,再到如今高级语言的变化。最开始使用的都是机器语言进行的编写,机器语言是机器能直接识别的程序语言或指令代码,无需经过翻译,每一操作码在计算机内部都有相应的电路来完成它,或指不经翻译即可为机器直接理解和接受的程序语言或指令代码。机器语言使用绝对地址和绝对操作码。不同的计算机都有各自的机器语言,即指令系统。从使用的角度看,机器语言是最低级的语言。而二进制代码则是机器语言的具象表示。机器语言有着其独特的优势——不用编译且所有设备均可以识别,所以其跨平台性举世无双,但是冗杂的代码难以记忆,难以编写,难以阅读则是天堑般的弱点。为了解决这一问题,汇编语言出世了,汇编语言是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。不难看出,汇编语言的优点依旧明显——不用编译。可扩展性依旧很高,并在一定程度上易于记忆,但是依旧单调而冗长。
在编程语言经历了机器语言,汇编语言等更新之后,人们发现了限制程序推广的关键因素——程序的可移植性。需要设计一个能够不依赖于计算机硬件,能够在不同机器上运行的程序。这样可以免去很多编程的重复过程,提高效率,同时这种语言又要接近于数学语言或人的自然语言。因此高级语言诞生了(对于码农而言,这是史诗级福报)。
高级语言是一种独立于机器,面向过程或对象的语言。高级语言是参照数学语言而设计的近似于日常会话的语言。例如,要将2个变量相加并赋值给第三个变量,用高级语言表达为var3=var1+var2。高级语言相对低级语言有较高的可读性,更易理解。但是很可惜的是,由于早期计算机行业的发展主要在美国,能开发语言的大牛也都在那边吗,因此一般的高级语言都是以英语为蓝本。但是现在的仓颉和易语言等都是基于中文开发的,只是还有待推广。
(2)、逆向工程的定义以及目标
软件逆向工程是通过对低级代码进行一系列提升和抽象,最终得到容易被人所理解的表现形式的过程。换句话说,软件逆向工程的目的就是从目标软件中找出设计思想。具体而言,软件逆向工程是指从可运行的程序(可执行文件)出发,运用解密、反汇编、反编译、系统分析、程序理解等计算机技术,对软件的结构、流程、算法、代码等进行分析,推导出软件产品的汇编/源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。或者直接理解为你想抄作业(读书人的事情怎么能叫抄呢,那是借鉴)但是你只有“参考”答案,只有答案没有过程,你为了应付老师的检查,不得不通过答案逆推过程,然后交上去蒙混过关。这个基本上就是逆向干的事情了。
而实际工作里的逆向工程主要应用就是恶意代码分析还有病毒分析,以开发杀毒或者防护软件。当然也可以制作外挂脚本什么的,但是你最好不要这么干。
二、CTF逆向工程入门
(1)、逆向题目特点
比赛它一定是会给定目标程序的,而这一类程序则通常分为两大类:第一类是由输入的,需要自己通过逆向分析找到正确的输入;第二类是在后台运行的(没有明显的显示),这里就需要去看看内存后者网络流向里找找了。很多恶意代码分析都是第二类的。
而比赛的考点也是非常的少而集中完事死难。一般会从程序保护、开发语言和核心算法三个层次出题。简单点的题目包括:程序没有保护、C语言开发、核心逻辑是简单加密或者对输入字符的ASCII码进行修改等题目。难点的(不止一点,两级分化之人和狗的差距)包括:程序加壳干扰且有反调试、Go语言开发、核心算法设计迷宫或者图论什么的。
逆向的难点也是非常的清晰:
1.RE 难点一:绕过程序保护
常见的保护措施包括:
- 编译器静态链接、优化。
- 加壳、加密、混淆、花指令。
- 反虚拟机、反调试、虚拟化等。
2.RE 难点二:理解程序开发语言
程序可使用的指令集和高级语言多种多样,包括:
- 指令集:x86、x64、ARM、ARM64、Mips。
- 操作系统:Windows、Linux、iOS、Android 等。
- 语言:C、Pascal、Haskell、C++、Go。
- 脚本:Java、C#、Perl、PHP、Python、Ruby、Lua。
- 脚本编译打包:pyc、pyinstaller 等。
3.RE 难点三:识别核心算法
常见的算法包括:
- 常见密码算法识别 (DES、AES、MD5、SHA1、TEA、RSA 等)。
- 密码算法变形。
- 矩阵求解。
- 迷宫问题。
- 经典图论算法 (Dijkstra 算法、KMP 算法) 等。
因此,逆向设计的点很多,而且对你的能力要求非常高。当然个人认为,比密码还好点(虽然逆向经常分析加密解密逻辑)。
(2)逆向解题入门思路
所谓逆向,就是有根据地“连蒙带猜”。(一发入魂超爽的)
对于要分析的程序,我们并不需要知道程序的所有细节,即使是分析关键函数,也可以利用函数中的某些特征猜测函数使用的算法。
注意逆向时,对于函数功能的猜测要有依据,也就是总纲中所说的“有根据地”,没有根据的胡乱猜测只会让自己陷入混乱。
逆向分析的操作要领可总结为:一看二猜三验证。
一看是指使用 IDA 或者 OllyDbg 等工具,静态或动态地查看程序的关键函数。具体操作时,虽然程序多种多样,但是逆向分析程序可以有统一的“套路”。针对逆向题目的三大考查层次,其分析步骤如下:
第 1 步:使用 DetectItEasy、EXEInfoPE、PEID 等工具查看壳和编译器信息,并能进一步推测出所使用的程序开发语言。
第 2 步:使用 IDA 等工具查看程序反编译后的伪码和程序中的所有字符串,静态分析程序的核心逻辑和关键算法。
第 3 步:针对第 2 步中没看懂的函数,使用 GDB、 OllyDbg 等动态调试工具分析关键函数的逻辑。
二猜是指通过“一看”中发现的特征,猜测关键函数采用的算法,这一步非常考验选手的经验。
三验证是指在“一看二猜”基础上,通过编写脚本或者多次运行程序,验证自己的猜测是否正确,如果不正确,则再次重复“一看二猜三验证”的过程。
在程序逆向分析中,要静态为主,动态为辅。
在“逆向分析的操作要领”中,“一看”涉及多个动静态分析工具的使用,如果新手不知道工具的使用顺序,就很容易“走火入魔”,迷失在代码的海洋中。
静态为主:是指优先使用 IDA 等工具查看程序伪码,通过静态分析快速定位关键函数,并仔细阅读关键函数中的算法逻辑。静态分析时,要求选手有一定 C 语言基础,因为 IDA 伪码与 C 语言类似。有相当数量的简单题目在这一步就能解决,这就意味着选手只要会看 C 语言、会使用 IDA 反编译,即使完全不懂动态分析,也能解题拿分。
动态为辅:是指在通过静态分析确定关键函数后,由于 IDA 反编译效果或者程序有混淆,不能读懂其中逻辑时,应针对关键函数采用动态分析方法,通过动态调试跟踪函数操作来确定其内部逻辑。动态分析是静态分析的补充。
静态分析和动态分析没有孰优孰劣,需要具体问题具体分析,因此两种分析方法都要尽量掌握。如果读者暂时不能掌握动态分析方法,也一定要熟练掌握静态分析方法。
最后提醒一下CTF逆向通常有windows系统、Linux系统、安卓系统的逆向题目哦!!!
文章来自网上,侵权请联系博主
互动话题:如果你想学习更多网安方面的知识和工具,可以看看以下题外话!
《网络安全从零到精通全套学习大礼包》
96节从入门到精通的全套视频教程免费领取
如果你也想通过学网络安全技术去帮助就业和转行,我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。
网络安全学习路线图
想要学习 网络安全,作为新手一定要先按照路线图学习,方向不对,努力白费。对于从来没有接触过网络安全的同学,我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线,大家跟着这个路线图学习准没错。
配套实战项目/源码
所有视频教程所涉及的实战项目和项目源码
学习电子书籍
学习网络安全必看的书籍和文章的PDF,市面上网络安全书籍确实太多了,这些是我精选出来的
面试真题/经验
以上资料如何领取?
cn/direct/92a6ab8e26034045b97ae8ac36b2a650.png)
