当数据从一个位置移动到另一个位置时,缓冲区(内存存储区域)会暂时保留数据。大于内存缓冲区存储容量的数据量会导致缓冲区溢出,也称为缓冲区溢出。应用程序在尝试将数据复制到缓冲区的过程中覆盖附近的内存区域。
任何类型的程序都可能遇到缓冲区溢出。最常见的原因是错误的输入或缓冲区空间分配不足。程序行为可能会变得不可预测,从而导致结果不准确、内存访问问题,或者在事务覆盖可执行代码时崩溃。
查找缓冲区溢出的步骤:
1. Spiking — 查找程序的易受攻击部分
2. 模糊测试 — 发送一堆字符,看看我们是否可以破解程序
3. 找到偏移量 — 找出我们在什么点打破了它
4. 覆盖 EIP — 用于漏洞利用和远程代码执行
5. 寻找坏角色 — 额外的角色
6. 找到合适的模块 — 用于开发
7. 生成 Shellcode — 恶意 shellcode 会给我们一个反向 shell
8. 根!!— 如果一切顺利
让我们深入研究一下,我们如何找到这个漏洞!!
注意:出于演示目的,我们将使用 vulnserver
扣球
-
启动 vulnserver 并连接到它:
2. 打开 immunity debugger 并附加 vulserver 并运行它:
3. 让我们与它交流,我们将专注于 highlighter 命令:
4. 这里 TRUN 是我们将要查看的易受攻击组件,要找到易受攻击的命令,我们需要执行 spiking
5. 我们将获取每个命令并提供一堆字符,看看它是否溢出,如果它溢出并且程序崩溃,那么这是易受攻击的
6. 为此,我们将使用名为 generic_send_tcp 的工具:
7. 我们需要 spike 脚本,让我们检查 stats 命令:
8. 在上面的 spike 脚本中,我们可以看到:
一个。我们阅读了这条线
b.然后我们获取字符串 (STATS here)
c. 然后我们将向它发送变量
9. 让我们测试 STAT:
10. 让我们测试 TRUN:
11. 按下 run 后,我们看到 access violation 错误,这意味着某些内容易受攻击:
12. 查看寄存器以获取信息:
一个。寄存器中填充了 “A=41 in hex”
b.另外,看看 EIP
13. 现在,我们发现 该点或命令是脆弱的 i..e 特伦
一个。此阶段称为加标
B. I..e..确定易受攻击的内容
模糊
1. 类似于尖峰
2. 在这个阶段,我们将派遣一群 charecter 到一个指挥部并尝试将其 breken
一个。区别在于,在尖峰攻击中,我们试图找到易受攻击的内容
b.在模糊测试中,我们知道什么是易受攻击的,我们将对其进行攻击
3. 为此,编写 python 脚本并使其可执行:
4. 启动模糊测试程序并等待程序崩溃:
5. 我们使程序崩溃
6. 现在下一步是找出我们崩溃的时间点以及 EIP 在哪里
一个。这是找到偏移量
查找偏移量
1. 要找到偏移量,我们需要创建模式(msf 框架提供的工具):
或者,您也可以使用 mona.py 创建模式
2. 现在,我们制作 offset.py 代码并将其发送:
3. 当我们发送它时,我们将获得 EIP 的价值;因此程序崩溃,并且 EIP 上的 value 将返回
4. 现在我们知道了 EIP 的价值,让我们看看如何使用它
或者,我们同样可以使用 mona.py 来确定偏移量,这非常简单
5. 该值告诉我们,在 2002 年,我们可以控制 EIP
一个。或覆盖 EIP
覆盖弹性公网 IP
1. offset 2002 的值表示:
a. 在获得 EIP 之前有 2002 个字节
b.此外,EIP 本身的长度为 4 字节
2. 我们将尝试写入这 4 个特定字节
3. 为此,我们可以将 offset 脚本修改为:
4. 我们发送包含 A 和 B 的 shellcode
一个。我们将发送 2002 * A,截至 2002 年,我们的 EIP 位于
b.4 * B,因为 EIP 为 4 字节
5. 现在,我们通过传递 4*B 来控制 EIP:
6. 现在,我们知道我们可以控制 EIP,让我们尝试查找坏字符(如果有)。
查找 Bad 角色
1. 查找坏字符就像生成 shellcode
一个。我们需要知道哪些字符对我们的 shellcode 是好的或坏的
或者,我们可以使用 mona.py 来简化此操作:
2. 执行上述脚本:
3. 程序确实如预期般崩溃,但我们真的对 badchar 的十六进制转储感兴趣:
4. 最后一个角色是 FF;同样在现实生活中,我们需要看看中间是否有任何坏角色
一个。如果有一些,它将看起来像 11 12 13 15
b.请注意,缺少 12 个
c. 这清楚地表明,这两者之间存在不良品格
5. 坏角色列表:(此处不存在)
6. 找到所有 badchars 时写下它们,比如缺少什么
一个。唯一的错误字符是缺失序列的第 1 个字符
7. 在这里,没有坏角色
一个。如果有坏字符
b.运行 badchar.py
8. 现在,我们需要将生成的 bin 文件与字节数组的起始地址进行比较:
9. 按 C,它将带您进入 CPU 窗口,并反映出规定的字节数组地址:
10. 现在,我们将比较:
11. 上述 ss 所反映的情况应该是这种情况
12. 如上述 ss 所示,您还需要删除 09:
13. 重复直到没有找到坏字符,然后我们可以将字符串放入没有坏字符的最终漏洞利用中。
找到合适的模块
1. 这意味着寻找没有内存保护的 DLL,即......没有 DEP、ASLR 等。
2. 我们可以在调试器中使用 mona.py 来实现这一点:
3. 我们将 mon.py 放入文件夹中并输入:!mona modules
4. 我们将使用第一个模块,因为它没有所需的内存保护。
5. 现在,我们需要找到 JMP 的等效操作码
答:我们需要找到“JMP ESP”地址,以便让我们跳转到堆栈地址来执行我们的 shellcode。我们可以使用 mona.py 脚本来帮助我们找到具有 'jmp esp 的正确模块
6. 现在这条指令会告诉 EIP 地址跳转到我们当前 ESP 指向的地址。
7. 然后,我们将使用找到的 ESP 地址编辑我们的漏洞利用:
8. 如果您注意到,JMP 代码现在以相反的顺序写入 EIP
一个。这是因为 x86 接受 little endian 格式
b. 其中,较低字节的数据存储在较低的地址,而高阶字节存储在较高的地址
9. 现在,我们将继续 JMP 地址:
10. 现在,我们将按 F2 设置一个中断点:
11. 我们正在这样做,所以如果我们运行程序,它会在 ar 断点右暂停,然后继续前进
12. 执行我们的脚本:
13. 现在,你可以看到我们已经控制了 EIP,剩下的唯一就是编写 shellcode 和 root!!它
最终漏洞
1. 生成我们的 shellcode:
a. b 表示字节编码
b. /x90 为 NOP
c. 现在,让我们启动漏洞利用:
结论
基于堆栈的 Windows 缓冲区溢出和缓冲区溢出攻击的基本概念到此结束。
其它课程
linux恶意软件开发对抗与进程安全管理视频教程
linux文件系统存储与文件过滤安全开发视频教程(2024最新)
linux高级usb安全开发与源码分析视频教程
linux程序设计与安全开发
-
windows恶意软件开发与对抗视频教程
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
windows文件过滤(更新完成)
-
USB过滤(更新完成)
-
游戏安全(更新中)
-
ios逆向
-
windbg
-
还有很多免费教程(限学员)
-
更多详细内容添加作者微信
原文始发于微信公众号(安全狗的自我修养):漏洞利用开发基础:简单缓冲区溢出
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论