如何利用基于堆栈的简单缓冲区溢出漏洞 上篇

admin 2024年3月4日15:39:16评论8 views字数 1497阅读4分59秒阅读模式

我们将通过利用简单应用程序中的堆栈溢出漏洞来讨论漏洞利用开发的基础知识。我们将研究一个简单的内存结构、内存中的程序执行、缓冲区溢出的原因。
什么是缓冲区溢出?

缓冲区溢出只是溢出程序或应用程序在内存中分配的缓冲区空间。
堆栈内存结构

内存堆栈是内存中分配给应用程序或程序以执行其的一部分。它负责在应用程序或程序执行期间保存本地数据、参数值和返回地址。它遵循内存存储的后进先出 (LIFO) 方法,即堆栈上最后存储的指令 (PUSH) 首先执行 (POP)。

堆栈由四个主要组件组成:ESP(扩展堆栈指针)、EBP(扩展基指针)、EIP(扩展指令指针)和缓冲空间。内存堆栈的布局图示如下所示:
如何利用基于堆栈的简单缓冲区溢出漏洞 上篇
现在让我们简要看一下这四个组成部分中的每一个:
(1)扩展堆栈指针(ESP):ESP 是指向内存堆栈顶部的 CPU 寄存器。它可以保存正在执行的指令的内存地址或当前位于内存堆栈顶部的数据。ESP 中的值会随着程序执行而变化。
(2)缓冲区空间:它是分配给程序执行的空间。通常,不应允许缓冲区中的信息逃逸缓冲区空间。这是通过实施适当的输入清理并遵循安全编码方法来完成的。
(3)扩展基指针(EBP):EBP 是保存堆栈顶部内存地址的 CPU 寄存器。这通常在整个程序执行期间保持固定,并用作下一个指令的参考地址。

(4)扩展指令指针(EIP):弹性公网IP控制执行流程。它保存 CPU 要执行的下一条指令的位置。弹性公网IP是缓冲区溢出攻击的主要目标,因为控制弹性公网IP可以让攻击者控制命令执行。
程序执行

当应用程序或程序加载到内存中执行时,它会在内存中占用空间并分配一个堆栈。EBP 保存此堆栈帧的地址。当程序开始执行时,ESP 会使用堆栈顶部(由 EBP 引用)上执行的指令进行更新,而 EIP 会根据应用程序逻辑使用要执行的下一条指令进行自我更新。程序可能需要的所有参数和参数值都存储在缓冲区空间中。
缓冲区溢出的原因

当缓冲空间无法有效处理缓冲空间中的数据时;即数据是缓冲区空间超过分配的缓冲区空间,缓冲区可能会溢出,导致相邻的内存位置被数据写入。应用程序代码中缺少输入清理,可能会使应用程序容易受到缓冲区溢出漏洞的影响。
缓冲区溢出攻击剖析

让我们假设我们有一个简单的应用程序,它要求用户输入其名称。在应用程序代码中,为名称分配的缓冲区空间是一个由 8 个字符组成的数组。当应用程序开始执行时,它会要求用户输入其名称。假设用户名是 Anthony,他输入了自己的姓名,应用程序接受它,并且由于“Anthony”在缓冲区的 8 个字符限制内,因此应用程序可以正常退出。但是,假设用户输入了他的全名;即“Anthony Martial”,这远远超出了缓冲区空间的限制,如果没有适当的输入清理,应用程序将接受该名称,用“Anthony”填充缓冲区空间,“Martial”将被写入相邻的内存位置。然后,应用程序将查找要执行的下一条指令,但会发现“Martial”作为要执行的下一条指令,这是无效的指令,应用程序将崩溃。
现在,攻击者可以通过确定应用程序需要多少字节才能正常运行来利用此行为,他将计算出导致应用程序崩溃的确切字节数,提供有效输入作为应用程序可以处理的最大长度,然后将其有效加载的 shellcode 作为汇编指令放在下一个内存位置。当应用程序移动到下一个内存位置时,它将找到攻击者的 shellcode,最终攻击者可以根据需要指导执行流程。
下篇进行实战演示->

喜欢朋友可以点点赞转发转发。

免责声明:本公众号不承担任何由于传播、利用本公众号所发布内容而造成的任何后果及法律责任。未经许可,不得转载。

原文始发于微信公众号(重生者安全团队):如何利用基于堆栈的简单缓冲区溢出漏洞 上篇

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月4日15:39:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何利用基于堆栈的简单缓冲区溢出漏洞 上篇https://cn-sec.com/archives/2544510.html

发表评论

匿名网友 填写信息