前言
对于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是我填入的内容
fuckrdx是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是我填入的内容
0xdeadrdx是
0xbeefrcx是这个tty_struct里tty_operations的地址

这里rdi和rcx也能利用一下用作栈迁移

参考
Kernel pwn CTF 入门 | Kiprey’s Blog
教你学内核-tty,seq结构体利用 | -NIYAH-
攻防世界 x Nepnep x CATCTF 2022 Nepnep战队官方WP (wolai.com)






![[Linux_]make/Makefile](https://img-blog.csdnimg.cn/26782a673c9946289f713d4861191e26.png)












