Radare2从入门到放弃(上)
0x00 前言 之前一直使用IDA、OD、x64dbg,没接触过Radare2,故有此次学习之旅。本文仅介绍Radare2框架及radare2基础操作,后续将以radare2实操为主。 0x01 环境&&安装 环境:Ubuntu 18.04 LTS(内核版本:5.0.0-23-generic) 安装详见Github/官网 0x02 Radare2框架概述 若想了解更多,见R
0x00 前言
之前一直使用IDA、OD、x64dbg,没接触过Radare2,故有此次学习之旅。本文仅介绍Radare2框架及radare2基础操作,后续将以radare2实操为主。
0x01 环境&&安装
0x02 Radare2框架概述
若想了解更多,见Radare2 Book.
0x02.1 rabin2
从各种可执行文件(e.g.:ELF、PE、Java Class...)中获取基本信息。

0x02.2 rasm2
支持多种架构(包括但不限于Intel x86及x86-64、 MIPS、 ARM、 PowerPC、Java)的汇编以及反汇编。rasm2各项参数如下:

使用示例:

0x02.3 rahash2
支持多种哈希算法(包括但不限于MD4、 MD5、 CRC16、CRC32、 SHA1、SHA256)的哈希值计算工具。使用示例:

0x02.4 radiff2
比较二进制文件之间的不同。使用示例:

每行中间是数据变化,两端是位置。
0x02.5 rafind2
于文件中查找指定内容。rafind2各项参数如下:

使用示例:

0x02.6 ragg2
Radare2自行实现的高级语言编译器,默认语言是ragg2,但可以通过.c后缀实现C程序编译,示例如下:

编译.r后缀(ragg2语言):

0x02.7 rarun2
通过.rr文件为程序执行设定环境(e.g.:重定义stdin/stdout、改变环境变量...),.rr文件简单示例如下:
program=/bin/ls
arg1=/bin
# arg2=hello
# arg3="hello\nworld"
# arg4=:048490184058104849
# arg5=:!ragg2 -p n50 -d 10:0x8048123
# arg6=@arg.txt
# arg7=@300@ABCD # 300 chars filled with ABCD pattern
# system=r2 -
# aslr=no
setenv=FOO=BAR
# unsetenv=FOO
# clearenv=true
# envfile=environ.txt
timeout=3
# timeoutsig=SIGTERM # or 15
# connect=localhost:8080
# listen=8080
# pty=false
# fork=true
# bits=32
# pid=0
# pidfile=/tmp/foo.pid
# #sleep=0
# #maxfd=0
# #execve=false
# #maxproc=0
# #maxstack=0
# #core=false
# #stdio=blah.txt
# #stderr=foo.txt
# stdout=foo.txt
# stdin=input.txt # or !program to redirect input from another program
# input=input.txt
# chdir=/
# chroot=/mnt/chroot
# libpath=$PWD:/tmp/lib
# r2preload=yes
# preload=/lib/libfoo.so
# setuid=2000
# seteuid=2000
# setgid=2001
# setegid=2001
# nice=5
下面示例相当于ls /bin(没有颜色是因为bashrc文件中alias命令所致):

0x02.8 rax2
综合进制/浮点数/ASCII码转换,输出ASCII表等功能,小巧实用。各项参数说明如下:

示例如下:

0x02.9 radare2
整合上述所有功能,下文详述。
0x03 radare2
通过XCTF平台上的一道题目来说明radare2基本功能。下载地址。
使用rabin2 -I获取其信息(rabin2其他功能可通过-h参数自行查阅,不再赘述):

亦可使用rabin2 -Ir命令:

r2 Filename启动radare2:

命令交互界面类似gdb,左端[]内是当前所处位置,即entrypoint地址。
0x03.1 i/a/f/s系列命令
i系列命令用于获取信息,可通过i?查看(不用专门去记忆,方便快捷):

a系列命令用于分析当前程序(radare2不会自动分析,原因见radareorg),可通过a?查看该系列命令,aaa命令并不推荐使用(下图绿色区域是此命令功能,黄色方框内是此命令执行的操作):
因为执行
aaa命令是一项繁重的任务,在面对体积不大的程序时可以选择使用aaa。但如果程序体积庞大,则要按需进行分析(e.g.:aac、aap、aas...)。f系列命令与flagspace相关。radare2分析完后,会建立诸多offset-flag(offset可以是class[类]、function[函数]、string[字符串]... ),flags是相同offset(即offsets)的集合,名其为flagspace;flagspaces是flagspace的集合。关系如下所示:
可使用
fs命令查看flagspaces:
fs flagspace_name命令可选择flagspace,之后f命令会显示选中flagspace内flags:
s系列命令用于快速定位,s?查阅:
0x03.2 Strings
查看字符串
使用
iz/izz(二者区别可通过iz?查阅):
困扰在于字符串过多,如需定位特定字符串,见下。
查找字符串
通过
s addr或者其他定位命令定位到指定位置s/ DATA向下查找'DATA'第一次出现位置并定位于此ps(C语言中字符串以\0结尾,故用psz命令)显示字符串
到此,该题目已解决,Flag如上。
0x03.3 Refs/Xrefs
ax系列命令用于查看数据/代码间相互调用关系,ax?查阅:

