4

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

 2 years ago
source link: https://binlep.github.io/2020/03/12/%E3%80%90Pwn%20%E7%AC%94%E8%AE%B0%E3%80%91Linux%20Kernel%20%E8%B0%83%E8%AF%95%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

内核调试命令

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

获取 ROP 地址

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

ROPgadget

使用方法:

ROPgadget --binary ./vmlinux > _gadget.txt

ropper

使用方法:

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

获取函数地址

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 以后的版本,所以按需搭配自己喜欢的环境就好

架构一览:

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 架构,输入命令如下:

set architecture i386:x86-64

命令如下:

target remote localhost:1234

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

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

extract-vmlinux bzImage > vmlinux

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

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

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

gdb-multiarch ./vmlinux -ex "set architecture i386:x86-64" -ex "add-symbol-file ./baby.ko 0xffffffffc0000000" -ex "target remote localhost:2222"

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK