kernel pwn入门(1) 简易环境搭建

这里就拿2017年国赛的babydriver一题,记录一下简单的环境搭建。

题目是给出了环境的,可以直接拿qemu启动。

qemu-system-x86_64 -initrd ramdisk.cpio.gz -kernel bzImage -append 'console=ttyS0 root=/dev/ram oops=panic panic=1' -enable-kvm --nographic  -monitor /dev/null -m 64M -smp cores=1,threads=1 -cpu kvm64,+smep

当然,为了调试,我们人为加上两条

-gdb tcp::1234 -S

这时候运行脚本,qemu就停在了加载系统之前,拿gdb链接就可以了。

不过正常来说这时候还是不行的,在运行过程中有可能会出现Remote ‘g’ packet reply is too long这个错误,在网上找了很久,大部分都是说要重新编译一份gdb,但是最后我找到了这里。按照这个方法我发现可以正常的断下,于是我修改了一下启动gdb的脚本:

gdb            -ex "target remote localhost:1234"       \
               -ex "continue"                           \
               -ex "disconnect"                         \
               -ex "set architecture i386:x86-64:intel" \
               -ex "target remote localhost:1234"       \
               -ex "add-symbol-file Desktop/babydriver/babydriver.ko 0xffffffffc0000000" \
               -ex "b *0xffffffffc0000130"

简单来说解决这个问题的办法就是先连上去,之后断开链接设置一下架构,最后重连上去就行了。设置text段的操作参考了muhe师傅的入门文章。

还有一个麻烦的地方就是文件传输,如何把编译好的poc放进qemu里面测试呢。

因为题目给了整个文件系统,所以我们可以自己来打包一份。打包的方法用的就是比较常见的打包方法。

于是自己写了个脚本来自动化打包。

#!/bin/sh

gcc -static poc.c -o poc
cp ./poc rootfs/home/ctf
./gen_initramfs_list.sh rootfs/ > filelist
./gen_init filelist > rootfs.cpio
gzip rootfs.cpio

配一张成功断下的图吧,还是有点小激动(

这样一来,就配置好了整个题目需要的调试环境。不过并不是所有的题目都会给环境,所以必要的时候肯定还是需要自己编译一下内核。

发表评论

电子邮件地址不会被公开。 必填项已用*标注