Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
windows-x86-shellcode-poc — Windows x86 PoC:在旧版32位Windows上使用自定义shellcode的基于栈的缓冲区溢出 | Kitploit
工具/GitHubGitHub/nataliadiak/windows-x86-shellcode-poc
漏洞分析逆向工程Shellcode学习与教育Payload 开发二进制利用
GitHubnataliadiak/windows-x86-shellcode-poc

windows-x86-shellcode-poc

Windows x86 PoC:在旧版32位Windows上使用自定义shellcode的基于栈的缓冲区溢出

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
查看仓库
8223个月前尚未审核
分享

Windows x86 缓冲区溢出 PoC 入门指南

这是一个针对 32 位 Windows 的基于栈的缓冲区溢出漏洞利用的简单自包含教程。 无需外部指南——你需要的一切都在这里。

这个仓库包含什么?

  • vulnerable.c:一个包含不安全的 gets() 函数的简单程序。
  • messageBox.asm:一个小型汇编载荷,会在溢出后执行。
  • exploit.c:一个演示如何触发溢出的示例。

本项目传达一个核心概念:不安全的输入读取可能让攻击者覆盖返回地址并重定向执行流程。

漏洞:gets() 没有大小限制

在 vulnerable.c 中,程序执行了以下操作:

root@kitploit:~
char buffer[32];
gets(buffer);

程序为 buffer 分配了 32 字节,然后调用 gets() 读取输入。 问题在于:gets() 不检查缓冲区大小。 它会持续读取字符,直到遇到换行符。 如果用户输入 40 或 50 个字符,多余的字符就会溢出到 32 字节缓冲区之外。

内存如何在栈上布局

当一个 C 函数执行时,栈(一块内存区域)存储以下内容:

  1. 局部变量(例如 buffer)
  2. 保存的 EBP(调用函数的基址指针)
  3. 保存的返回地址(函数返回时 CPU 应该跳转到的地址)

图像如下所示:

root@kitploit:~
较低地址(如图所示栈顶)
[  buffer (32 字节)  ]
[    保存的 EBP (4 字节)    ]
[  返回地址 (4 字节)  ]
较高地址(栈底)

当 gets() 用过多的输入溢出 buffer 时,多余的字节会覆盖保存的 EBP,然后覆盖返回地址。

如果我们精心构造溢出,将特定地址放入返回地址字段,那么当函数尝试返回时,CPU 将跳转到该地址。

漏洞利用的工作方式:逐步说明

  1. 程序启动,在栈上分配 buffer[32]。
  2. 调用 gets(buffer) 读取一行用户输入。
  3. 我们发送一个长度超过 32 字节的字符串(例如 50 字节)。
  4. gets() 没有大小检查,因此它会将所有 50 字节写入缓冲区。
  5. 多余的 18 字节溢出 buffer,覆盖保存的 EBP 和返回地址。
  6. 我们精心构造溢出,使得返回地址指向栈上的 shellcode。
  7. 函数返回时,CPU 读取被覆盖的返回地址。
  8. CPU 跳转到 shellcode。
  9. Shellcode 以程序的权限运行。

这是通过缓冲区溢出实现代码执行的最简单形式。

shellcode 中发生了什么:载荷

messageBox.asm 是一小段代码,设计用于在溢出后执行。

它执行以下操作:

  1. 加载 USER32.DLL:调用 LoadLibraryA,参数为字符串 "USER32.DLL",确保库在内存中。
  2. 为 MessageBoxA 准备参数:将四个参数压入栈(窗口句柄、消息文本、标题、按钮类型)。
  3. 调用 MessageBoxA:调用 Windows API 函数,显示一个包含文本 "CAN I HACK THE PC?" 的消息框。
  4. 正常退出:调用 ExitProcess 安全地终止程序。

关键点:这是一段可执行代码,溢出将执行流重定向到它之后运行。 当消息框出现在屏幕上时,它证明了三件事:

  1. 缓冲区溢出生效,重写了返回地址。
  2. 执行流程跳转到了栈上的 shellcode。
  3. Shellcode 成功运行,并调用了 Windows API。

在实际攻击中,这个载荷可以做任何事情:窃取数据、创建用户、下载恶意软件等。 消息框只是一种可见、安全的方式来演示任意代码执行已经发生。

这个特定的载荷为 MessageBoxA (0x751D8830) 和 ExitProcess (0x7437ADB0) 使用了硬编码的内存地址。 这些地址仅对特定系统有效。对于不同的 Windows 版本或系统,需要调整载荷。

MessageBoxA

如何构建并运行演示

第一步:禁用保护机制

现代 Windows 具有多种安全功能来阻止此漏洞利用:

  • 栈金丝雀(GS 标志):检测栈覆盖。
  • ASLR(DYNAMICBASE):随机化内存地址,使硬编码地址无效。
  • DEP/NX(NXCOMPAT):将栈标记为不可执行,阻止代码在栈上执行。

为了学习目的,我们将它们全部禁用。

第二步:在 Windows 上编译

使用 MSVC(Microsoft Visual C++)并指定特定标志:

root@kitploit:~
cl /c /GS- /W3 /Zl vulnerable.c
link /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /NXCOMPAT:NO vulnerable.obj /OUT:vulnerable.exe

各标志含义:

  • /GS- 禁用堆栈缓冲区溢出保护。
  • /DYNAMICBASE:NO 禁用地址空间布局随机化(ASLR)。
  • /NXCOMPAT:NO 禁用 DEP,允许在栈上执行代码。

如果你已有可执行文件,可以使用 editbin 禁用保护:

root@kitploit:~
editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe

第三步:运行

  1. 启动 vulnerable.exe。
  2. 当提示时,输入一个长字符串(超过 32 个字符)。
  3. 如果溢出生效,保存的返回地址被覆盖。
  4. 程序可能会崩溃、跳转到随机内存,或者(在带有正确 shellcode 的真实漏洞利用中)执行载荷。

为什么这份 README 是完整的

这份 README 解释了:

  1. gets() 是什么以及为什么它不安全(没有大小限制)。
  2. 栈如何存储局部变量、保存的寄存器和返回地址。
  3. 溢出如何覆盖返回地址。
  4. CPU 在函数返回时如何使用返回地址。
  5. shellcode 如何在返回地址指向它时执行。
  6. 存在哪些保护机制以及我们为什么要禁用它们。
  7. 如何构建并运行示例。

你现在已经理解了整个缓冲区溢出漏洞利用流程。 阅读代码文件并与本说明对比,以巩固你的理解。

重要安全提示

此示例仅用于学习。 请勿将本技术用于不属于你或未获得明确测试权限的系统。 未经授权访问计算机系统是违法的。

下载工具