简介
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内核镜像分析
- 工具准备
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
文件转换
/usr/src/kernels/$(uname -r)/scripts/extract-vmlinux vmlinuz-$(uname -r) > vmlinux
- ELF 文件解析
Linux 下 常用的 ELF 文件解析工具是 readelf
和objdump
,以下记录一些常用的例子:
(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
Comments | NOTHING