这里就拿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
配一张成功断下的图吧,还是有点小激动(
这样一来,就配置好了整个题目需要的调试环境。不过并不是所有的题目都会给环境,所以必要的时候肯定还是需要自己编译一下内核。
One thought on “kernel pwn入门(1) 简易环境搭建”