给定一个像这样的简单程序,如何找出foobarbaz的字符串定义在哪个部分?就像它们在.text部分或.rodata中一样,并检查以确保这些部分是rorw吗?

#1 楼

在下面的答案中,我将向您展示实现所需目标的几种方法。我将使用不同的方法来使用radre2。

首先,让我们创建一个字符串更长的程序:

$ cat helloworld.c 

#include <stdio.h>

void main (int argc, char * argv[] ) {
    char * arr[] = {"Hello", "World", "Byebye"};
    arr[0] = "F";
    printf( "%s\n", arr[0] );
}

$ gcc helloworld.c -o helloworld
在radare2中打开它:在数据部分中

使用iz命令,您可以在数据部分中列出字符串。对于每个字符串,您都可以看到它所属的部分:方法2:整个二进制文件中的字符串

~不同,命令iz将在整个二进制文件中搜索字符串。该命令将向您显示比izz更多的字符串,但它还会在其他部分中搜索字符串。每个字符串的名称。
如果您要搜索特定的字符串,则grep是您的朋友:

$ r2 helloworld


方法3:特定地址的部分

在这种方法中,您已经知道字符串的地址,并且想知道它属于哪个部分。让我们以“ Hello”为例。我们看到“ Hello”地址是iz。让我们使用0x000007b4(打印字符串)来验证它: 。现在我们确定这是“ Hello”的地址,我们可以使用ps显示当前的节名称: 0x07b4部分。就像我们之前所见。


显示节的属性

最后,您想检查这些部分的属性是只读还是读写。使用iS.,您可以列出所有部分,包括其属性: grep也可以用于读写部分:

[0x000005b0]> iz
000 0x000007b4 0x000007b4   5   6 (.rodata) ascii Hello
001 0x000007ba 0x000007ba   5   6 (.rodata) ascii World
002 0x000007c0 0x000007c0   6   7 (.rodata) ascii Byeby


如果要查看只读部分,请像这样使用grep .rodata