这里要感谢下Xpoint的大佬,超级感谢!大佬的博客:http://matshao.com/archives/
前言
主要就是今年强网杯的一题Mipsgame
,程序开了PIE,直接用qemu-mips64
起的话,程序没有pie,栈也不是随机的,gdb调试的时候还不能crtl+c
,体验及其的不好,赛后Xpoint的大佬一步步的教了我怎么搭环境,搭完环境之后调试起来mips64的程序,感觉舒服多了,效果:
原来:
现在:
支持crtl+c
,vmmap
也能看到程序的地址,而且每次启动都是地址都是随机的,体验不止上升了一点点,在配合tmux,体验极佳
安装
这里要用到的是buildroot这个神器,真的和它官网首页说的那样:Making Embedded Linux Easy,在官网的download页面下载压缩包下来,解压就行
接着就是切到buildroot的目录下,想好你要编译的架构,这里我们是
mips64
,然后make qemu_mips64_malta_defconfig
,怎么知道make后面的参数呢,可以ls configs
下:我们可以看到第四列和第五列是qemu开头的,用这些
config
可以生成qemu用的vmlinux还有rootfs,很是方便接着就是
make menuconfig
,编译过内核的应该对这个挺熟悉的,在menuconfig里,我们可以选择要安装package
,这里就是最舒服的地方了,这里我们就选ncat,还有gdb,因为我们只是为了调试而已,当然你要玩的话,也可以安装gcc,g++,git之类的,这是我当时的选项:
下面还有一个strace也可以勾上,ncat在networking applications
里:
如果你没看见这些包,可以用搜索功能,里面会有这个包的依赖,把依赖勾上,就会出现,Target packages->Show packages that are also provided by busybox
这个也勾上,这里是我当时toolchain的选项:
这些都搞好了之后,save下退出
现在可以执行make了,大概几十分钟之后,buildroot会帮你准备好一切,你可以在output下的images目录看到输出:
1
2ruan@ubuntu ~/buildroot-2020.05.1/output/images ls
rootfs.ext2 start-qemu.sh vmlinux./start-qemu.sh
可以直接启动qemu-system
,但是为了我们能调试,我们得加个端口转发:1
2
3
4
5
6
7
8
9
10
11
12ruan@ubuntu ~/buildroot-2020.05.1/output/images cat start-qemu.sh
IMAGE_DIR="${0%/*}/"
if [ "${1}" = "serial-only" ]; then
EXTRA_ARGS='-nographic'
else
EXTRA_ARGS='-serial stdio'
fi
export PATH="/home/ruan/buildroot-2020.05.1/output/host/bin:${PATH}"
exec qemu-system-mips64 -M malta -m 1024 -kernel ${IMAGE_DIR}/vmlinux -drive file=${IMAGE_DIR}/rootfs.ext2,format=raw -append "rootwait root=/dev/hda" ${EXTRA_ARGS} -nic user,hostfwd=tcp::3333-:3333,hostfwd=tcp::5555-:5555其实就是在后面加了
-nic user,hostfwd=tcp::3333-:3333,hostfwd=tcp::5555-:5555
,也是大佬教的./start-qemu.sh
启动内核,输入root登入进去,然后执行ncat -vc "gdbserver 0.0.0.0:5555 ./httpd" -kl 0.0.0.0 3333
,这时候我们在qemu外面用nc连3333端口,这时候qemu里面就会执行gdbserver 0.0.0.0:5555 ./httpd
,我们外面在用gdb-multiarch
去连这个5555端口:
现在可以在gdb里下断点了:
往3333端口发数据,gdb里就会断在相应的函数里,意思就是我们可以用pwntools里的io模块来连3333端口,然后就像正常的那样收发数据就行
坑
我们不仅要把程序httpd
拷贝进去,还要把题目给的ld
还有libc
也一起拷贝进去,修改lib下的符号连接,不然程序跑不起来:
拷贝程序的话,我们可以先挂载rootfs.ext2
,比如:sudo mount -t ext2 ./rootfs.ext2 /tmp/rootfs
,挂载到/tmp/rootfs
,然后把程序,libc,ld直接拷贝进去,最后umount
就行
后记
这个buildroot不仅可以搭建mips64的,其它的架构也是可以的,我觉得可以提前编译几个,做好准备,免得打比赛的时候还在搭环境,嘻嘻,这里在感谢下matshao大佬。