第一步看看保护措施,确定方略,再看看ida里面有用信息:
image.png
image.png
看到是栈的溢出漏洞,但是发现栈空间不够写指令,又发现题目创建了个堆给你,应该可以好好利用这个堆实现我们想要的功能,正常来说,当栈的空间不够用时是写入bss段的,这里正好可以用,就先用吧,接下来找有用信息:
image.png
看来没有system和/bin/sh,有些迷,看到还有一个文件libcpovit.so,拖ida进去看看:
image.png
发现了我们想要的system函数,同时参数有效,就是直接得到flag,那么接下来就是要在povit中获取这个ret2win的真实地址了,再找找信息:
image.png
image.png
发现了相同的函数,思路已经比较清晰了:
首先让function函数执行一次,在got表中生成对应的真实地址,然后偏移量是利用在libc表中的偏移和真实表中的偏移相同,先计算出在libc表中ret2win和function之间的偏移。再用function真实地址+偏移地址=ret2win的真实地址。
脚本就可以写出来了:
1、计算偏移:
image.png
2、执行一次获取got表上的真实地址:
image.png
3、求ret2win的真实地址并调用这个函数:
image.png
4、得到堆顶指针:
image.png
5、栈溢出操作:
image.png
6、验证答案:
image.png
完整的脚本:
image.png
image.png
花式栈溢出:先把指令放在一个地方,给个地址返回值,然后就能在有限的栈溢出空间进行操作了,相当于跑到另一个地方去执行代码了,优秀!
网友评论