Linux 内核 | 内核镜像分析方法


简介

Linux内核编译完成后生成的通常是被压缩过的内核文件,例如在 Centos 和Ubuntu的 /boot目录下就保存了 vmlinuz 文件。vmlinuz是可引导的、压缩的内核,“vm”代表“Virtual Memory”。

# ls -l /boot
-rwxr-xr-x  1 root root  6765160 Aug 26  2020 vmlinuz-3.10.0-1127.19.1.el7.x86_64
-rwxr-xr-x  1 root root  6769256 Feb  3 23:10 vmlinuz-3.10.0-1160.15.2.el7.x86_64

vmlinuz由ELF文件vmlinux 经过OBJCOPY,并压缩后的文件。Linux下大量工具都是对 ELF 文件进行解析,因此,若我们想要逆向对 Linux 内核镜像进行二进制的分析,就需要先将 vmlinuz 文件还原成 vmlinux 文件。

Linux内核镜像分析

  1. 工具准备

Linux内核提供了脚本来实现vmlinuz 到 vmlinux 的转换——下载地址 extract-vmlinux。但在 Centos 和 Ubuntu 下可以通过包管理器直接安装,如下。

# in centos
yum install kernel-devel
# in ubuntu 
apt-get install linux-headers-$(uname -r)

安装完成后,extract-linux脚本将保存在

  • Centos: /usr/src/kernels/$(uname -r)/scripts/extract-vmlinux
  • Ubuntu: /usr/src/linux-headers-$(uname -r)/scripts/extract-vmlinux
  1. 文件转换
/usr/src/kernels/$(uname -r)/scripts/extract-vmlinux vmlinuz-$(uname -r) > vmlinux
  1. ELF 文件解析

Linux 下 常用的 ELF 文件解析工具是 readelfobjdump,以下记录一些常用的例子:

(1) readelf 查看 ELF 文件的信息:

- -S --section-headers 查看段头
- -h --file-header 查看文件头
- -r --relocs 查看重定位相关信息
- -x --hex-dump 查看16进制

(2) objdump读取 ELF文件中的内容

- -d 查看反编译结果
- -j 指定查看的段
- -r 查看重定位相关信息
- 例子: `objdump -d -j .text hello.o`

符号名

通过 objdump 命令则可反汇编 vmlinux 文件。

    objdump -D vmlinux | less

但该文件中没有保存符号名(例如函数名),这样分析不太方便。符号名相关的内容保存在/boot/System.map文件中。例如查找函数tcp_v4_do_rcv的地址,可执行以下命令获取到函数tcp_v4_do_rcv的地址为ffffffff816c62e0,再结合反汇编结果进行分析。

grep "tcp_v4_do_rcv" /boot/System.map-3.10.0-1160.15.2.el7.x86_64 

ffffffff816c62e0 T tcp_v4_do_rcv

参考链接

  1. # Extracting the Linux kernel image (vmlinuz)

声明:一丁点儿|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - Linux 内核 | 内核镜像分析方法


勿在浮沙筑高台,每天进步一丁点儿!