最近,我使用 转储了我的内存字符串(只是因为我可以)sudo cat /dev/mem | strings
。在查看这个转储后,我注意到一些非常有趣的事情:
.symtab
.strtab
.shstrtab
.note.gnu.build-id
.rela.text
.rela.init.text
.rela.text.unlikely
.rela.exit.text
.rela__ksymtab
.rela__ksymtab_gpl
.rela__kcrctab
.rela__kcrctab_gpl
.rela.rodata
.rodata.str1.8
.rela__mcount_loc
.rodata.str1.1
.rela__bug_table
.rela.smp_locks
.modinfo
__ksymtab_strings
.rela__tracepoints_ptrs
__tracepoints_strings
__versions
.rela.data
.data.unlikely
.rela__verbose
.rela__jump_table
.rela_ftrace_events
.rela.ref.data
.rela__tracepoints
.rela.gnu.linkonce.t6
这些行似乎都以某种方式相关:它们在内存中都(非常)靠近,它们都有相似的.<name>
前缀,并且它们似乎都互相引用。
什么会导致这些字符串出现,为什么?
答案1
+1 @jos 上面所说的(“谷歌它”)。在这种特殊情况下,您应该删除“.rela_”和“_gpl”部分。你会发现这些是内核符号。 “rela”是“relocation”的缩写,与 ELF 文件格式有关。这些都是有趣的话题,我鼓励您进一步研究它们。
答案2
这些看起来非常像 Linux 内核中的节名称。以 .rela 为前缀的包含指定节的重定位信息,例如 .rela.text 是文本节(存储内核对象代码的地方)的重定位信息。
其他感兴趣的部分是:
- .modinfo - 内核模块信息
- .rela.__ksymtab - 内核符号表重定位表
- .rela.data - 内核数据部分重定位表
- rodata.str1.1 - 只读字符串数据部分
等等。
在 /dev/mem 上运行字符串只会在系统物理内存中找到有趣的字符串;因此,您设法在未压缩的 vmlinuz Linux 内核中找到一些字符串。