foo
,bar
和baz
的字符串定义在哪个部分?就像它们在.text
部分或.rodata
中一样,并检查以确保这些部分是ro
或rw
吗?#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
。