逆向基础笔记(暂时没有PPT的话可以先拿这个将就一下)

  yuguorui       2017-08-02 20:13:39 877  5

逆向基础

授课人:管云超(Nu1L/Tea Delivers)(高中刚刚毕业)

准北邮大一新生,Nu1L逆向/杂项选手

主攻Windows逆向、软件保护、IDA拓展

业余lo娘/coser

什么是逆向

用崭新的视角去观察这个世界。

无1M以上文件。

指令集

  1. x86/x64
  2. ARM/ARM64(AArch64)
  3. 其他相对小众的架构(如MIPS)

汇编基础总论

需掌握常用指令。



ARM前7个寄存器都是用于传递参数的。

内存传参:cdecl,stdcall,thiscall(会导致不能f5,this放到ecx里)

初级工具使用

二进制文件

  • 010editor

  • 模板功能,快速解析已知格式文件

  • 二进制复制与粘贴
  • 支持不同格式输入
  • 编码支持较差

其Template的语法类似于C结构体,可自行编写并加载,且支持基本的C语法如循环、判断等。

  • editplus

编码支持好

二进制编辑弱

~~Ultraedit, winhex~~

可执行文件查看

PE: CFF Explorer

MachO: MachOView

ELF: IDA

格式转换参数

推荐:Shellcode Helper

反汇编器

IDA: Interactive Disassembler

反汇编界面使用

  • 不同界面说明
  • 设置DATA/TEXT
  • 花指令

按D可以定义数据,按P可以变成函数,按U可以转成未定义,按C可以变成代码。

如何从字符串中找到对应的函数?

可以通过corss reference。

如何找到字符串?

shift+F12,或菜单中的string。

OJ平台300分以下的题目练习。

压缩壳(UPX,可拖壳)、加密壳(AESProtect)。

调试器

命令行调试器

gdb

  • 支持平台全面,有强大社区支持。

  • 支持配合gdbserver进行调试

windbg

  • 仅支持win平台

  • 可解析结构体,尤善于windows内部结果的解析

  • 支持插件,但插件较少。

  • 支持Win内核调试

图形界面调试器

OllyDBG

  • Win下老牌

  • 有着强大的社区。

  • 仅支持32位

  • 快捷键

X64dbg

  • 支持32位和64位

  • 仍在活跃开发中

  • 插件相对少

  • 快捷键与OD相同

IDA内置调试器

最强的调试器之一。

去除软件保护

  1. 侦壳

PEiD、ExeInfo

  1. 拖壳

搜索脱壳机,UPXshell。热门壳:UPX、ASPack

ESP定律快速拖壳:拖壳前后,ESP位置不变,在恢复堆栈时,将二进制文件DUMP出来。(只针对压缩壳)

  1. 去除花指令

使用OllyDBG脚本

手动总结特征码+批量替换。

  1. 去除混淆。

.net反混淆神奇de4dot(替换变量名、函数名等)。

定位验证代码

  1. 正面长驱直入

从入口点开始,逐步分析。

层层深入最后抵达验证函数

静态分析

  1. 从信息输入/输出处查找

查找引用了输入、输出函数的位置,回溯找到验证函数。

常见算法分析

  1. 没算法。
  2. 常见的算法。 简单异或 带雪崩效应的异或 加密算法(RSA、AES) 散列算法(MD5、SHA1)(具有常量值,可方便甄别) 解方程(z3,python解方程库)
  3. 有趣的算法 走迷宫

经验加成——加速CTF解题

  1. 边信道攻击 pintools检测程序执行指令数。应用:逐字节验证的题目。
  2. Google大法 加引号搜素sbox等常量。
  3. 逆向小trick 快速找main位置:寻找到一个跳转;从function list靠前的位置开始乱翻。 一般用户代码都在一起,可从main函数旁边翻。 应对MFC程序:使用xspy工具查看消息处理函数。 手动加载Signature:遇到无法自动识别的库函数时。(shift-F5)View→Open Subviews→Signature.
  4. 调试小技巧 如何得知MessageBox后在程序的哪里运行。 在OD或X64dbg中找到内存布局列表,设置内存断点。(区段断点、内存断点)

真实世界的逆向

  1. 代码量巨大
  2. 结构复杂,大量静态库、动态库
  3. 各种乱码
  4. 大量现代语言特性(OO、Template)
  5. 优化和加密壳非常常见
  6. 语言可能很神奇(Go VB Delphi)

