使用这个功能齐全的 Linux 工具探索二进制文件使用这个功能齐全的 Linux 工具探索二进制文件使用这个功能齐全的 Linux 工具探索二进制文件使用这个功能齐全的 Linux 工具探索二进制文件
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

使用这个功能齐全的 Linux 工具探索二进制文件

Radare2 是一款专为二进制分析定制的开源工具。

在在 Linux 上分析二进制文件的 10 种方法中,我解释了如何使用 Linux 丰富的本机工具来分析二进制文件。但如果您想进一步探索二进制文件,则需要一个专门用于二进制分析的工具。如果您不熟悉二进制分析并且主要使用脚本语言,9 个基本的 GNU binutils 工具将帮助您开始学习编译过程以及二进制文件的构成。

为什么我需要另一个工具?

如果现有的 Linux 原生工具可以做类似的事情,人们很自然会问为什么还需要另一个工具。嗯,这与您使用手机作为闹钟、记笔记、相机、听音乐、上网以及偶尔拨打和接听电话的原因相同。以前,单独的设备和工具处理这些功能——比如用于拍照的物理相机、用于记笔记的小记事本、用于起床的床头闹钟等等。对于用户来说,使用一台设备来完成多项(但相关的)事情很方便。此外,杀手级功能是各个功能之间的互操作性。

同样,尽管许多 Linux 工具都有特定的用途,但将类似(且更好)的功能捆绑到单个工具中还是非常有帮助的。这就是为什么我认为每当您需要使用二进制文件时 Radare2 都应该是您的首选工具。

根据 Radare2(也称为 r2)的 GitHub 简介,它是一个“类 Unix 逆向工程框架和命令行工具集”。名字中的“2”是因为这个版本是从头开始重写的,以使其更加模块化。

为什么选择雷达2?

有大量(非本机)Linux 工具可用于二进制分析,那么为什么要选择 Radare2?我的理由很简单。

首先,它是一个开源项目,拥有活跃、健康的社区。如果您正在寻找巧妙的新功能或错误修复的可用性,这非常重要。

其次,Radare2 可以在命令行上使用,并且它有一个丰富的图形用户界面 (GUI) 环境,称为 Cutter,适合那些更熟悉 GUI 的用户。作为一名长期的 Linux 用户,我更喜欢 shell。虽然熟悉 Radare2 的命令有一点学习曲线,但我将其与学习 Vim 进行比较。您首先学习基本的东西,一旦掌握了它们,您就可以继续学习更高级的东西。很快,它就会成为第二天性。

第三,Radare2 通过插件对外部工具提供了良好的支持。例如,最近开源的 Ghidra 二进制分析和逆向工具因其反编译功能而广受欢迎,这是逆向软件的关键要素。您可以直接从 Radare2 控制台安装和使用 Ghidra 反编译器,这真是太棒了,可以让您两全其美。

开始使用 Radare2

要安装 Radare2,只需克隆存储库并运行 user.sh 脚本即可。如果您的系统上尚未安装一些必备软件包,您可能需要安装它们。安装完成后,运行r2 -v命令查看Radare2是否已正确安装:

$ git clone https://github.com/radareorg/radare2.git
$ cd radare2
$ sys/user.sh

# version

$ r2 -v
radare2 4.6.0-git 25266 @ linux-x86-64 git.4.4.0-930-g48047b317
commit: 48047b3171e6ed0480a71a04c3693a0650d03543 build: 2020-11-17__09:31:03
$ 

获取示例测试二进制文件

现在 r2 已安装,您需要一个示例二进制文件来试用。您可以使用任何系统二进制文件(ls、bash 等),但为了使本教程保持简单,请编译以下 C 程序:

$ cat adder.c 
#include <stdio.h>

int adder(int num) {
	return num + 1;
}

