一、软件逆向工程的简介
(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 反编译效果或者程序有混淆,不能读懂其中逻辑时,应针对关键函数采用动态分析方法,通过动态调试跟踪函数操作来确定其内部逻辑。动态分析是静态分析的补充。
静态分析和动态分析没有孰优孰劣,需要具体问题具体分析,因此两种分析方法都要尽量掌握。如果读者暂时不能掌握动态分析方法,也一定要熟练掌握静态分析方法。
如何学习黑客/网络安全?
网络安全不是「速成黑客」,而是守护数字世界的骑士修行。当你第一次用自己写的脚本检测出漏洞时,那种创造的快乐远胜于电影里的炫技。装上虚拟机,从配置第一个Linux环境开始,脚踏实地从基础命令学起,相信你一定能成为一名合格的黑客。
如果你还不知道从何开始,我自己整理的282G的网络安全教程可以分享,我也是一路自学走过来的,很清楚小白前期学习的痛楚,你要是没有方向还没有好的资源,根本学不到东西!
下面是我整理的网安资源,希望能帮到你。
😝需要的话,可以V扫描下方二维码联系领取~
如果二维码失效,可以点击下方👇链接去拿,一样的哦
【CSDN大礼包】最新网络安全/网安技术资料包~282G!无偿分享!!!
1.从0到进阶主流攻防技术视频教程(包含红蓝对抗、CTF、HW等技术点)
2.入门必看攻防技术书籍pdf(书面上的技术书籍确实太多了,这些是我精选出来的,还有很多不在图里)
3.安装包/源码
主要攻防会涉及到的工具安装包和项目源码(防止你看到这连基础的工具都还没有)
4.面试试题/经验
网络安全岗位面试经验总结(谁学技术不是为了赚$呢,找个好的岗位很重要)
😝需要的话,可以V扫描下方二维码联系领取~
因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆
如果二维码失效,可以点击下方👇链接去拿,一样的哦
【CSDN大礼包】最新网络安全/网安技术资料包~282G!无偿分享!!!