变量

Radare2允许对本地变量进行管理,无论他们位于何处,是在栈上或寄存器中。对于变量的自动分析是默认开启的,不过你也可以通过anal.vars配置选项禁用自动分析。

与变量相关的命令主要在afv命名空间下:

Usage: afv  [rbs]
| afv*                          output r2 command to add args/locals to flagspace
| afv-([name])                  remove all or given var
| afv=                          list function variables and arguments with disasm refs
| afva                          analyze function arguments/locals
| afvb[?]                       manipulate bp based arguments/locals
| afvd name                     output r2 command for displaying the value of args/locals in the debugger
| afvf                          show BP relative stackframe variables
| afvn [new_name] ([old_name])  rename argument/local
| afvr[?]                       manipulate register based arguments
| afvR [varname]                list addresses where vars are accessed (READ)
| afvs[?]                       manipulate sp based arguments/locals
| afvt [name] [new_type]        change type for given argument/local
| afvW [varname]                list addresses where vars are accessed (WRITE)
| afvx                          show function variable xrefs (same as afvR+afvW)

afvrafvbafvs命令是相同的命令,他们分别允许对基于寄存器的参数和变量,基于BP/FP的参数和变量,以及基于SP的参数和变量进行修改。afvr的帮助信息中显示的用法同样适用于另外两个命令:

|Usage: afvr [reg] [type] [name]
| afvr                        list register based arguments
| afvr*                       same as afvr but in r2 commands
| afvr [reg] [name] ([type])  define register arguments
| afvrj                       return list of register arguments in JSON format
| afvr- [name]                delete register arguments at the given index
| afvrg [reg] [addr]          define argument get reference
| afvrs [reg] [addr]          define argument set reference

与其他许多功能一样,radare2会自动完成变量分析,但可以用这些控制参数/变量的命令改变这些结果。变量的分析严重依赖于加载的函数原型以及其调用约定,因此加载程序中的符号可以改善分析结果。此外,在对一些东西进行修改后,我们可以用afva重新执行变量分析,变量分析常借助类型分析的信息进行,详情参见afta命令。

逆向工程中最终要的莫过于赋名,你同样可以对这些变量进行重命名,变量在所有引用处都会被重命名。可以使用afvn任何 类型的参数和变量完成这个操作。你也可以用afv-移除指定的变量和参数。

如前面所提到的那样,变量分析阶段高度依赖于类型信息,因此下一个介绍的重要命令是-afvt,使用它可以改变变量的类型。

接下来是不太常用的功能,其也仍处于开发阶段 - 区分读取与写入的变量。可以通过afvR列出变量在哪些位置被读取,afvR在哪些位置被写入。这两个命令都列出了读写操作发生的地址。

类型推断

局部变量和参数的类型推断很好地整合在afta命令中。让我们以hello_world 这个二进制文件作为例子进行讲解。

  • 使用 afta

它同时也从类似printf ("fmt : %s , %u , %d", ...)的格式化字符串中提取类型信息,格式的规范是从anal/d/spec.sdb中获得的。

您也可以根据不同的库/操作系统/编程语言,创建一个用于指定一组格式字符的新配置文件,如下所示:

Then change your default specification to newly created one using this config variable e anal.spec = win

For more information about primitive and user-defined types support in radare2 refer to types chapter.

最后更新于

这有帮助吗?