Radare2 中的“af”与“afr”

逆向工程 雷达2
2021-06-28 11:42:38

我试图了解Radare2analyze functionsanalyze functions recursivelyRadare2之间的区别。给出这样的代码片段:

#include <stdio.h>

void b() {
    printf("b is called\n");
}

void a() {
   printf("a is called\n");
   b();
}


int main() {
    a();
    return 0;
}

当我afr在 main 函数上运行时,它找到了以下函数:

0x0000066a    1 21           main
0x0000064d    1 29           sym.a
0x00000510    1 6            sym.imp.puts
0x0000063a    1 19           sym.b

但是,当我af在 main 函数上运行时,它再次找到相同的函数:

0x0000066a    1 21           main
0x0000064d    1 29           sym.a
0x00000510    1 6            sym.imp.puts
0x0000063a    1 19           sym.b

我没有改变它的默认值anal.calls设置为false

所以,我的问题是afr发现什么af不是?

我正在使用 Radare2 版本 5.1.1

1个回答

af并且afr是不同的。检查radare的代码库以深入理解 - https://github.com/radareorg/radare2/blob/8d678888a97d9aed4049d1a7467132c41ad6ffa7/libr/core/cmd_anal.c

在此处输入图片说明

在此处输入图片说明

现在,请考虑以下示例以了解它们的不同之处。

#include <stdio.h>

int one()
{
return 1;
}

int fact(int n) {
   if (n==0)
      return 1;
   else if (n==1)
      return one();
   else
      return n*fact(n-1);
}

int main(void) {
      return fact(5);
}

我只是使用了这个阶乘代码并稍微修改了它。以下是radare2输出。

$ radare2 a.out
 -- This page intentionally left blank.
[0x00401020]> afl
[0x00401020]> s main
[0x0040114e]> afl
[0x0040114e]> af main
[0x0040114e]> afl
0x0040114e    1 16           main
0x00401111    6 61           sym.fact
[0x0040114e]> afr main
[0x0040114e]> afl
0x0040114e    1 16           main
0x00401111    6 61           sym.fact
0x00401106    1 11           sym.one

注意使用递归分析时附加函数的检测。