Bl4ck_Ho1e
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

前言
IDA pro虽然功能强大、操作简单,但价格也同样非常昂贵。逆向研究者发起和寻求开源的逆向解决方案,radare2就是其中较为优秀的一支。虽然说radare2是基于命令行的工具,但其能力完全不亚于IDA pro。但是radare2的入门用户往往被其命令行的较高门槛劝退,而中文用户更苦于radare2文献资源在国内较为匮乏。所以天翼云安全实验室决定对其展开学习和研究,同时总结一些优质的中文文献提供给中文逆向研究人员。
本文(系列文章)主要包括对Radare2官方文档和资料的精炼,以及实验室安全研究人员对Radare2学习和实践的总结。主要的参考目录如下:
基本知识
总的来说,radare2是个基于命令行的逆向工具,但是也有GUI,一方面是自带的web页面,可以通过-c
参数开启:
r2 -c=H /path/to/binary
也有一些第三方开发的GUI应用程序,不过大多数项目都停摆了,目前还活跃且值得推荐的是Cutter,可以去安装一个来上手。
组件介绍
更准确来说,radare2不只是一个工具,而是一个框架,是众多逆向分析工具的组合,接下来将会分别介绍。
radare2
这个是主程序,可以用于通过一系列的命令对文件进行分析与调试,还支持多种语言如Python、Ruby的脚本调用。
rabin2
二进制文件分析器,比如读取ELF信息、导出符号表等。
rasm2
汇编工具,支持x86、ARM、MIPS甚至JAVA语言与机器码的互转。举个例子:
# 机器码0x90对应x86汇编NOP
$ rasm2 -a x86 -d '90'
nop
# JAVA的NOP机器码为00
$ rasm2 -a java 'nop'
00
rahash2
计算文件hash的工具,支持MD系列、SHA系列多个算法。
radiff2
二进制文件比对工具。
rafind2
在文件中进行特定特征查找的工具。
ragg2
r_egg中间语言编译工具。
rarun2
运行二进制的工具,可以为二进制的运行提供特定环境。举个例子
# 把二进制运行的输入输出定向到TCP socket上
$ nc -l 9999
$ rarun2 program=/bin/ls connect=localhost:9999
rax2
进制转换工具,还可以进行Hex和Str的转换。
基本概念
在radare2的世界里,一个二进制的逆向分析过程需要包括3个步骤:Navigation、Inspection和Modification。
对于radare2中的命令,都可以在命令后加一个?
来获取使用说明,比如说p?
查看print相关的命令,用s?
查看地址跳转相关的命令和使用方法。
Navigation(定位)
逆向分析需要从庞大的二进制文件中定位到关键代码,就是Navigation。Naviation中最重要的是seek命令。
seek命令用于跳转到对应的地址,比如0x100
或者[0x100+ptr_table]
。使用s++
和s--
可以前后移动,默认步长是0x100。
至于地址,使用的是虚拟地址(VA)也就是基址+偏移的模式。如果r2通过non-VA
模式打开二进制,则seek命令的跳转则是只基于文件的偏移地址。
# 一些很直观的用法
s 0x100
s+4
s rsp+0x40
# 返回上一个地址
s-
Inspection(分析)
逆向分析的一个工作要点就是分析二进制文件的功能,print(简写为p)是分析工作中的一个重要命令。
V命令可以用来开启可视化模式,在可视化模式下可以使用方向键或HJKL移动,同时按住shift的话可以进行选择。按Q退出,按P可以在多种模式间切换。
毕竟在计算机的世界里,一切数据都是二进制,所不同的只是解读的方式。所以radare2为p命令提供了非常丰富的功能用于解析数据,具体用法可以通过命令p?
获取。
px # 16进制打印数据
pxw # 32bits一组打印16进制数据
pxq # 同上,64bits一组
除了这些基础数据的打印之外,还支持一些更复杂的数据形式,可以使用pf??
查询,以及pf???
查询使用示例。类似于格式化字符串,例如pf xxS
就是分别用2个16进制和1个字符串打印当前指向的3个地址。
# 打印栈,打印2个16进制和1个字符串
pf xxS @ rsp
# 定义一个结构体,其格式为xi(1个16进制和1个整数,16进制取名为foo,整数取名为bar),打印3个该结构体
pf 3xi foo bar
字符串也是非常重要的数据类型,字符串相关的命令可以通过ps?
查询。
接下来就是解析指令了,使用的是pd
系列命令。
# 指定架构,或者查询有什么架构可以使用
e asm.arch=??
# 指定汇编的风格
e asm.syntax = intel
# 解析1条汇编指令
pd 1
Monification(修改)
write命令(简写为w)可用于写入数据。
w hello
:写入字符串wx 90 90 90
:写入十六进制wa nop
:写入汇编wf another.bin
:从其他文件读取内容来写入
启动参数
在不解析文件头的同时,以write模式打开二进制文件。
r2 -nw [file]
打开r2,而不打开任何文件。
r2 -
使用指定的指令集打开文件。
# 先查看目前支持的指令集
rasm2 -L
# 使用32位x86指令集
r2 -a x86 -b 32 [file]
在进行正式工作之前先跑一段脚本。
r2 -i patch.r2 [file]
设置参数、变量等
r2 -e scr.color=0 [file]
进行动态调试
r2 -d [file或者pid]
r2交互式命令指南
命令
在进入了r2的交互页面之后,就可以使用r2的交互命令进行二进制分析。r2的交互命令格式基本如下所示:
[.][times][cmd][~grep][@[@iter]addr!size][|>pipe];
上面的描述比较晦涩,所以下面举一些例子来理解r2的交互命令。
多次执行
# 执行px,也就是十六进制形式打印数据
px
# 执行3次px,也就是利用上述格式中的[times]
3px
用!
前缀执行shell命令
@和@@
简单理解来看,@
可以用于指定对象,比如寄存器或者地址,@@
可以指定多个对象。
# 十六进制格式打印esp的200字节数据
px 200 @ esp
# 对每一个符号写入0x90(NOP指令)
wx 90 @@ sym.*
# 标记0x10为abc
f abc @ 0x10
其他示例
# C字节数组形式打印,并输出到文件
pc > file.c
# 反编译2000条汇编,并过滤出使用eax的
pd 2000 | grep eax
# 多条指令写在一行
px 20; pd 3; px 40;
关于过滤
其中[~grep]
是提供给无法使用grep
或者wc
等命令的非*nix用户(比如微软家的用户),这里就不做介绍了,具体用法可以使用~?
查询。
命令历史
# 查看命令历史记录
!~
# 可以滚动的交互模式,查看命令历史
!~...
表达式
使用?
指令解析数据,或者表达式。
数据可以有很多种表达方式:
0x233 : 十六进制
2333 : 十进制
sym.main : main函数(符号)的地址
10M : 10 * 1024 * 1024
还有很多通过$
符号索引的数据:
$$ : 当前地址
$l : 当前汇编长度
$j : 如果当前指令是跳转指令的话,可以得到跳转的地址
$f : 如果当前指令是跳转指令的话,可以得到**不跳转**的地址,比如jz不跳转的话去哪
$m : 汇编代码中提到的地址,比如mov eax, [0x10]中的0x10
后记
本章是系列的开篇,主要对radare2进行了基本的介绍,以及功能的初步讲解和示范,所以也只是选取了个人认为在逆向研究中较为重要的功能进行了记录,而对于软件配置、安装等章节则忽略处理,有具体需要的读者可以参考其详细的 官方文档进行学习。
而本章作为开篇,确实理论多于实践,在后续的文章中会多多从实操的角度展开radare2的学习研究。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)