逆向的定义与核心
1.什么是逆向—–从目标代码反推源代码,从源代码理解开发者目的
- ctf中与Cryto结合
- Crackme(破解密码)
- Keygenme(生成注册码)
- 与隐写取证相结合
- Recover(恢复文件)
与PWN结合
- Reverse(interface,struct,format,protocl)
- Bypass auth ,Patch bin
逆向的基本流程
- 程序预处理,去混淆和过反调试
- 代码逆向,找到验证函数
- 验证函数逆向,找到验证算法
- 破解验证算法,得到flag
- ctf中与Cryto结合
2.逆向的核心
- 破解验证算法
- 验证算法:
1.简单比较算法
2.密码算法验证
3.算法求解验证 - Key直接比较
- Key简单变换
- Key编码转换
- Key散列计算
- Key秘钥加密
- Key算法求解
- flag直接输出
- 秘钥空间过短
- 伪随机算法
3.逆向的基础
- 汇编,C语言
- 操作系统原理与核心编程、程序加载
- 反汇编与调试
- 常用工具:
- PE与ELF编辑、侦壳、脱壳工具(010editor、winhex、peid、upx、resource hacker、sysinternals)
- 反汇编与反编译工具(IDA Pro、Hopper)
- 调试器(Ollydbg、gdb、windbg)
- 动态分析:调试、模拟
静态分析:反汇编、反编译
定位验证代码
- 代码走查
从程序主函数入口顺序追踪,适用于代码量小,主函数清晰的情况下 - 字符串引用
搜索目标字符串,反向查找引用的地址,适用于无混淆的大部分情况 - API引用
搜索API指针,反向查找引用的地址,适用于显式调用API的情况 - API断点
在API入口下断点,断下后反向查找引用地址,适用于有输出信息的大部分情况 - 其他情况
无明显输出信息:字符输入API处下断点
从文件读入信息:文件读取API处下断点
- 代码走查
识别验证算法
- 简单变换
按位算术、逻辑运算,运算过程可逆
运算过程代码量小,结构简单,常量简单(0,1) - 密码算法
按块算数运算、逻辑运算,运算过程可逆
运算过程代码量大,结构复杂,常量奇怪(0x9E3779B9) - 解题算法
具体问题,具体分析
迷宫问题,矩阵求解问题 - 现实竞赛
简单变换+密码算法+解题算法
层层识别
- 简单变换
4.如何入门
- 构建逆向知识体系
- 逆向工程核心原理(人民邮电出版社)
- 加密与解密-第三版(电子工业出版社)
- Reverse Engineering for Beginners(http://beginners.re)
- 使用Ollydbg从零开始Cracking(http://bbs.pediy.com/showthread.php?t=184679)
- IDA Pro权威指南-第2版(人民邮电出版社)
- Intel汇编语言程序设计-第五版(电子工业出版社)
- 搭建逆向工具平台
- 运行环境(win,linux,mac,android,ios,x86,x64,arm……)
- 开发环境调试(asm,C……)
- 逆向环境(pediy,52pojie工具包…….)
- 训练平台
- XCTF_OJ练习平台.(http://oj.xctf.org.cn)
- 实验吧决斗场.(http://www.shiyanbar.com/ctf/)难度适中
- Crackme.(http://crackme.de/)
- 构建逆向知识体系
进阶篇
1.逆向的难点
- 绕过软件保护(过保护层)
- 编译器静态链接、优化
- 加壳、加密、混淆、花指令
- 反虚拟机、反调试、虚拟化
- 理解各种目标(语言进阶)
- 指令集:x86、x64、arm、arm64、mips…….
- 操作系统:windows、linux、ios、android……
- 语言:c、pascal、haskell、c++、Go……
- 编译器:vc、gcc、lcc、llvm、易语言……
- 库与框架:stl、mfc、qt、boost、易语言库……
- 脚本:Java、c#、perl、php、python、ruby、lua……
- 脚本编译打包:pyc、pyinstaller
- 解决算法难题(算法进阶)
- 密码算法变形
- 矩阵求解
- 绕过软件保护(过保护层)
2.如何进阶
过保护层
- .软件保护方法
- 反编译:程序加壳,代码混淆
- 反调试:调试检测
- 代码加壳
- 保护壳(压缩)
- 加密壳(反调试)
- 虚拟壳混淆(混淆)
- 程序反调试
- 检测调试状态(lsDebuggerPresent(),NtGlobalFlags())
- 检测调试器(Process)
- 检测断点(0xCC)
- 检测跟踪(timecheck)
- 检测补丁(crc)(网上搜索“反调试总结”)
- 如何进阶
- 熟悉操作系统调试相关
- 熟悉常见的反调试措施
- 识别,见招拆招
- .软件保护方法
语言进阶
- 语言分类
- 编译语言
- 解释语言
- 二进制文件
- 去除变量名、函数名、类型默认保留(准确性)
- 脚本文件
- 变量名、函数名、类型默认保留(代码混淆)
- 自己分析困难
- 如何进阶
- 识别,找工具(Google,GitHub,SourceForge)
- 熟悉各种语言、运行和开发环境
- 完整的正向过程,清晰的逆向思维
- 经验(VC编译代码,IDA逆向之,OD调试之,MFC,Android,C#,py2exe)
- 语言分类
算法进阶
- 复杂算法
- 密码变种
- 算法竞赛
- 密码变种
- 从简单识别到理解原理和实现
- 算法竞赛
- 了解常见的数据结构,抽象程序过程
- 如何进阶
- 算法入门竞赛
- 找acmer帮忙
- MATLAB
- Python库(z3,NumPy)
- 复杂算法