int main() {
	int res, num1 = 100;
	res = adder(num1);
	printf("Number now is  : %d\n", res);
	return 0;
}
$ 
$ 
$ gcc adder.c -o adder
$ 
$ file adder
adder: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=9d4366f7160e1ffb46b14466e8e0d70f10de2240, not stripped
$ 
$ ./adder 
Number now is  : 101
$ 

加载二进制文件

要分析二进制文件,您必须将其加载到 Radare2 中。通过将文件作为命令行参数提供给 r2 命令来加载它。您将进入与 shell 不同的单独 Radare2 控制台。要退出控制台,您可以输入 Quit 或 Exit 或按 Ctrl+D:

$ r2 ./adder
 -- Learn pancake as if you were radare!
[0x004004b0]> quit
$ 

分析二进制文件

在您探索二进制文件之前,您必须要求 r2 为您分析它。您可以通过在 r2 控制台中运行 aaa 命令来做到这一点;

$ r2 ./adder
 -- Sorry, radare2 has experienced an internal error.
[0x004004b0]> 
[0x004004b0]> 
[0x004004b0]> aaa
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Check for vtables
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information
[x] Use -AA or aaaa to perform additional experimental analysis.
[0x004004b0]> 

这意味着每次您选择一个二进制文件进行分析时,您都必须在加载该二进制文件后向 aaa 输入额外的命令。您可以通过使用 -A 调用 r2 并后跟二进制名称来绕过此问题;这告诉 r2 自动为您分析二进制文件:

$ r2 -A ./adder
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Check for vtables
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information
[x] Use -AA or aaaa to perform additional experimental analysis.
 -- Already up-to-date.
[0x004004b0]> 

获取有关二进制文件的一些基本信息

在开始分析二进制文件之前,您需要一个起点。在许多情况下,这可以是二进制文件的文件格式(ELF、PE 等)、二进制文件构建的架构(x86、AMD、ARM 等)以及二进制文件是 32 位还是 64 位。 R2 方便的 iI 命令可以提供所需的信息:

[0x004004b0]> iI
arch     x86
baddr    0x400000
binsz    14724
bintype  elf
bits     64
canary   false
class    ELF64
compiler GCC: (GNU) 8.3.1 20190507 (Red Hat 8.3.1-4)
crypto   false
endian   little
havecode true
intrp    /lib64/ld-linux-x86-64.so.2
laddr    0x0
lang     c
linenum  true
lsyms    true
machine  AMD x86-64 architecture
maxopsz  16
minopsz  1
nx       true
os       linux
pcalign  0
pic      false
relocs   true
relro    partial
rpath    NONE
sanitiz  false
static   false
stripped false
subsys   linux
va       true

[0x004004b0]> 
[0x004004b0]>

进出口

通常,一旦您知道正在处理哪种类型的文件,您就想知道二进制文件使用哪种标准库函数或了解程序的潜在功能。在本教程的示例 C 程序中,唯一的库函数是用于打印消息的 printf。您可以通过运行 ii 命令来查看这一点,该命令显示了所有二进制文件的导入:

[0x004004b0]> ii
[Imports]
nth vaddr      bind   type   lib name
―――――――――――――――――――――――――――――――――――――
1   0x00000000 WEAK   NOTYPE     _ITM_deregisterTMCloneTable
2   0x004004a0 GLOBAL FUNC       printf
3   0x00000000 GLOBAL FUNC       __libc_start_main
4   0x00000000 WEAK   NOTYPE     __gmon_start__
5   0x00000000 WEAK   NOTYPE     _ITM_registerTMCloneTable

二进制文件还可以有自己的符号、函数或数据。这些函数通常显示在Exports 下。测试二进制文件有两个导出的函数(main 和 adder)。其余函数是在构建二进制文件的编译阶段添加的。加载器需要这些来加载二进制文件(现在不要太担心它们):

[0x004004b0]> 
[0x004004b0]> iE
[Exports]

