软件逆向工程基础
常规逆向流程
- 使用
strings/file/binwalk/IDA
等静态分析工具收集信息,并根据这些静态信息进行google/github
搜索 - 研究程序的保护方法,如代码混淆,保护壳及反调试等技术,并设法破除或绕过保护
- 反汇编目标软件,快速定位到关键代码进行分析
- 结合动态调试,验证自己的初期猜想,在分析的过程中理清程序功能
- 针对程序功能,写出对应脚本,求解出 flag
代码混淆
比如使用OLLVM
,movfuscator
,花指令
,虚拟化
及SMC
等工具技术对代码进行混淆,使得程序分析十分困难。
那么对应的也有反混淆技术,最主要的目的就是复原控制流。比如模拟执行
和符号执行
保护壳
保护壳类型有许多,简单的压缩壳可以归类为如下几种
-
unpack -> execute
直接将程序代码全部解压到内存中再继续执行程序代码
-
unpack -> execute -> unpack -> execute …
解压部分代码,再边解压边执行
-
unpack -> [decoder | encoded code] -> decode -> execute
程序代码有过编码,在解压后再运行函数将真正的程序代码解码执行
对于脱壳也有相关的方法,比如单步调试法
,ESP定律
等等
反调试
反调试意在通过检测调试器等方法避免程序被调试分析。比如使用一些 API 函数如IsDebuggerPresent
检测调试器,使用SEH异常处理
,时间差检测等方法。也可以通过覆写调试端口、自调试等方法进行保护。
非常规逆向思路
非常规逆向题设计的题目范围非常之广,可以是任意架构的任意格式文件。
- lua/python/java/lua-jit/haskell/applescript/js/solidity/webassembly/etc…
- firmware/raw bin/etc…
- chip8/avr/clemency/risc-v/etc.
评论
评论插件加载失败
正在加载评论插件