0x01-逆向基础

逆向基础

认识妹子

刚毕业的高中大佬,Nu1l的逆向/misc选手,北邮大一新生,Tea Deliverers摸鱼党。

大佬讲课风趣幽默,各种比喻各种画风乱入啊(膜二次元大佬)。常见指令集: x86/x64ARM/ARM64(AArch64)其他小众架构(MIPS)

运算指令:加减乘除、与或非、异或 数据转移指令:读取、写入不同长度的内存,写入寄存器 跳转指令:无条件跳转、条件挑战 栈操作指令:入栈、出栈

X86命令是E开头的,高8位、低8位。64位指令集是R开头的。 RIP指向下一条执行的命令,RSP指向栈顶,RBP指向栈帧中心。

ARM寄存器: SP等于ESP,R11=EBP,LR是用于保存调用者地址方便返回PC在ARM中指向两条指令之后。

shl/sql lsl shr lsr sar asr mul str idiv str jmp/jcc b/bx/bcc 函数调用 call bl/blx

栈后进先出,堆先进先出。

讲了010 Editor的基本用法,tamplates的无脑使用。然后扩展了tamplates的编写格式以及如何编写tamplates。

PE:CFF Explorer MachO:MachOView-ios重签名 ELF:IDA

格式转换工具:Shellcode Helper

IDA的使用: 反汇编界面: -不同界面说明 -设置Date、Code(d、c)d会变成1、2、4、8字节。 -查看Cross Reference(x) -查看String List(Shift-F12) -p设置函数 -y设置类型 ctrl+s追踪

F5反编译使用:

调试器: -命令行调试器:gdb配合gdbserver远程调试 windbg强于解析结构体,善于win内部结构的解析与现实,支持win内核调试,支持win远程调试。 -图形调试器:ollydbg x64dbg IDA内置调试器

步进-单步执行-F7 步过-单步执行,call、jmp之类的会跳过-F8 运行至指定位置-下断点并运行到这个断点-F4 运行-运行程序-f9 下断点-F2

x64dbg: 32、64都支持调试,快捷键与od相同。 ida内置调试器: 快捷键与od相同,菜单栏debugger。 支持多种后端:ida内置调试器,gdb\windbg。 支持远程调试:兼容gdbserver、官方支持arm\arm64\x86\x64指令集远程调试、支持android ios win linux,支持配合hex-rays调试。

恋爱循环

大佬果然是二次元的,自己的每个图片都认得。

侦壳:PEID\Exeinfo 热门压缩壳:upx,ASPack 脱壳:脱壳机-upxshell,esp堆栈平衡定律脱壳,只能针对压缩壳 去除花指令:OD脚本,手动总结特征码+修改 去除混淆:.net饭混淆神器de4dot。

破解保护外壳 理解程序逻辑 找到验证函数 逆推得到flag

定位验证代码:1、正向分析->静态分析。 2、输入输出开始分析

常见算法:异或、雪崩效应异或(逆推)、加密算法(RSA\AES)、散列算法(MD5\SHA1)、解方程、走迷宫、脑洞算法。

边信道攻击: -pintools检测程序执行指令数 -应用:逐字节验证的题目

谷歌大法好: 加双引号搜索S-Box等常量快速确定算法

逆向小技巧: 快速找main位置——寻找到一个大跳转 快速定位关键位置——从Function List靠前的位置开始乱翻,从main函数旁边翻,(编译时不同的源文件会被分别编译为.o再由编译器合并,编译命令行中库文件在最末) 应对MFC程序:用xspy工具查看消息处理函数(看雪论坛),拖上去看感兴趣的函数如OnClick OnCommand等。 手动加载Signature:碰到无法自动识别的函数时,(Shift-F5)View->Open Subviews->Signatures,(Shift-F11)vc6win库

如何得到MessageBox在哪里:1、在OD或者x64dbg种找到内存布局列表(OD:Alt-M或查看->内存)(x64dbg:窗口栏点击内存布局) 2、找到自己程序代码段,通常.text,f2下区段断点。返回程序点击确定即可。

真实逆向: 代码量巨大,结构复杂,大量静态库、动态库,各种乱码,大量现代语言特性-OO-Template,优化和加密壳十分常见,语言很多Go\VB\Delphi。

IDA的高级使用

设置字符串编码&格式:-快捷键:Alt+A -可以设置字符串类型:Unicode字符串(WCS)多字节字符串(MBS)其他 -可以设置字符串编码:需要系统支持对应编码

Shift+F5导入运行库识别。

change encoding->右键->Insert

导入和导出数据

方便的提取数据或修改idb数据库 (Shift-E)导出数据 菜单名:Edit->import/export data

选定大段数据:Alt-L 菜单名:Edit->Begin Selection标定选择起始点 随意滚动或按G跳转到结束为止。

批量应用类型:组合技 设置好第一个类型,选定数据(不选择ida会选择尽可能多的设置类型)按*或者D弹出建立数组对话框。 设置简介跳转地址:Alt+F11——Edit->Plugins->Change the callee address 利用动态调试获取到的调用/跳转地址填入,帮助ida和f5的分析。 修复跳转表: Edit->Other->Specify switch idiom 当跳转表分析失败,则需要我们手动修复。

