【问题标题】:linux kernel image strings extractionlinux内核图像字符串提取
【发布时间】:2021-10-08 11:16:30
【问题描述】:

我正在尝试从二进制 linux 内核映像中提取字符串 (这种特定现象发生在我尝试过的所有类型的图像中:bzImage、vmlinuz、vmlinux ......而不是特定的一个)

简单地运行 'strings' 会打印出许多带有前缀字符的字符串,例如: “4netlink:在进程 `%s' 中解析属性后剩余 %d 个字节。”

但是,查看内核源代码,当前字符串不应包含“4”前缀。 在使用一些 HEX 编辑器打开文件时,我看到该字符串实际上还包括: '\x00\x01' 然后只有 '\x34' ("4") 我的猜测是这是指向特殊部分的某种指针,或者类似的东西, 因为许多其他字符串包括“3”和其他数字(甚至字符)。

希望能提供有关此事的任何信息 谢谢!

【问题讨论】:

  • 4 来自 KERN_WARNING 前缀。 3 来自 KERN_ERR 前缀。等等。
  • 无论如何,strings 使用启发式查找字符串。您可能会发现其他数据连接在一起(\0 结尾的字符串在 C 中很常见,但内核经常修复分隔字符串(当协议规定长度时,\0 可能很重要)。所以使用strings 作为近似工具(和从不盲目)

标签: linux-kernel binary executable c-strings


【解决方案1】:

OP 看到的前缀是 KERN_ 前缀。这些是要添加到主要printk 格式说明符之前的特殊字符串文字,使用C 的相邻字符串文字的连接。例如:

    printk(KERN_ERR "Something has gone wrong!\n");

从内核版本 3.6 开始,这些 KERN_ 前缀宏在“include/linux/kern_levels.h”中定义,以 ASCII SOH 字符 "\001" 开头,后跟作为数字的 ASCII 数字的日志级别级别,或其他用于特殊含义的 ASCII 字符。在内核版本 5.1 中,KERN_DEFAULT 的字符串从 "\001" "d" 更改为 ""(空字符串)。在内核版本 4.9 中,KERN_CONT 的字符串从 ""(空字符串)更改为 "\001" "c"

从内核版本 2.6.37 到 3.5.x,KERN_ 前缀宏在“include/linux/printk.h”中定义,并使用尖括号之间指定级别的不同格式,例如@987654330 @被定义为"<4>"KERN_DEFAULT被定义为"<d>"KERN_CONT被定义为"<c>"

除了printk,还有其他用于生成内核日志的宏,其中一些隐式指定了 KERN_ 部分。来自“lib/nlattr.c”的OP示例:

        pr_warn_ratelimited("netlink: %d bytes leftover after parsing attributes in process `%s'.\n",
                    rem, current->comm);

这里,pr_warn_ratelimited 宏在“include/linux/printk.h”中定义为:

#define pr_warn_ratelimited(fmt, ...)                   \
    printk_ratelimited(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)

那里发生了很多事情,但pr_fmt(fmt) 是一个或多个字符串文字,包括fmt 宏参数,所以传递给printk_ratelimited 的字符串是由一些连接字符串文字构成的KERN_WARNING.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2013-02-03
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多