0x03.4 @@系列
@@与命令搭配使用,效果极佳。@@?查阅:

笼统概括其功能:对于每一匹配项执行某命令。注意:使用x @@ sym.*命令前应确定当前flagspace是否正确,通配符sym.*中的str.可通过f命令确定。
0x03.5 Function
查看所有函数
查看所有函数使用
afl系列命令。可通过afl?查阅,这里不一一列举,以下常用:afl:查看函数列表afl.:查看当前所处位置的函数aflt:以表格形式列出函数afls:以地址或名字或大小给函数列表排序(但不输出)
反汇编某一函数
pd系列命令功能是反汇编并显示,pd?查阅:
可以指自行指定字节(
len可正亦可负)反汇编并显示,亦能够根据分析反汇编某一具体函数并显示。示例如下:aaa分析程序并自动命名函数afl查看函数列表s Function_Name定位到Function_Name函数的起始位置(Function_Name通过上一步骤得知)pdf反汇编该函数并显示结果(步骤3,4可以整合为一条命令pdf @Function_Name,因为@ 0等同于s 0)
反编译某一函数
pdc用于反编译某一函数,类似IDA中F5键功能。
0x03.6 Visual Mode
命令行模式下输入V进入radare2的视图模式,视图模式下q键即可退出。视图模式下的操作如下:
HJKL分别对应左、下、上、右,可以使用数字+HJKL一次移动多行或多个字符(JK以行移动,HL以字符移动)视图模式下
p键可以切换不同面板,顺序(前三个常用):Hex -> Disassembly → Debug → Words → Buf
g键用于定位。弹出[offset]>后,输入函数名称可定位到该函数;定位flag时可在输入部分之后通过Tab键进行选择,如下所示:
[0-9]键用于跟踪某一跳转或调用,下图情形下3键可定位到printf()函数,u键回到之前位置,U键用于重复此次定位:
d键用于改变当前位置的数据类型,类似于IDA中d键功能,但比其强大。c键进入光标模式。选中字节会高亮显示,选择多个字节使用Shift+HJKL;该模式下f键用于为某一位置自定义一flag,方便定位:
i键用于修改选定数据(前提是打开文件时使用-w参数,否则文件是只读状态,无法修改)A键用于在修改时提供实时预览:
:用于键入命令;键用于添加注释/键用于高亮指定字符串:
注:
!键进入Visual Panels,详见Radare2 Book。V键进入Visual Graphs(类似于IDA的图形化模式)。
0x03.7 Debugger
打开时使用-d参数进入Debugger模式,常用命令:
db flag/address/function name: 设置断点db - flag/address/function name: 删除断点db: 列出所有断点dc:运行程序dcu address:运行程序直到某一处为止dr: 显示寄存器状态ds: 单步步进(等同于OD中F7)dso: 单步步过(等同于OD中F8)dm: 显示内存ood:重新以Debugger模式打开程序(类似OD中Ctrl+F2,但该命令只打开不运行)ood arg1 arg2: 带参数重新打开
0x04 rahash2
rahash2虽然只是Radare2框架的一部分,但因其功能强大可以单独拿出来作为加解密工具使用。其常用功能如下(更多功能请通过rahash2 -h自行探索):
其支持算法可通过
rahash2 -L查阅,算法种类已经可以满足大多需求:
-a参数用于指定算法,如果后面是all,则会列出所有哈希算法的结果-E与-D分别对应加密与解密,其后通过-S指定Key,-I指定初始化向量(IV)-f与-t用于指定起始与结束地址-s用于将其后字符串作为明文
使用示例如下:


0x05 总结
Radare2不应该只是IDA在Linux平台上的替代品而已,其中某些功能是Radare2所独有的,熟悉Radare2的使用将使得进行逆向分析时事半功倍。附一张对比表:IDA Pro、radare2、GDB、WinDgb.
@带头大嘎子哥 兄弟所言极是。