nth paddr       vaddr      bind   type   size lib name
――――――――――――――――――――――――――――――――――――――――――――――――――――――
82   0x00000650 0x00400650 GLOBAL FUNC   5        __libc_csu_fini
85   ---------- 0x00601024 GLOBAL NOTYPE 0        _edata
86   0x00000658 0x00400658 GLOBAL FUNC   0        _fini
89   0x00001020 0x00601020 GLOBAL NOTYPE 0        __data_start
90   0x00000596 0x00400596 GLOBAL FUNC   15       adder
92   0x00000670 0x00400670 GLOBAL OBJ    0        __dso_handle
93   0x00000668 0x00400668 GLOBAL OBJ    4        _IO_stdin_used
94   0x000005e0 0x004005e0 GLOBAL FUNC   101      __libc_csu_init
95   ---------- 0x00601028 GLOBAL NOTYPE 0        _end
96   0x000004e0 0x004004e0 GLOBAL FUNC   5        _dl_relocate_static_pie
97   0x000004b0 0x004004b0 GLOBAL FUNC   47       _start
98   ---------- 0x00601024 GLOBAL NOTYPE 0        __bss_start
99   0x000005a5 0x004005a5 GLOBAL FUNC   55       main
100  ---------- 0x00601028 GLOBAL OBJ    0        __TMC_END__
102  0x00000468 0x00400468 GLOBAL FUNC   0        _init

[0x004004b0]> 

哈希信息

你怎么知道两个二进制文件是否相似?您无法准确打开二进制文件并查看其中的源代码。在大多数情况下,二进制文件的哈希值(md5sum、sha1、sha256)用于唯一标识它。您可以使用 it 命令查找二进制哈希:

[0x004004b0]> it
md5 7e6732f2b11dec4a0c7612852cede670
sha1 d5fa848c4b53021f6570dd9b18d115595a2290ae
sha256 13dd5a492219dac1443a816ef5f91db8d149e8edbf26f24539c220861769e1c2
[0x004004b0]> 

功能

代码被分组为函数;要列出二进制文件中存在哪些函数,请运行 afl 命令。以下列表显示了主要功能和加法器功能。通常,以 sym.imp 开头的函数是从标准库(本例中为 glibc)导入的:

[0x004004b0]> afl
0x004004b0    1 46           entry0
0x004004f0    4 41   -> 34   sym.deregister_tm_clones
0x00400520    4 57   -> 51   sym.register_tm_clones
0x00400560    3 33   -> 32   sym.__do_global_dtors_aux
0x00400590    1 6            entry.init0
0x00400650    1 5            sym.__libc_csu_fini
0x00400658    1 13           sym._fini
0x00400596    1 15           sym.adder
0x004005e0    4 101          loc..annobin_elf_init.c
0x004004e0    1 5            loc..annobin_static_reloc.c
0x004005a5    1 55           main
0x004004a0    1 6            sym.imp.printf
0x00400468    3 27           sym._init
[0x004004b0]> 

交叉引用

在 C 语言中,主函数是程序开始执行的地方。理想情况下,从 main 调用其他函数,并且在退出程序时,main 函数向操作系统返回退出状态。这在源代码中很明显;但是,二进制文件又如何呢?如何知道加法器函数在哪里被调用?

可以使用axt命令后跟函数名来查看adder函数在哪里被调用;如下所示,它是从 main 函数中调用的。这称为交叉引用。但是什么叫主函数本身呢?下面的 axt main 函数显示它是由 entry0 调用的(我将把了解 entry0 作为读者的练习):

[0x004004b0]> axt sym.adder
main 0x4005b9 [CALL] call sym.adder
[0x004004b0]> 
[0x004004b0]> axt main
entry0 0x4004d1 [DATA] mov rdi, main
[0x004004b0]> 

寻找地点

处理文本文件时,您通常通过引用行号后跟行号或列号来在文件中移动;在二进制文件中,您使用地址。这些是以 0x 开头的十六进制数字,后跟地址。要查找二进制文件中的位置,请运行 s 命令。要移动到其他位置,请使用 s 命令,后跟地址。

