在文本部分中查找字符串

Yoa*_*oav 4 c gcc

我有以下代码作为示例:

Foo( "Test1" );

void Foo(const char* const i_Test )
{
     // Some logic
}
Run Code Online (Sandbox Code Playgroud)

中的i_Test指针Foo()持有指向中的字符串的指针.rodata section

有什么方法可以i_Text在二进制文件中搜索指针值以找到相关的String?还是我可以使用gcc保留该信息的任何调试信息?

Ish*_*led 8

实际上,常量字符串不是保存在 .text 部分中,而是保存在 .rodata 部分中。

为了查看所有常量字符串,您可以运行:

readelf -S ./[your binary file]

请注意上面输出中 .rodata 部分的部分编号

readelf -p [.rodata section number you got before] ./[your binary name]

这个命令的作用是打印一个部分内的所有字符串,因为这些字符串是常量数据,你将获得文件中的所有字符串。您还可以通过计算 .rodata 部分地址和其中的偏移量来更改这些字符串,但我发现打开十六进制编辑器、查找字符串并对其进行操作要容易得多(假设我没有更改为更长的字符串)

编辑

您可以readelf -p .rodata直接使用而不是提供节号


小智 5

如果您正在谈论ELF文件格式,则常量字符串存储在.rodata (只读数据)部分中。基本上,只有程序的指令(代码)才会存储在该二进制文件的.text节中。您可以通过使用对象转储程序(例如objdump)来研究这些部分,如下所示:

objdump -drS program.o           // to see .text section of your program

objdump -s -j .rodata program.o  // to see .rodata section of your program
Run Code Online (Sandbox Code Playgroud)

在上面的示例代码中,编译器会将"Test1"传递给Foo函数的字符串视为常量字符串。因此,您可以在加载阶段之前找到其相对内存地址,并且指针将指向此常量字符串。但是,如果您已将代码编译为与位置无关的代码(通过使用gcc中的 option ),则可能还会发现编译器将向该只读.rodata部分添加可写属性。此外,您还可以使用readelf二进制实用程序来显示有关ELF格式的目标文件各节的详细信息。i_Test-fPIC

有关ELF文件格式的更多信息,请参见此处。