目录
1、什么是栈溢出?
栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致栈中与其相邻的变量的值被改变。
2、栈结构
3、栈溢出需要解决的问题
在我们知道什么是栈溢出以及了解了栈的结构之后,我们就可以开始通过栈溢出破坏栈结构。
在破坏栈结构的时候,我们需要注意两个问题:
1、如何跳转?
2、跳转到哪里去?
3.1、解决如何跳转的问题
在上面栈结构的图中,在当前栈帧中向栈中某个变量中写入值的时候,我们就可以写入超过了这个变量本身所申请的字节数,不断的往上覆盖直到其返回值地址的地方,从而到我们想要的地址的地方写入我们要写入的地址。
简而言之:我们调用完一个函数后,函数会返回,并执行下一个函数。我们就需要把这个返回地址覆盖成我们的shellcode,进而让函数执行我们的shellcode,从而拿到shell,控制其程序的目的。(在此文章中是返回到系统的system(“/bin/sh”)函数上)
实例如下:
1、首先我们准备一个二进制程序
这是一个32位的程序
2、我们通过IDA来看一下汇编代码
我们先反汇编一下
看到这个函数调用了puts和gets函数,并且其中的s并未做大小的校验。此时我们的思路就活跃了起来,s作为gets函数的参数,并且保存在栈上,我们就可以通过向s的地址中写入数据的时候覆盖掉栈的其他数据。
我们通过GDB实战一下:
我们先调试起来,让其运行到gets函数:
此时汇编在向下走我们就需要输入数据了,并且S的地址为0xf7ffd000,栈的第一个参数的地址为0xffffd41c, 此时我们来看一下栈的栈结构
此时在栈中,我们发现我们输入的数据是从eax开始的,那么我们从上面的栈结构的图中了解到,我们就可以不断向上覆盖到ebp,返回地址,参数等等。
我们实验覆盖到ebp。
ebp的地址为0xffffd488,eax的地址为0xffffd41c,ebp-eax=0x6c。
此时我们输入0x6c个a看看实际效果:
此时会发现我们精准的覆盖了ebp到eax之间的内容。
不相信的话我们在试试覆盖一下ebp试一下呢?
我们写入 0x6c个a+0x04个b试试看效果:
此时我们的ebp就被覆盖成了bbbb,此时我们就完成了如何跳转的问题了。
3.2、跳转到哪里去?
在上面我们解决了如何跳转的问题,那么跳到哪里去呢?
根据上面的栈结构,毋庸置疑肯定跳到返回地址的地方嘛,调到返回地址的地方,如果此时我们填上了我们准备好的shell code,那岂不是就可以执行我们的shell code,从而获取shell了。
这里先实验第一种方法(后续方式另写文章补充):
本身程序具有system函数
我们使用IDA看一下:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)
![img](https://img-blog.csdnimg.cn/img_convert/d72d6c5f63b2cf601f0595237253cb78.jpeg)
最后
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!
88c6af944156ee24.jpg" alt=“img” style=“zoom: 67%;” />
最后
资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!