函数名称就像标签,内部用地址表示。如果函数名称位于二进制文件中(未剥离),则可以使用 s 命令后跟函数名称来跳转到特定函数地址。同样,如果您想跳转到二进制文件的开头,请输入 s 0:

[0x004004b0]> s
0x4004b0
[0x004004b0]> 
[0x004004b0]> s main
[0x004005a5]> 
[0x004005a5]> s
0x4005a5
[0x004005a5]> 
[0x004005a5]> s sym.adder
[0x00400596]> 
[0x00400596]> s
0x400596
[0x00400596]> 
[0x00400596]> s 0
[0x00000000]> 
[0x00000000]> s
0x0
[0x00000000]> 

十六进制视图

通常,原始二进制文件没有意义。它可以帮助以十六进制模式查看二进制文件及其等效的 ASCII 表示形式:

[0x004004b0]> s main
[0x004005a5]> 
[0x004005a5]> px
- offset -   0 1  2 3  4 5  6 7  8 9  A B  C D  E F  0123456789ABCDEF
0x004005a5  5548 89e5 4883 ec10 c745 fc64 0000 008b  UH..H....E.d....
0x004005b5  45fc 89c7 e8d8 ffff ff89 45f8 8b45 f889  E.........E..E..
0x004005c5  c6bf 7806 4000 b800 0000 00e8 cbfe ffff  ..x.@...........
0x004005d5  b800 0000 00c9 c30f 1f40 00f3 0f1e fa41  .........@.....A
0x004005e5  5749 89d7 4156 4989 f641 5541 89fd 4154  WI..AVI..AUA..AT
0x004005f5  4c8d 2504 0820 0055 488d 2d04 0820 0053  L.%.. .UH.-.. .S
0x00400605  4c29 e548 83ec 08e8 57fe ffff 48c1 fd03  L).H....W...H...
0x00400615  741f 31db 0f1f 8000 0000 004c 89fa 4c89  t.1........L..L.
0x00400625  f644 89ef 41ff 14dc 4883 c301 4839 dd75  .D..A...H...H9.u
0x00400635  ea48 83c4 085b 5d41 5c41 5d41 5e41 5fc3  .H...[]A\A]A^A_.
0x00400645  9066 2e0f 1f84 0000 0000 00f3 0f1e fac3  .f..............
0x00400655  0000 00f3 0f1e fa48 83ec 0848 83c4 08c3  .......H...H....
0x00400665  0000 0001 0002 0000 0000 0000 0000 0000  ................
0x00400675  0000 004e 756d 6265 7220 6e6f 7720 6973  ...Number now is
0x00400685  2020 3a20 2564 0a00 0000 0001 1b03 3b44    : %d........;D
0x00400695  0000 0007 0000 0000 feff ff88 0000 0020  ............... 
[0x004005a5]> 

拆卸

如果您正在使用已编译的二进制文件,则没有可以查看的源代码。编译器将源代码翻译成CPU可以理解并执行的机器语言指令;结果是二进制文件或可执行文件。但是,您可以查看汇编指令(助记符)以了解程序正在执行的操作。例如,如果你想查看main函数在做什么,可以使用s main来查找main函数的地址,然后运行pdf命令来查看拆解说明。

要理解汇编指令,您需要参考架构手册(在本例中为 x86)、其应用程序二进制接口(其 ABI 或调用约定),并对堆栈的工作原理有一个基本的了解:

[0x004004b0]> s main
[0x004005a5]> 
[0x004005a5]> s
0x4005a5
[0x004005a5]> 
[0x004005a5]> pdf
            ; DATA XREF from entry0 @ 0x4004d1
