OneShell

I fight for a brighter tomorrow

0%

ROPemporium-arm环境搭建

该环境搭建步骤也适用于其他架构的rop练习环境搭建。
构建Linux内核为3.2.0,debian wheezy的ARMel
下载debain的wheezy文件系统、引导、操作系统内核。

1
2
3
https://people.debian.org/~aurel32/qemu/armel/debian_wheezy_armel_standard.qcow2
https://people.debian.org/~aurel32/qemu/armel/initrd.img-3.2.0-4-versatile
https://people.debian.org/~aurel32/qemu/armel/vmlinuz-3.2.0-4-versatile

使用如下的命令启动:网络配置是使用的NAT网络,在虚拟机中就可以连接到外网;除此之外,还对外映射了端口,将qemu虚拟机的6666、8888、22端口分别映射到宿主机的6666、8888、22端口。通过端口映射的方式就解决了qemu虚拟机连接外网和宿主机通信的问题,宿主机可以通过ssh root@127.0.0.1 -p 2222连接到qemu虚拟机中,在虚拟机中可以通过socat将题目映射出来,可以通过gdbserver将调试接口映射出来。

1
2
3
4
5
6
7
8
sudo qemu-system-arm \
-M versatilepb \
-kernel vmlinuz-3.2.0-4-versatile \
-initrd initrd.img-3.2.0-4-versatile \
-hda debian_wheezy_armel_standard.qcow2 \
-append "root=/dev/sda1" \
-nographic \
-nic user,hostfwd=tcp:127.0.0.1:6666-:6666,hostfwd=tcp:127.0.0.1:8888-:8888,hostfwd=tcp:127.0.0.1:2222-:22

虚拟机的账号密码是root:root

环境搭建

该虚拟机默认的源现在已经不可用,经过我的搜寻,最终找到了一个阿里云的debian7(wheezy)目前还可用,可以用来更新、下载一些必要的软件。

1
deb http://mirrors.aliyun.com/debian-archive/debian/ wheezy main non-free contrib

在虚拟机里面安装一些必要的软件:

1
2
apt-get update
apt-get install vim gdb gdbserver tmux socat

将armrop的题目通过scp(随意各种方式)传送到qemu虚拟机中,我设置的如下:

1
2
3
4
5
6
7
8
9
10
root@debian-armel:~/armv5# tree -L 1
.
|-- badchars_armv5
|-- callme_armv5
|-- fluff_armv5
|-- pivot_armv5
|-- ret2csu_armv5
|-- ret2win_armv5
|-- split_armv5
`-- write4_armv5

例如我现在要做ret2win_armv5这道题目,那么就先进入题目目录,使用socat将题目设置到8888端口,如果要调试的话,就使用gdbserver attach到进程,并将调试端口设置到6666。如果终端不够用的话,就ssh到qemu虚拟机中新开终端。

  1. 在qemu虚拟机中使用socat转发题目的io到8888端口:
    1
    socat tcp-l:8888,fork exec:./ret2win_armv5
  2. 在宿主机使用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()!

    >
  3. 如果要调试,使用gdbserver attach到进程。如果是使用pwntools写题目的时候进行调试,remote连接到题目后先pause()暂停一下。
    1
    2
    3
    4
    5
    root@debian-armel:~/armv5# pidof ret2win_armv5
    3710
    root@debian-armel:~/armv5# gdbserver :6666 --attach 3710
    Attached; pid = 3710
    Listening on port 6666
  4. 在宿主机就可以联动gdb-multiarch和pwntools进行调试了
    1
    target remote :6666
    undifined

小结

将qemu虚拟机使用端口映射的方式来启动真的特别方便,主要就解决了两个问题:

  1. qemu虚拟机连接到外网
  2. qemu虚拟机需要和宿主机进行通信
    适用场景就是这样的IoT题目搭建,将题目通过一个端口(8888)映射出去,调试接口通过一个端口(6666)映射出去,如果需要使用更多的终端,可以通过ssh连接到虚拟机中。
    真滴方便。