三、 CTF逆向与现实逆向
CTF逆向特点
- 代码量小
- 结构简单
- 单文件
- 编码单一
- 现代语言特性少
- 面向过程
- 加密壳/优化少
- 语言常见
- C/C++/ASM
现实逆向
- 代码量巨大
- 结构复杂
- 大量静态库、动态库
- 各种乱码
- 大量现代语言特性
- OO、Template
- 优化和加密壳十分常见
- 语言可能十分神器
- Go/VB/Delphi
四、IDA高级使用
1. 设置字符串编码和格式
- 快捷键:Alt+A
- 可以设置字符串类型
- Unicode字符串 (WCS)
- 多字节字符串 (MBS)
- 其他
- 可以设置字符串编码
- 需要系统支持相应的编码
2. 导入/导出数据
- 快捷键:Shift+E
- 菜单名:
- Edit -> Import Data
- Edit -> Export Data
- 操作:
- 选定后按快捷键
- 方便提取数据或修改idb数据库
3. 选定大段数据
- 快捷键: Alt+L
- 菜单名:
- Edit -> Begin Selection
- 菜单名:
- 将标定选择起始点
- 滚轮或按g跳转至结束位置
4. 批量应用类型
- 操作
- 设置好第一个类型
- 利用选定大量数据的方法选定数据
- 按*或按d弹出建立数组对话框
- 不勾选Create as array
5. 设置间接跳转地址
- 快捷键:Alt+F11
- 菜单名:
- Edit -> Plugins -> Change the callee address
- 将利用动态调试获取到的调用/跳转地址填入,可以极大地帮助IDA和F5的分析(不如参数个数、调用约定等),获得更准确的结果
6. 修复跳转表
- 默认无快捷键,可手动设置
- 菜单
- Edit -> Other -> Specify switch idiom
- 当程序在PIE时可能会导致跳转表分析失败,于是需要手动修复来获得更好的分析结果
7. IDAPython
- IDA自带支持的脚本
- 可以使用几乎所有IDA提供的API
- 可以快速完成大量重复性操作
- 可以方便的了解IDA内部的数据和结构
五、IDA F5出错处理
1. positive sp value
- 成因:IDA会自动分析SP寄存器的变化量,由于缺少调用约定、参数个数等信息,导致分析出错
- 解决方案
- 推荐:在Option -> General设置显示Stack pointer,然后去检查对应地址附近调用的函数的调用约定以及栈指针变化
- 不推荐: 在对应地址处按Alt+K,然后输入一个较大的负值(有风险)
2. call analysis failed
- 成因:F5在分析调用时,未能成功解析参数位置/参数个苏
- 解决方案:
- 对于间接调用(类似call eax等),可使用之前讲过的设置调用地址的方法解决
- 对于直接调用,查看调用目标的type是否正确设置。可变参数是引发这种错误的主要原因之一
3. cannot convert to microcode
- 成因:部分指令无法被编译
- 解决方案:
- 最常见起因是函数中有未设置成指令的数据字节,按c将其设置为指令即可
- 其次常见的是x86中的rep前缀,比如repxx jmp等。可以将该指令的第一个字节(repxx前缀的对应位置)patch为0x90 (NOP)
4. stack frame is too big
- 成因:在分析栈帧时,IDA出现异常,导致分析出错
- 解决方案:
- 找到明显不合常理的stack variable offset,双击进入栈帧界面,按u键删除对应的stack variable
- 如果是去壳导致的原因,先用OD等软件脱壳
- 可能由花指令导致,请手动或自动检查并去除花指令
- 非常罕见
5. local variable allocation failed
- 成因: 分析函数时,有部分变量对应的区域发生重叠,多见于ARM平台出现Point、Rect等8字节、16字节、32字节结构
- 解决方案
- 修改对应参数为多个int
- 修改ida安装目录下hexrays.cfg中的HO_IGNORE_OVERLAPS
6. F5结果不正确
- 成因:F5会自动删除其认为不可能到达的死代码
- 常见起因是一个函数错误的标注为noretur函数
- 解决方案
- 进到目前反编译结果,找到最后被调用的函数(被错误分析的函数),双击进入(迫使HexRays重新分析相应函数)
- 如果上述方案不成功,那么进到被错误分析的函数,按Tab切换到反汇编界面,按Alt+P进入界面取消函数的Does not return 属性
六、IDA F5高级使用
1. 自定义寄存器传参
- 使用IDA中的usercall和userpurge调用约定(两个下划线)
- 设置范例
- int __usercall test<eax> (int al <ebx>);
- <>中为对应值的位置
- 第一个<>为返回值位置,注意返回值的位置即使不变也要填写
2. HexRays源码级调试
- 注意
- F5中显示的变量很可能不是变量原来的值,尤其是寄存器变量,尽量在 值位置断下并查看
- 对于优化后的代码,F5调试bug很多
- F5单步不太稳定,在ARM平台可能会跑飞
- F5的运行至指定位置功能功能不稳定
3. 恢复符号
- 找到程序的旧版本
- 大量程序早期版本中安全意识薄弱,没有删除符号等各种信息
- 苹果用户可以在AppAdmin中获取版本应用
- Rizzo匹配
- 看程序自带的String
- 许多程序自带大量调试信息,从而可以获取符号
- Google搜索源码
- CS、iOS都有被泄露过
- 按获得信息搜索源码
- 大量程序中使用Stack Overflow、CSDN等答案
- 制作Signtature
- IDA提供自动制作Signature的工具
- 打开IDASDK68文件夹找到flair 58文件夹
七、IDA 插件搞定虚表
1. 虚表简介
虚表是业界难题,虚函数的处理会因编译器采取的ABI的不同而不同
- IDA操作的插件
- HexraysCodeXplorer
- hexrays_tool
- HexRaysPyTools
2. 实验样例
- 快捷键: Shift + F
- 菜单: 右键 -> Deeo Scan Variable
- 操作
- 在构造函数中执行上述操作、等待扫描完毕
- 按Alt+F8打开Signature Builder,看到有黄色部分,然后选不正确的field点
- 清楚所有的黄色部分后即可点击Finalize,在新弹出的窗口中修改名称