┌ 55: int main (int argc, char **argv, char **envp);
│           ; var int64_t var_8h @ rbp-0x8
│           ; var int64_t var_4h @ rbp-0x4
│           0x004005a5      55             push rbp
│           0x004005a6      4889e5         mov rbp, rsp
│           0x004005a9      4883ec10       sub rsp, 0x10
│           0x004005ad      c745fc640000.  mov dword [var_4h], 0x64    ; 'd' ; 100
│           0x004005b4      8b45fc         mov eax, dword [var_4h]
│           0x004005b7      89c7           mov edi, eax
│           0x004005b9      e8d8ffffff     call sym.adder
│           0x004005be      8945f8         mov dword [var_8h], eax
│           0x004005c1      8b45f8         mov eax, dword [var_8h]
│           0x004005c4      89c6           mov esi, eax
│           0x004005c6      bf78064000     mov edi, str.Number_now_is__:__d ; 0x400678 ; "Number now is  : %d\n" ; const char *format
│           0x004005cb      b800000000     mov eax, 0
│           0x004005d0      e8cbfeffff     call sym.imp.printf         ; int printf(const char *format)
│           0x004005d5      b800000000     mov eax, 0
│           0x004005da      c9             leave
└           0x004005db      c3             ret
[0x004005a5]> 

这是加法器函数的反汇编:

[0x004005a5]> s sym.adder
[0x00400596]> 
[0x00400596]> s
0x400596
[0x00400596]> 
[0x00400596]> pdf
            ; CALL XREF from main @ 0x4005b9
┌ 15: sym.adder (int64_t arg1);
│           ; var int64_t var_4h @ rbp-0x4
│           ; arg int64_t arg1 @ rdi
│           0x00400596      55             push rbp
│           0x00400597      4889e5         mov rbp, rsp
│           0x0040059a      897dfc         mov dword [var_4h], edi     ; arg1
│           0x0040059d      8b45fc         mov eax, dword [var_4h]
│           0x004005a0      83c001         add eax, 1
│           0x004005a3      5d             pop rbp
└           0x004005a4      c3             ret
[0x00400596]>

弦乐

查看二进制文件中存在哪些字符串可以作为二进制分析的起点。字符串被硬编码为二进制文件,通常会提供重要的提示来转移您的注意力以分析某些区域。在二进制文件中运行 iz 命令以列出所有字符串。测试二进制文件中只有一个硬编码的字符串:

[0x004004b0]> iz
[Strings]
nth paddr      vaddr      len size section type  string
―――――――――――――――――――――――――――――――――――――――――――――――――――――――
0   0x00000678 0x00400678 20  21   .rodata ascii Number now is  : %d\n

[0x004004b0]> 

交叉引用字符串

与函数一样,您可以交叉引用字符串以查看它们的打印位置并了解它们周围的代码:

[0x004004b0]> ps @ 0x400678
Number now is  : %d

[0x004004b0]> 
[0x004004b0]> axt 0x400678
main 0x4005c6 [DATA] mov edi, str.Number_now_is__:__d
[0x004004b0]> 

视觉模式

当您的代码很复杂且调用了多个函数时,很容易迷失方向。获得关于调用哪些函数、根据特定条件采用哪些路径等的图形或视觉视图会很有帮助。您可以在移动到 a 后使用 VV 命令探索 r2 的视觉模式。兴趣函数。例如,对于加法器函数:

[0x004004b0]> s sym.adder
[0x00400596]> 
[0x00400596]> VV

(高拉夫·卡马特,CC BY-SA 4.0)

调试器

到目前为止,您一直在进行静态分析 - 您只是查看二进制文件中的内容而不运行它。有时您需要在运行时执行二进制文件并分析内存中的各种信息。 r2 的内部调试器允许您运行二进制文件、设置断点、分析变量值或转储寄存器内容。

使用 -d 标志启动调试器,并添加 -A 标志以在二进制加载时进行分析。您可以使用 db 命令在不同位置设置断点,例如函数或内存地址。要查看现有断点,请使用 dbi 命令。设置断点后,使用 dc 命令开始运行二进制文件。您可以使用 dbt 命令查看堆栈,该命令显示函数调用。最后,您可以使用 drr 命令转储寄存器的内容:

