编辑“︁
逆向工程简介
”︁
127.0.0.1
(
留言
)
2023年7月2日 (日) 16:04的版本
(
差异
)
←上一版本
|
最后版本
(
差异
) |
下一版本→
(
差异
)
跳转到导航
跳转到搜索
警告:您正在编辑该页面的旧版本。
如果您发布该更改,该版本后的所有更改都会丢失。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Ctf_Wiki}} = 软件逆向工程简介 = == 定义 == <blockquote>Reverse engineering, also called back engineering, is the process by which a man-made object is deconstructed to reveal its designs, architecture, or to extract knowledge from the object; ------ from [https://en.wikipedia.org/wiki/Reverse_engineering wikipedia] </blockquote> 软件代码逆向主要指对软件的结构,流程,算法,代码等进行逆向拆解和分析。 == 应用领域 == 主要应用于软件维护,软件破解,漏洞挖掘,恶意代码分析。 <span id="ctf竞赛中的逆向"></span> == CTF竞赛中的逆向 == <blockquote>涉及 Windows、Linux、Android 平台的多种编程技术,要求利用常用工具对源代码及二进制文件进行逆向分析,掌握 Android 移动应用APK文件的逆向分析,掌握加解密、内核编程、算法、反调试和代码混淆技术。 ------ 《全国大学生信息安全竞赛参赛指南》 </blockquote> === 要求 === * 熟悉如操作系统,汇编语言,加解密等相关知识 * 具有丰富的多种高级语言的编程经验 * 熟悉多种编译器的编译原理 * 较强的程序理解和逆向分析能力 == 常规逆向流程 == # 使用<code>strings/file/binwalk/IDA</code>等静态分析工具收集信息,并根据这些静态信息进行<code>google/github</code>搜索 # 研究程序的保护方法,如代码混淆,保护壳及反调试等技术,并设法破除或绕过保护 # 反汇编目标软件,快速定位到关键代码进行分析 # 结合动态调试,验证自己的初期猜想,在分析的过程中理清程序功能 # 针对程序功能,写出对应脚本,求解出flag === 定位关键代码tips === <ol style="list-style-type: decimal;"> <li><p>分析控制流</p> <p>控制流可以参见IDA生成的控制流程图(CFG),沿着分支循环和函数调用,逐块地阅读反汇编代码进行分析。</p></li> <li><p>利用数据、代码交叉引用</p> <p>比如输出的提示字符串,可以通过数据交叉引用找到对应的调用位置,进而找出关键代码。代码交叉引用比如图形界面程序获取用户输入,就可以使用对应的windowsAPI函数,我们就可以通过这些API函数调用位置找到关键代码。</p></li></ol> === 逆向tips === <ol style="list-style-type: decimal;"> <li><p>编码风格</p> <p>每个程序员的编码风格都有所不同,熟悉开发设计模式的同学能更迅速地分析出函数模块功能</p></li> <li><p>集中原则</p> <p>程序员开发程序时,往往习惯将功能相关的代码或是数据写在同一个地方,而在反汇编代码中也能显示出这一情况,因此在分析时可以查看关键代码附近的函数和数据。</p></li> <li><p>代码复用</p> <p>代码复用情况非常普遍,而最大的源代码仓库Github则是最主要的来源。在分析时可以找一些特征(如字符串,代码风格等)在Github搜索,可能会发现类似的代码,并据此恢复出分析时缺失的符号信息等。</p></li> <li><p>七分逆向三分猜</p> <p>合理的猜测往往能事半功倍,遇到可疑函数却看不清里面的逻辑,不妨根据其中的蛛丝马迹猜测其功能,并依据猜测继续向下分析,在不断的猜测验证中,或许能帮助你更加接近代码的真相。</p></li> <li><p>区分代码</p> <p>拿到反汇编代码,必须能区分哪些代码是人为编写的,而哪些是编译器自动附加的代码。人为编写的代码中,又有哪些是库函数代码,哪些才是出题人自己写的代码,出题人的代码又经过编译器怎样的优化?我们无须花费时间在出题人以外的代码上,这很重要。如果当你分析半天还在库函数里乱转,那不仅体验极差,也没有丝毫效果。</p></li> <li><p>耐心</p> <p>无论如何,给予足够的时间,总是能将一个程序分析地透彻。但是也不应该过早地放弃分析。相信自己肯定能在抽茧剥丝的过程中突破问题。</p></li></ol> === 动态分析 === 动态分析的目的在于定位关键代码后,在程序运行的过程中,借由输出信息(寄存器,内存变化,程序输出)等来验证自己的推断或是理解程序功能 主要方法有:调试,符号执行,污点分析 === 算法和数据结构识别 === * 常用算法识别 如<code>Tea/XTea/XXTea/IDEA/RC4/RC5/RC6/AES/DES/IDEA/MD5/SHA256/SHA1</code>等加密算法,大数加减乘除、最短路等传统算法 * 常用数据结构识别 如图、树、哈希表等高级数据结构在汇编代码中的识别。 === 代码混淆 === 比如使用<code>OLLVM</code>,<code>movfuscator</code>,<code>花指令</code>,<code>虚拟化</code>及<code>SMC</code>等工具技术对代码进行混淆,使得程序分析十分困难。 那么对应的也有反混淆技术,最主要的目的就是复原控制流。比如<code>模拟执行</code>和<code>符号执行</code> === 保护壳 === 保护壳类型有许多,简单的压缩壳可以归类为如下几种 <ul> <li><p>unpack -> execute</p> <p>直接将程序代码全部解压到内存中再继续执行程序代码</p></li> <li><p>unpack -> execute -> unpack -> execute ...</p> <p>解压部分代码,再边解压边执行</p></li> <li><p>unpack -> [decoder | encoded code] -> decode -> execute</p> <p>程序代码有过编码,在解压后再运行函数将真正的程序代码解码执行</p></li></ul> 对于脱壳也有相关的方法,比如<code>单步调试法</code>,<code>ESP定律</code>等等 === 反调试 === 反调试意在通过检测调试器等方法避免程序被调试分析。比如使用一些API函数如<code>IsDebuggerPresent</code>检测调试器,使用<code>SEH异常处理</code>,时间差检测等方法。也可以通过覆写调试端口、自调试等方法进行保护。 == 非常规逆向思路 == 非常规逆向题设计的题目范围非常之广,可以是任意架构的任意格式文件。 * lua/python/java/lua-jit/haskell/applescript/js/solidity/webassembly/etc.. * firmware/raw bin/etc.. * chip8/avr/clemency/risc-v/etc. 但是逆向工程的方法学里不惧怕这些未知的平台格式,遇到这样的非常规题,我们也有一些基本的流程可以通用 === 前期准备 === * 阅读文档。快速学习平台语言的方法就是去阅读官方文档。 * 官方工具。官方提供或建议的工具必然是最合适的工具 * 教程。在逆向方面,也许有许多前辈写出了专门针对该平台语言的逆向教程,因此也可以快速吸收这其中的知识。 === 找工具 === 主要找<code>文件解析工具</code>、<code>反汇编器</code>、<code>调试器</code>和<code>反编译器</code>。其中<code>反汇编器</code>是必需的,<code>调试器</code>也包含有相应的反汇编功能,而对于<code>反编译器</code>则要自求多福了,得之我幸失之我命。 找工具总结起来就是:Google大法好。合理利用Google搜索语法,进行关键字搜索可以帮助你更快更好地找到合适工具。 [[Category: Ctf_Reverse]]
摘要:
请注意,所有对gamedev的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Gamedev:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
Template:Ctf Wiki
(
编辑
)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
不转换
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息