努力学习逆向第一天

努力学习逆向第一天

了解IDApro 基础使用

IDA反编译入门课程第一讲:IDA基础操作与入门CTF逆向题演示

IDA软件基础介绍与安装

IDA是由Hex-Ray公司开发的一款功能强大的集成反编译软件,应用领域十分广泛。无正版授权的用户可以在IDA官网下载免费的demo版本,本次课程使用的版本是IDA7.6,安装流程简单,仅需按照安装向导的指引完成操作即可。

IDA插件系统配置

IDA的插件系统基于Python开发,丰富的插件可以扩展IDA的各项功能。Python版本要求不低于3.8,如果系统内安装了多个版本的Python,可以使用IDA根目录下的idapyswitch.exe切换IDA使用的Python解释器。安装插件仅需将插件的Python文件放入IDA安装目录的plugins文件夹中即可。

课程核心依赖两个插件:

  • key patch:用于修改汇编指令,从GitHub下载获取,依赖Python第三方库keystone(keystone本身也是一个反汇编框架,会在后续课程讲解)
  • lazy ida:原版仅支持批量提取IDA内的数据,不支持修改数据;本次课程使用的是讲者自行修改的版本,新增了批量修改数据功能

IDA可执行文件的选择与目标程序位数判断

IDA目录下有ida.exe和ida64.exe两个可执行文件,选择规则和系统位数无关,只和待分析的目标程序位数有关:分析32位程序使用ida.exe,分析64位程序使用ida64.exe。

三种判断目标程序位数的方法:

  1. 在Linux系统中使用file命令,会输出可执行文件的格式与位数信息
  2. 使用pdi查壳软件分析可执行文件的位数
  3. 试错法:先用ida.exe加载,若为64位程序会报错,再换ida64.exe打开;用ida64.exe打开32位程序可正常加载,但无法生成正确的伪代码

很多新手会误以为IDA位数选择和自己的系统位数有关,实际只和目标程序位数有关,该误区会导致无法生成正确伪代码,是入门阶段非常容易踩的坑。

IDA核心窗口介绍

函数列表窗口

函数列表窗口一般位于IDA界面最左侧,会列出所有已经被IDA识别出的目标程序内的函数。按下CTRL+F可以输入关键字筛选包含关键词的函数,双击函数列表中的任意函数,IDA会自动跳转到该函数对应的代码位置。

IDA View主视图窗口

IDA View是IDA的主显示窗口,支持两种显示模式:

  • 图形模式:程序的基本块用方框展示,箭头代表程序的控制流,适合直观梳理程序逻辑
  • 文本模式:按下空格键切换,按线性地址顺序展示反汇编代码,和传统反汇编器的工作模式一致

额外快捷操作:按G键进行地址导航;按Tab键切换到对应函数的伪代码窗口。

伪代码窗口与字符串窗口

伪代码窗口展示对应函数的高层次伪代码,更符合人类阅读习惯,按Tab键即可在IDA View和伪代码窗口之间切换。

字符串窗口通过菜单栏view → open sub views → strings打开,快捷键为Shift+F12。注意:字符串窗口仅展示IDA已经识别出的程序内字符串,不包含未被IDA识别的字符串。在字符串窗口按CTRL+F可以搜索目标字符串,该快捷键在IDA所有表格窗口都可以用来筛选数据。

其他常用窗口

  • KVIEW窗口:默认展示程序的静态HEX数据,动态调试时展示内存中的动态数据
  • 导入表:列出程序引用的第三方动态库的所有函数,Windows程序通常会在导入表中存放user32.dll、GDI32.dll等系统DLL的API引用
  • 导出表:分析DLL、SO这类动态链接库时,需要通过导出表查看该动态库对外导出的函数
  • 结构体窗口:可以在IDA中定义C语言风格的结构体数据类型,大部分子窗口都可以在view菜单栏找到入口

实操案例:T1.exe

程序运行准备

本次演示使用的测试程序为T1.exe,是一个CTF逆向题,运行后会要求用户输入flag,验证输入是否正确。直接双击运行T1.exe会出现闪退,因为程序输出结果后直接退出,没有等待用户查看;可以通过PowerShell终端运行程序避免该问题,将程序放到C盘根目录后再运行可以解决路径特殊符号问题。

函数名直接定位main函数

IDA打开程序后,一共识别出5699个函数,大部分是不需要分析的库函数。在函数列表窗口按下CTRL+F输入main搜索,选择排在前面的main0跳转,即可定位到真正的main函数代码。

匿名函数重命名方法:选中未命名函数按N键,或者右键选择rename Global item,即可打开重命名窗口。带%s格式化符的输出函数可重命名为printf,输入函数可重命名为scanf,重命名可以大幅提升程序代码的可读性。

程序逻辑分析与flag获取

重命名完成后,程序逻辑清晰:main函数先通过scanf接收用户输入的字符串,再通过strcmp将输入字符串和预存字符串比较。C语言中strcmp比较两个字符串相等时返回0,因此判断逻辑需要对返回值取反。提取伪代码中预存的字符串,输入到T1.exe中,程序成功输出you are right,说明获取的flag正确。

字符串定位法寻找main函数

如果程序编译时去除了符号表,main函数会被IDA命名为sub+地址的形式,无法通过函数名搜索定位,此时需要使用字符串定位法:

  1. 运行程序预先得到输出字符串
  2. 打开字符串窗口搜索目标字符串
  3. 找到对应字符串后右键选择jump to xRef to operand(快捷键X
  4. 打开交叉引用窗口可以看到所有引用该字符串的代码
  5. 跳转后按F5Tab键生成对应位置的伪代码,找到main函数

函数名定位法快捷,仅适用于保留符号表的程序;字符串定位法更通用,适用于去除符号表的stripped版本,是逆向工程中更常用的技巧。

课程总结

入门逆向题标准流程:运行程序收集输出字符串 → 寻找字符串引用的代码 → 生成伪代码 → 修复匿名函数名称 → 分析程序逻辑得到flag。

"我们在做逆向的时候,一定要进行合理的猜测。"

"修复这些名字的作用,就是使得程序的可读性得到一个提升。"

爱心鼠标跟随特效
加一个悬浮音乐播放器

评论区

评论加载中...