栈溢出漏洞原理详解与利用( 二 )


栈溢出属于缓冲区溢出 , 指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数 , 因而导致与其相邻的栈中的变量的值被改变 。
另外 , 我们也不难发现 , 发生栈溢出的基本前提是:程序必须向栈上写入数据、写入的数据大小没有被良好地控制 。引用一个例子来了解一下栈溢出
#include <stdio.h>#include <string.h>void success() { puts("You Hava already controlled it."); }void vulnerable() {char s[12];gets(s);puts(s);return;}int main(int argc, char **argv) {vulnerable();return 0;}很显然符合以上两个条件 , gets()成为突破口我们在主函数处下断点 , 运行和调试

栈溢出漏洞原理详解与利用

文章插图
【栈溢出漏洞原理详解与利用】 
lea eax , dword ptr ss:[ebp-0x14] 这时开辟一个空间给变量 , 也即是s , 如图所示
栈溢出漏洞原理详解与利用

文章插图
 
我们想执行sucess()函数 , 要怎么办呢?
执行完vulnerable()函数后 , 会还原ebp , 改变esp的值(leave) , 然后retn , 也就是pop eip , 然后CPU根据eip指针指向的指令继续运行 。
我们能抓到的点就是控制eip , 怎么控制?通过控制栈顶的值 , 那么栈顶的值是什么?栈顶的值是进入该函数时储存的下一条指令的地址 。这里提一点 , 进入函数 , 要保存两个值:下一条命令的地址、EBP旧栈帧的帧基指针 , 只有这样才能完全恢复 。
此时我们可以构造payload , 来控制我们要控制的地方 , 栈中存储EBP值的存储单元的上一个存储单元 , 也就是图中的存储address的存储单元
我们先试验一下输入0x14 *'A'+BBBB+0000 , 发生的变化
栈溢出漏洞原理详解与利用

文章插图
 
很好 , 按照我们的预想进行(Python -c 'print "A"* 0x18+p32(0x00401520)') 就可以达到栈溢出的效果
栈溢出漏洞原理详解与利用

文章插图
 
0x04 尾记还没有入门 , 只是个人的见解 , 如有错误 , 希望各位大佬指出 。参考:
https://en.wikipedia.org/wiki/Stack_buffer_overflow
https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/stackoverflow-basic-zh/
高级栈溢出技术—ROP实战
http://hetianlab.com/expc.do?ce=a763263a-de03-4368-a917-76bfb39f8c96
(学习ROP概念及其思路 , 了解高级栈溢出时需要注意的事项 , 并掌握解决方法)
声明:笔者初衷用于分享与普及网络知识 , 若读者因此作出任何危害网络安全行为后果自负 , 与合天智汇及原作者无关!




推荐阅读