$ r2 -d -A ./adder
Process with PID 17453 started...
= attach 17453 17453
bin.baddr 0x00400000
Using 0x400000
asm.bits 64
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Check for vtables
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information
[x] Use -AA or aaaa to perform additional experimental analysis.
 -- git checkout hamster
[0x7f77b0a28030]> 
[0x7f77b0a28030]> db main
[0x7f77b0a28030]> 
[0x7f77b0a28030]> db sym.adder
[0x7f77b0a28030]> 
[0x7f77b0a28030]> dbi
0 0x004005a5 E:1 T:0
1 0x00400596 E:1 T:0
[0x7f77b0a28030]> 
[0x7f77b0a28030]> afl | grep main
0x004005a5    1 55           main
[0x7f77b0a28030]> 
[0x7f77b0a28030]> afl | grep sym.adder
0x00400596    1 15           sym.adder
[0x7f77b0a28030]> 
[0x7f77b0a28030]> dc
hit breakpoint at: 0x4005a5
[0x004005a5]> 
[0x004005a5]> dbt
0  0x4005a5           sp: 0x0                 0    [main]  main sym.adder+15
1  0x7f77b0687873     sp: 0x7ffe35ff6858      0    [??]  section..gnu.build.attributes-1345820597 
2  0x7f77b0a36e0a     sp: 0x7ffe35ff68e8      144  [??]  map.usr_lib64_ld_2.28.so.r_x+65034 
[0x004005a5]> dc
hit breakpoint at: 0x400596
[0x00400596]> dbt
0  0x400596           sp: 0x0                 0    [sym.adder]  rip entry.init0+6
1  0x4005be           sp: 0x7ffe35ff6838      0    [main]  main+25 
2  0x7f77b0687873     sp: 0x7ffe35ff6858      32   [??]  section..gnu.build.attributes-1345820597 
3  0x7f77b0a36e0a     sp: 0x7ffe35ff68e8      144  [??]  map.usr_lib64_ld_2.28.so.r_x+65034 
[0x00400596]> 
[0x00400596]> 
[0x00400596]> dr
rax = 0x00000064
rbx = 0x00000000
rcx = 0x7f77b0a21738
rdx = 0x7ffe35ff6948
r8 = 0x7f77b0a22da0
r9 = 0x7f77b0a22da0
r10 = 0x0000000f
r11 = 0x00000002
r12 = 0x004004b0
r13 = 0x7ffe35ff6930
r14 = 0x00000000
r15 = 0x00000000
rsi = 0x7ffe35ff6938
rdi = 0x00000064
rsp = 0x7ffe35ff6838
rbp = 0x7ffe35ff6850
rip = 0x00400596
rflags = 0x00000202
orax = 0xffffffffffffffff
[0x00400596]> 

反编译器

能够理解汇编是二进制分析的先决条件。汇编语言始终与二进制文件构建和运行的体系结构紧密相关。一行源代码和汇编代码之间从来不存在 1:1 的映射。通常,一行 C 源代码会生成多行汇编代码。因此,逐行读取汇编代码并不是最佳选择。

这就是反编译器发挥作用的地方。它们尝试根据汇编指令重建可能的源代码。这与用于创建二进制文件的源代码绝不完全相同;它是基于汇编的源代码的近似表示。另外,要考虑到生成不同汇编代码以加快速度、减小二进制文件大小等的编译器优化将使反编译器的工作更加困难。此外,恶意软件作者经常故意混淆代码以阻止恶意软件分析师的研究。

Radare2 通过插件提供反编译器。您可以安装 Radare2 支持的任何反编译器。使用 r2pm -l 命令查看当前插件。使用 r2pm install 命令安装示例 r2dec 反编译器:

