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


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

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


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


    前言

    我们还有更长的路要走,不过没关系,道路就是生活。
    
                           ————杰克  凯鲁亚克《在路上》
    
    • 1
    • 2
    • 3

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

    在这里插入图片描述

    这是一个栈帧的基本结构

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

    现在我们分类型淹没,黑,蓝,绿随便字符,凑数,红色的淹没返回地址,因为返回地址很重要,我们需要它去指向我们的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中)
    只要控制好字符串的长度,我们就能用我们想要的代码覆盖本来的代码

  • 相关阅读:
    华硕电脑自带壁纸位置
    Redisson 高性能 Redis 分布式锁源码分析
    同样Java后端开发三年,朋友已经涨薪到了30k,而我才刚到12K。必须承认多背背八股文确实有奇效!
    C# --- 设计游戏类与游戏地图和坦克移动
    Golang - api中生产数据,另一个进程控制并发数去消费api中生产的数据
    003.Vim编辑器
    SpringBoot整合minio分布式文件实操
    Java:实现判断链表是否有一个循环算法(附完整源码)
    Selenium 柱状图自动化测试
    牛客题霸 -- 【模板】完全背包
  • 原文地址:https://blog.csdn.net/weixin_65527369/article/details/126938500