前言
对于Linux的二进制程序,gdb调试是十分重要的,可以清楚的了解程序是如何运行的,这里单独拉一篇记录我在kernel pwn中遇到的一些调试
GDB选择
在三大件pwndbg,gef,peda
中,用了一圈下来感觉gef和pwndbg都挺好
gdb安装
简单写一下gdb的安装吧
因为用的python模块,环境依赖要装个python3吧,起码3.6+,省去很多麻烦
先到root
sudo su
三个都克隆下来
cd ~
git clone https://github.com/pwndbg/pwndbg.git
git clone https://github.com/longld/peda.git
git clone https://github.com/hugsy/gef.git
配置一下环境变量
echo source ~/pwndbg/gdbinit.py >> ~/.gdbinit
echo source ~/peda/peda.py >> ~/.gdbinit
echo source ~/gef/gef.py >> ~/.gdbinit
然后我们vim编辑一下,要用哪个把其他的给注释掉就好
vim ~/.gdbinit
当然普通用户也可以按如上操作安装gdb
只是因为我们后续要在root下来用gdb vmlinux
,不然可能会出现权限问题
vmlinux-to-elf
可以解压出带符号的vmlinux,简直神器,我的评价是比extract-vmlinux好用
安装
直接用vmlinux-to-elf官方的方法
有时候会无法连接,隔一会试一下就好
sudo apt install python3-pip
sudo pip3 install --upgrade lz4 zstandard git+https://github.com/clubby789/python-lzo@b4e39df
sudo pip3 install --upgrade git+https://github.com/marin-m/vmlinux-to-elf
使用
安装好了直接用
./vmlinux-to-elf <input_kernel.bin> <output_kernel.elf>
例:
vmlinux-to-elf bzImage vmlinux
如何调试
qemu要设置参数-s -S或-gdb tcp::1234 -S选项用于启动gdb服务
此外还要设置-append还要设置nokalsr,不然gdb也是确定不了符号的
接着我们启动qemu
然后在root下启动刚提取出来的gdb vmlinux
接着可以set architecture i386:x86-64
,当然不设置也没关系
然后用的target remote localhost:1234
连上即可,可以看到有符号了
某些trick
tty->write
当我们在调用tty的write时,例:write(tty_fd, page, 233);
我们可以断点下在b*pty_write
,然后c
,接着去运行我们的exploit程序
pwndbg可以直观的看到
rdi是这个tty_stcuct的地址
rsi是我填入的内容
fuck
rdx是233(0xe9)
这里rdi可以配合一些push_rdi;pop_rsp
之类的gadget完成栈迁移
tty->ioctl
当我们在调用tty的ioctl时,例:ioctl(tty_fd[i], 0xdead, 0xbeef);
我们可以断点下在b*pty_write
,然后c
,接着去运行我们的exploit程序
rdi是这个tty_stcuct的地址
rsi是我填入的内容
0xdead
rdx是
0xbeef
rcx是这个tty_struct里tty_operations的地址
这里rdi和rcx也能利用一下用作栈迁移
参考
Kernel pwn CTF 入门 | Kiprey’s Blog
教你学内核-tty,seq结构体利用 | -NIYAH-
攻防世界 x Nepnep x CATCTF 2022 Nepnep战队官方WP (wolai.com)