【Pwn 笔记】Linux Kernel 调试命令总结

接着上期的 Linux Kernel 调试文件总结

内核调试命令

查看保护

1
2
cat /proc/cpuinfo  # 查看所开保护
cat /proc/slabinfo # 查看内核堆块

获取 ROP 地址

这块有时 ROPgadget 快,有时 ropper 快,随缘吧

ROPgadget

使用方法:

1
ROPgadget --binary ./vmlinux > _gadget.txt

ropper

使用方法:

1
ropper --no-color -f ./vmlinux > gadget.txt

获取函数地址

1
2
3
lsmod  # 查看装载驱动,也是获得内核文件加载的基地址
grep prepare_kernel_cred /proc/kallsyms
grep commit_creds /proc/kallsyms

此处若是开了地址随机化,需要先改启动脚本,使 kaslr 变成 nokaslr,然后获取一个栈地址,将其记录

之后再把 nokaslr 改回 kaslr,运行脚本获得之前所记录地址处对应的新地址,做差,记录这个差值为 stackbase

之后把获得的所有的内核地址都加上这个 stackbase,即差值,才能获得在开启 kaslr 下的真实地址

gdb-multiarch 调试命令

一般来说用 gdb 就可以,跨平台的话就要用 gdb-multiarch

设置架构

在 startvm.sh 脚本上设置好端口后就可以用 gdb-multiarch 来调试了

首先要根据使用的 qemu 来设置系统架构,设置命令为set architecture 内核系统架构

架构有很多,我用的是 qemu 3.0.0,是在 Ubuntu 16.04 下自行编译安装的,因为默认版本很老

不过 Ubuntu 18.04 之后的 qemu 都是 3.0.0 以后的版本,所以按需搭配自己喜欢的环境就好

架构一览:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
aarch64                        mips:4400
aarch64:ilp32 mips:4600
alpha mips:4650
alpha:ev4 mips:5000
alpha:ev5 mips:5400
alpha:ev6 mips:5500
arm mips:5900
armv2 mips:6000
armv2a mips:7000
armv3 mips:8000
armv3m mips:9000
armv4 mips:isa32
armv4t mips:isa32r2
armv5 mips:isa32r3
armv5t mips:isa32r5
armv5te mips:isa32r6
auto mips:isa64
ep9312 mips:isa64r2
hppa1.0 mips:isa64r3
i386 mips:isa64r5
i386:intel mips:isa64r6
i386:nacl mips:loongson_2e
i386:x64-32 mips:loongson_2f
i386:x64-32:intel mips:loongson_3a
i386:x64-32:nacl mips:micromips
i386:x86-64 mips:mips5
i386:x86-64:intel mips:octeon
i386:x86-64:nacl mips:octeon+
i8086 mips:octeon2
ia64-elf32 mips:octeon3
ia64-elf64 mips:sb1
iwmmxt mips:xlr
iwmmxt2 powerpc:403
m32r powerpc:601
m32r2 powerpc:603
m32rx powerpc:604
m68k powerpc:620
m68k:5200 powerpc:630
m68k:5206e powerpc:7400
m68k:521x powerpc:750
m68k:5249 powerpc:EC603e
m68k:528x powerpc:MPC8XX
m68k:5307 powerpc:a35
m68k:5407 powerpc:common
m68k:547x powerpc:common64
m68k:548x powerpc:e500
m68k:68000 powerpc:e500mc
m68k:68008 powerpc:e500mc64
m68k:68010 powerpc:e5500
m68k:68020 powerpc:e6500
m68k:68030 powerpc:rs64ii
m68k:68040 powerpc:rs64iii
m68k:68060 powerpc:titan
m68k:cfv4e powerpc:vle
m68k:cpu32 rs6000:6000
m68k:fido rs6000:rs1
m68k:isa-a rs6000:rs2
m68k:isa-a:emac rs6000:rsc
m68k:isa-a:mac s390:31-bit
m68k:isa-a:nodiv s390:64-bit
m68k:isa-aplus sh
m68k:isa-aplus:emac sh-dsp
m68k:isa-aplus:mac sh2
m68k:isa-b sh2a
m68k:isa-b:emac sh2a-nofpu
m68k:isa-b:float sh2a-nofpu-or-sh3-nommu
m68k:isa-b:float:emac sh2a-nofpu-or-sh4-nommu-nofpu
m68k:isa-b:float:mac sh2a-or-sh3e
m68k:isa-b:mac sh2a-or-sh4
m68k:isa-b:nousp sh2e
m68k:isa-b:nousp:emac sh3
m68k:isa-b:nousp:mac sh3-dsp
m68k:isa-c sh3-nommu
m68k:isa-c:emac sh3e
m68k:isa-c:mac sh4
m68k:isa-c:nodiv sh4-nofpu
m68k:isa-c:nodiv:emac sh4-nommu-nofpu
m68k:isa-c:nodiv:mac sh4a
mips sh4a-nofpu
mips:10000 sh4al-dsp
mips:12000 sh5
mips:14000 sparc
mips:16 sparc:sparclet
mips:16000 sparc:sparclite
mips:3000 sparc:sparclite_le
mips:3900 sparc:v8plus
mips:4000 sparc:v8plusa
mips:4010 sparc:v8plusb
mips:4100 sparc:v9
mips:4111 sparc:v9a
mips:4120 sparc:v9b
mips:4300 xscale

假使 startvm.sh 上面所写的 qemu 种类是 qemu-system-x86_64

那么就用 i386:x86-64 架构,输入命令如下:

1
set architecture i386:x86-64

连接端口

命令如下:

1
target remote localhost:1234

读取内核文件符号表及内核加载基地址

先用 extract-vmlinux 命令提取 vmlinux 文件,命令如下:

1
extract-vmlinux bzImage > vmlinux

然后先用 root 用户登录,在里面输入 lsmod 获得模块加载的基地址:

1
2
/home/pwn # $ lsmod
baby 16384 1 - Live 0xffffffffc0000000 (POE)

之后启动的时候这么启动:

1
gdb-multiarch ./vmlinux -ex "set architecture i386:x86-64" -ex "add-symbol-file ./baby.ko 0xffffffffc0000000" -ex "target remote localhost:2222"
文章目录
  1. 1. 内核调试命令
    1. 1.1. 查看保护
    2. 1.2. 获取 ROP 地址
      1. 1.2.1. ROPgadget
      2. 1.2.2. ropper
    3. 1.3. 获取函数地址
  2. 2. gdb-multiarch 调试命令
    1. 2.1. 设置架构
    2. 2.2. 连接端口
    3. 2.3. 读取内核文件符号表及内核加载基地址
|