该环境搭建步骤也适用于其他架构的rop练习环境搭建。
构建Linux内核为3.2.0,debian wheezy的ARMel
下载debain的wheezy文件系统、引导、操作系统内核。
1 | https://people.debian.org/~aurel32/qemu/armel/debian_wheezy_armel_standard.qcow2 |
使用如下的命令启动:网络配置是使用的NAT网络,在虚拟机中就可以连接到外网;除此之外,还对外映射了端口,将qemu虚拟机的6666、8888、22端口分别映射到宿主机的6666、8888、22端口。通过端口映射的方式就解决了qemu虚拟机连接外网和宿主机通信的问题,宿主机可以通过ssh root@127.0.0.1 -p 2222
连接到qemu虚拟机中,在虚拟机中可以通过socat将题目映射出来,可以通过gdbserver将调试接口映射出来。
1 | sudo qemu-system-arm \ |
虚拟机的账号密码是root:root
。
环境搭建
该虚拟机默认的源现在已经不可用,经过我的搜寻,最终找到了一个阿里云的debian7(wheezy)目前还可用,可以用来更新、下载一些必要的软件。
1 | deb http://mirrors.aliyun.com/debian-archive/debian/ wheezy main non-free contrib |
在虚拟机里面安装一些必要的软件:
1 | apt-get update |
将armrop的题目通过scp(随意各种方式)传送到qemu虚拟机中,我设置的如下:
1 | root@debian-armel:~/armv5# tree -L 1 |
例如我现在要做ret2win_armv5这道题目,那么就先进入题目目录,使用socat将题目设置到8888端口,如果要调试的话,就使用gdbserver attach到进程,并将调试端口设置到6666。如果终端不够用的话,就ssh到qemu虚拟机中新开终端。
- 在qemu虚拟机中使用socat转发题目的io到8888端口:
1
socat tcp-l:8888,fork exec:./ret2win_armv5
- 在宿主机使用nc获取题目:
1
2
3
4
5
6
7
8
9$ nc 127.0.0.1 8888
ret2win by ROP Emporium
ARMv5
For my first trick, I will attempt to fit 56 bytes of user input into 32 bytes of stack buffer!
What could possibly go wrong?
You there, may I have your input please? And don't worry about null bytes, we're using read()!
> - 如果要调试,使用gdbserver attach到进程。如果是使用pwntools写题目的时候进行调试,remote连接到题目后先
pause()
暂停一下。1
2
3
4
5root@debian-armel:~/armv5# pidof ret2win_armv5
3710
root@debian-armel:~/armv5# gdbserver :6666 --attach 3710
Attached; pid = 3710
Listening on port 6666 - 在宿主机就可以联动gdb-multiarch和pwntools进行调试了
1
target remote :6666
小结
将qemu虚拟机使用端口映射的方式来启动真的特别方便,主要就解决了两个问题:
- qemu虚拟机连接到外网
- qemu虚拟机需要和宿主机进行通信
适用场景就是这样的IoT题目搭建,将题目通过一个端口(8888)映射出去,调试接口通过一个端口(6666)映射出去,如果需要使用更多的终端,可以通过ssh连接到虚拟机中。
真滴方便。