$ r2pm  -l
$ 
$ r2pm install r2dec
Cloning into 'r2dec'...
remote: Enumerating objects: 100, done.
remote: Counting objects: 100% (100/100), done.
remote: Compressing objects: 100% (97/97), done.
remote: Total 100 (delta 18), reused 27 (delta 1), pack-reused 0
Receiving objects: 100% (100/100), 1.01 MiB | 1.31 MiB/s, done.
Resolving deltas: 100% (18/18), done.
Install Done For r2dec
gmake: Entering directory '/root/.local/share/radare2/r2pm/git/r2dec/p'
[CC] duktape/duktape.o
[CC] duktape/duk_console.o
[CC] core_pdd.o
[CC] core_pdd.so
gmake: Leaving directory '/root/.local/share/radare2/r2pm/git/r2dec/p'
$ 
$ r2pm  -l
r2dec
$ 

反编译视图

要反编译二进制文件,请将二进制文件加载到 r2 中并自动分析它。使用 s sym.adder 命令移至感兴趣的函数(本例中为 adder),然后使用 pdda 命令并行查看程序集和反编译的源代码-边。阅读这个反编译的源代码通常比逐行阅读汇编更容易:

$ r2 -A ./adder
[x] Analyze all flags starting with sym. and entry0 (aa)
[x] Analyze function calls (aac)
[x] Analyze len bytes of instructions for references (aar)
[x] Check for vtables
[x] Type matching analysis for all functions (aaft)
[x] Propagate noreturn information
[x] Use -AA or aaaa to perform additional experimental analysis.
 -- What do you want to debug today?
[0x004004b0]> 
[0x004004b0]> s sym.adder
[0x00400596]> 
[0x00400596]> s
0x400596
[0x00400596]> 
[0x00400596]> pdda
    ; assembly                               | /* r2dec pseudo code output */
                                             | /* ./adder @ 0x400596 */
                                             | #include <stdint.h>
                                             |  
    ; (fcn) sym.adder ()                     | int32_t adder (int64_t arg1) {
                                             |     int64_t var_4h;
                                             |     rdi = arg1;
    0x00400596 push rbp                      |     
    0x00400597 mov rbp, rsp                  |     
    0x0040059a mov dword [rbp - 4], edi      |     *((rbp - 4)) = edi;
    0x0040059d mov eax, dword [rbp - 4]      |     eax = *((rbp - 4));
    0x004005a0 add eax, 1                    |     eax++;
    0x004005a3 pop rbp                       |     
    0x004005a4 ret                           |     return eax;
                                             | }
[0x00400596]> 

配置设置

随着您对 Radare2 越来越熟悉,您将需要更改其配置以使其适合您的工作方式。您可以使用e命令查看r2的默认配置。要设置特定配置,请在 e 命令后添加 config=value:

[0x004005a5]> e | wc -l
593
[0x004005a5]> e | grep syntax
asm.syntax = intel
[0x004005a5]> 
[0x004005a5]> e asm.syntax = att
[0x004005a5]> 
[0x004005a5]> e | grep syntax
asm.syntax = att
[0x004005a5]> 

要使配置更改永久生效,请将它们放入 r2 在启动时读取的名为 .radare2rc 的启动文件中。该文件通常位于您的主目录中;如果没有,您可以创建一个。一些示例配置选项包括:

$ cat ~/.radare2rc 
e asm.syntax = att
e scr.utf8 = true
eco solarized
e cmd.stack = true
e stack.size = 256
$

探索更多

您已经了解了足够多的 Radare2 功能,可以找到使用该工具的方法。因为 Radare2 遵循 Unix 哲学,所以尽管您可以从其控制台执行各种操作,但它在下面使用一组单独的二进制文件来完成其任务。

探索下面列出的独立二进制文件以了解它们的工作原理。例如,使用 iI 命令在控制台中看到的二进制信息也可以使用 rabin2 命令找到:

$ cd bin/
$ 
$ ls
prefix  r2agent    r2pm  rabin2   radiff2  ragg2    rarun2   rasm2
r2      r2-indent  r2r   radare2  rafind2  rahash2  rasign2  rax2
$ 

您对 Radare2 感觉如何?在评论中分享您的反馈。

©2015-2025 艾丽卡 support@alaica.com