IDA高级使用

  • 设置字符编码(alt-a)
  • 导出信息(shift-e),可以方便的导出、导入数据。
  • 选定打断数据(alt-l),然后按G跳转到指定位置,或许会批量应用类型等等。
  • 设置好第一个类型,然后批量选定,建立数组(快捷键*),但取消勾选create as array。
  • 设置间接跳转地址(change callee address),通过虚表来进行函数跳转。(事先需进行动态调试确定地址)
  • 修复PIE代码的switch语句(跳转表)(Edit-Other-Specify switch idiom),当存在PIE时可能会导致跳转表分析失效,于是需要我们手动修复来获得更好的分析效果。
  • IDApython《IDA pro权威指南》 应对VM虚拟机,解析全新指令集。 IDA自带支持脚本 可以使用几乎所有IDA的API 可以快速完成大量重复操作 可以方便的了解IDA内部的数据结构和结构
  • HexRays出错处理 postive sp value:较常出现,缺少调用约定、参数个数等信息,导致分析出错。 先勾选General-Option-StackPointer,查看栈值的变化。分析每一个Call指令,分析是否搞错了调用约定。也可强制更改但存在风险,快捷键ALT-K。 call analysis failed:分析调用时,未能成功解析参数位置/个数。 间接调用(类似call eax等),可使用之前的设置调用地址的方法。待补全。 对于直接调用,则检查调用目标的type,可变参数是引发这种错误的主要原因。 cannot convert to microcode:函数中存在数据类型,可按C转换为代码段。 rep jump之类的存在,解决方法是nop掉。 stack frame is too big:分析栈帧时出现错误。 找到不合常理的stack variable offset,双击进入栈帧界面,按u键删除对应stack variable 如果是壳导致的原因,先用OD等拖壳。 存在花指令,需去除花指令。 local variable allocation failed:局部变量的对应区域发生重叠,多见于ARM平台出现Point、Rect等8字节、16字节、32字节结构时尤其多见。 修改对应参数为多个int 修改IDA配置文件 F5分析不正确:IDA会自动分析不可达的死代码,常见起因是一个函数被标注成了noreturn。 双击进入函数,迫使其重新分析函数。 使用EditFunction,取消函数的does not return的选项。

HexRays高级使用

  1. 自定义寄存器传参。 使用__usercall__userpurge调用约定,注意为两个下划线。 int __usercall test(int a1)

源码级调试

但存在Bug很多,只支持ARM和X86平台。

IDA Processor

处理自定义指令集。 IDA手册查找相关资料。 相关代码参考: https://github.com/gyc990326/IDABinaryTranslator https://github.com/gyc990326/cLEMENCyTools

Manual Load

遇到32bit程序和64bit程序混合时的情况。 把两部分的代码分别分开,分别用对应的IDA打开。

IDA加载头文件

如果能够拿到程序的一部分头文件,比如程序公开的API接口,那么可以通过头文件让IDA了解struct结构并辅助分析。 常用于JNI相关程序逆向。 首先需先熟悉JNI调用的一般规范,约定等等。

恢复符号

找到程序的旧版本,对于苹果应用,可以使用AppAdmin获取低版本应用。Android的话可以酷安市场。 Rizzo匹配:https://github.com/devttys0/ida/tree/master/plugins/rizzo 模糊匹配,可以搜索并使用前人的工作结果。 看程序自带的string。 Google搜索源代码:早期版本被泄露过或早期被开源过。 按获得信息搜索源码:直接套用StackOverflow,直接套用CSDN代码。 自行制作Signature:IDASDK68文件夹,找到flair68文件夹。看雪网站上有根据静态库导出Signature的教程。或可搜索“IDA Sig”即可。

一些直觉

  • 代码靠前
  • 不会有奇怪代码
  • 库函数一般分布在一起,如果发现了_S_construct之类的典型库函数字符串,那么这一片就不需要看了。

搞定虚表

  • 虚表是一个业界难题
  • 虚函数的处理会因编译器的ABI的不同而不同
  • 但是存在各类插件:HexraysCodeXplorer,hexrays_tool,HexRaysPyTools,最后一个效果最好。

保护自己

为了避免误运行,拿到程序后可以先把程序的后缀名去掉。 不要在自己的真机上运行。

推荐书籍

《加密与解密》 《IDA Pro权威指南》 《软件调试》跳着看

请先登录
+1 已点过赞
5
分享到:
登录后才能发贴或参与互动哦! 点击登录

全部评论 (3)

betamao 2017-08-02 21:57:29
有人吗?那个。。。那个我想问问这个大佬是女的吗?有照片吗?我还没见过女黑客呢
回复
请先登录 3 +1 已点过赞

betamao @ betamao 2017-08-02 21:59:36

那个啥,不好意,走错片场了,不能删除。。。

回复
请先登录 1 +1 已点过赞
thj8 2017-08-16 17:53:26
<script>alert(1)</script>
回复
请先登录 0 +1 已点过赞
thj8 2017-08-16 17:54:01
<script>alert(1)</script>
回复
请先登录 0 +1 已点过赞