IDAPython -IDA自带支持脚本,可以使用几乎所有IDA提供的API。可以快速完成大量重复性操作。可以方便了解IDA内部的数据和结构。《IDA权威指南》

HexRays出错处理

常见F5出错信息:

-posutuve sp value 成因:IDA会自动分析SP寄存器的变化量,由于缺少调用约定、参数个数等信息,导致分析出错。解决方案:

  • 推荐:Option->General设置显示Stack Pointer。检查对应地址附近的调用约定以及栈指针变化。
  • 不推荐:也可以强行alt+k输入较大负值。

-call analysis failed 成因:F5在分析调用时,未能成功解析参数位置/参数个数。解决方案:

  • 对于间接调用(类似call eax等),可使用之前讲过的设置调用地址方法解决。
  • 对于直接调用,查看调用目标的type是否正确设置。可变参数是引发这种错误的主要原因之一。

-cannot convert to microcode 成因:部分指令无法被反编译,解决方案:

  • 因为函数中间有未设置成指令的数据字节,按c设置为指令集科。
  • x86种的rep前缀,比如repXX jmp等,将该指令的第一个字节(repXX前缀的对应位置)patch为0x90。(nop)

-stack frame is too big 成因:在分析栈帧时,IDA出现异常,导致分析出错。此问题十分罕见。解决方案:

  • 找到明显不合常理的stack variable offse ,双击进入栈帧界面,按u键删除对应stack variable,
  • 如果是壳导致的,先脱壳即可。
  • 可能因为花指令,手动、自动检查并去除花指令。

-local variable allocation failed 成因:分析函数时,有部分变量对应的区域发生重叠,多见于ARM平台出现Point\Rect等8字节、16字节、32字节结构时尤其多见。解决方案:

  • 修改对应参数为多个int
  • 修改ida安装目录下的hexrays.cfg中的HO_IGNORE_OVERLAPS。

-F5分析结果不正确 成因:F5会自动删除其认为不可能到达的死代码。因为一个函数错误的被标注成了noreturn函数。解决方案:

  • 进到目前反编译结果,找到最后被调用的函数(被错误分析的函数)双击进入,再返回(迫使HexRays重新分析)
  • 进到被错误分析的函数,按tab切换到反汇编界面,按ALT+P进入界面取消函数的Does not return属性。

HexRays的高级使用

自定义寄存器传参:

  • 使用IDA中的__usercall和__userpurge调用约定(两个下划线)。
  • <>中为对应值的位置,第一个<>中为返回值位置,注意返回值的位置即使不变也要填写。
  • 设置范例:

      int __usercall test<eax>(int a1<ebx>);
    

HexRays源码级调试:

  • F5中显示的变量很可能不是变量原来的值,尤其是寄存器变量,尽量在赋值位置断下并查看值。
  • 对于优化后的代码,F5调试中bug很多。
  • F5单步不稳定,ARM容易跑飞。
  • F5运行至指定位置功能不稳定,容易跑飞。

编写IDA Processor

太高端,实在是跟不上。作为普及知识也太恐怖了,毕竟完全没接触过。如果能有编写手册之类的可以看就好了。不过至少知道有这个东西了。以后再自己找官方手册慢慢啃吧,哎。

IDA手动加载

遇到特殊情况,例如32、64位代码混合,程序没有对应的加载器。我们需要手动加载。打开文件后的对话框勾选Manual Load即可。

IDA加载头文件

如果有程序的一部分头文件,如程序公开的API接口,可以通过头文件让IDA了解这个结构并辅助分析。

恢复符号

  • 找程序旧版本,搜索引擎搜索旧版本参考利用
  • 苹果可用appadmin获取低版本应用。

使用Rizzo匹配

看程序自带的string。有些程序自带了大量调试信息没有去除。

谷歌搜索源代码

许多程序早期版本或分支源码流出过。 大量库是开源的,按获得信息搜索源码。直接套用Stack Overflow答案,直接套用CSDN代码。

自己制作Signature

  • IDA提供自动制作Signature的工具
  • 打开IDASDK68找到flair68文件夹

多角度切入

多个切入位置,例如想让WIN10 14393允许关闭UAC时运行Windows Store App就有以下切入点:

  • (反向)注册表中EnablelUA键值控制UAC开闭
  • (反向)“无法使用内置管理员账户”提示
  • (正向)从Store App启动流程入手,Calc.exe APpxLanucer.exe

直觉硬上

  • 用户代码一般在程序靠前的地方
  • 用户代码一般不会有奇怪算法
  • 库函数同样分布在一起,发现了_S_construct之类的典型库函数字符串,那么周围一般都是库函数。

搞定虚表

虚函数会因为编译器采用的abi不同而不同 ida本身不支持虚表,但是有插件:

HexRaysPyTools

保护自己

先把程序后缀名去掉(避免误运行)不要在真机运行(可能被格盘等各种)打开360等HIPS防御软件。

《加密与解密》《IDP Pro权威指南》《软件调试》

总结

懵逼一整天,讲的太快了,操作跟不上。IDA Processor之类的就不说了,手动脱壳以及修复跳转表都操作失败了。心累,我可能是假的吧。今天明确了Re需要学什么以及记录了各种以上小技巧。

转载请注明:碎雪的小屋 » 0x01-逆向基础

Show Disqus Comments

Search

    Table of Contents