【读书笔记】《0day安全》第二章:栈溢出的原理和实践

我本相死而生,无意惹惊鸿

《0day安全》第二章:栈溢出的原理和实践


🔥系列专栏:读书笔记
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年9月20日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!


前言

我们还有更长的路要走,不过没关系,道路就是生活。

                       ————杰克  凯鲁亚克《在路上》

先用几幅图表达一下我的理解

在这里插入图片描述

这是一个栈帧的基本结构

在这里插入图片描述

我们将足以彻底淹没一个栈帧的字符输入进去

在这里插入图片描述

原本的栈帧全红了,并且返回地址无效,因为哪也指向不了,所以程序崩了

在这里插入图片描述

现在我们分类型淹没,黑,蓝,绿随便字符,凑数,红色的淹没返回地址,因为返回地址很重要,我们需要它去指向我们的shellcode
在正常情况中,每一个栈帧的返回地址不一定指向正下面的栈帧,可能存在其他调用,会指向其他的未知地方

在这里插入图片描述

现在淹没了,返回地址是JMP ESP,他可以百分百的指向shellcode

在这里插入图片描述

缓冲区前置知识

缓冲区溢出就是在大缓冲区中的数据向小缓冲区复制的过程中,由于没有注意小缓冲区的边界,“撑爆”了较小的缓冲区,从而冲掉了和小缓冲区相邻内存区域的其他数据而引起的内存问题。
在这里插入图片描述

内存的分区

(1)代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指令并执行。
(2)数据区:用于存储全局变量等。
(3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配和回收是堆区的特点。
(4)栈区:用于动态地存储函数之间的调用关系,以保证被调用函数在返回时恢复到母函数中继续执行。

指针的分类

1.ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。

2.EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

3.EIP:指令寄存器(Extended Instruction Pointer),其内存放着一个指针,该指针永远指向下一条等待执行的指令地址

可以说如果控制了EIP寄存器的内容,就控制了进程——我们让EIP指向哪里,CPU就会去执行哪里的指令(在我的实际操作中,EIP也承担了非常重大的任务,是很花时间的一个点)

(1)局部变量:为函数局部变量开辟的内存空间。

(2)栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部可以通过堆栈平衡计算得到),用于在本帧被弹出后恢复出上一个栈帧。

(3)函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回时能够恢复到函数被调用前的代码区中继续执行指令。

函数的调用

这是本来没有任何动作的时候,ESP和EBP之间就只是一个正常的栈帧

在这里插入图片描述

按照从先入后出的顺序原则放入参数

在这里插入图片描述

此时压入返回地址

在这里插入图片描述

相当于是复制一个自己的EBP然后压入

在这里插入图片描述

此时已经开始了转换(栈顶和当前栈帧底部指针都要去新的栈帧了)
将ESP值装入EBP,更新栈帧底部
同时EBP指针跟上去

在这里插入图片描述

ESP按照指令要求走多少个内存空间,此时这一对ESP,EBP之间又形成了新的栈帧

在这里插入图片描述

缓冲区溢出具体原理

本质上就是用我们想要的返回地址覆盖原本的返回地址,使得程序不去执行应该执行的部分(例如输入密码阶段),而是去到别的部分(比如登录成功阶段)

修改函数返回地址

更通用、更强大的攻击通过缓冲区溢出改写的目标往往不是某一个变量,而是瞄准栈帧最下方的EBP和函数返回地址等栈帧状态值。(从而可以使用payload进行攻击,让返回地址返回到我所构造的shellcode中)
只要控制好字符串的长度,我们就能用我们想要的代码覆盖本来的代码

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人间体佐菲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值