**郑重声明:**本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。
🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论| 保持连接💬
🌌 立即前往 👉晖度丨安全视界🚀
▶信息收集 ➢ 修改漏洞利用脚本 ➢ 分析漏洞利用脚本(.c)🔥🔥🔥
▶ 漏洞检测
▶ 初始立足点
▶ 权限提升
▶ 横向移动
▶ 报告/分析
▶ 教训/修复
目录
[1.1 分析并修改漏洞利用脚本](#1.1 分析并修改漏洞利用脚本)
[1.1.3 脚本语言和编译语言的区别](#1.1.3 脚本语言和编译语言的区别)
[1.1.3.1 二者总体的区别](#1.1.3.1 二者总体的区别)
[1.1.3.2 内存管理方式的不同](#1.1.3.2 内存管理方式的不同)
[1.1.4 分析并修改C语言漏洞利用代码 (42341.c)](#1.1.4 分析并修改C语言漏洞利用代码 (42341.c))
[1.1.4.1 修改目标IP与端口](#1.1.4.1 修改目标IP与端口)
[1.1.4.2 理解缓冲区构造逻辑](#1.1.4.2 理解缓冲区构造逻辑)
[欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论](#欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论)
1.修改缓冲区溢出利用脚本实战
本例以Sync Breeze Enterprise**(这是一个文件管理同步软件)** 为目标,对其漏洞利用分析与修改,并最终利用,漏洞编号:CVE-2017-14980
1.1 分析并修改漏洞利用脚本
我们在kali中查找 Sync Breeze Enterprise 10.0.28 有关的漏洞利用脚本,然后聚焦于两个可用漏洞之一,这将为我们提供适用于目标环境的漏洞利用代码,并展示后续的修改过程。
1.1.3 脚本语言和编译语言的区别
上一节详细分析了py脚本,下一节分析C语言的脚本。在分析之前,简要回顾一下**脚本语言(如Python)和编译语言(如C)**之间的区别。
1.1.3.1 二者总体的区别
| 对比维度 | 脚本语言 (Python) | 编译语言 (C) |
|---|---|---|
| 执行方式 | 解释执行 依赖Python解释器++逐行++翻译执行 | 编译执行 通过编译器生成独立的机器码可执行文件 |
| 可移植性 | 跨平台性好 需目标系统安装对应Python环境即可 | 独立性强 生成的可执行文件可直接运行,但需为不同平台分别编译 |
| 交付方式 | Python脚本文件(.py) | .exe等可执行文件 |
| 独立运行能力 | 需预装Python环境,否则无法运行 | 无需额外运行时环境,可直接执行 |
| 文件体积 | 脚本文件较小 | 可执行文件相对较大 |
| 防病毒检测 | 通常较低 | 较高(尤其使用打包工具时) |
| 开发效率 | 高 字符串操作直观(如"A"*780),自动内存管理 |
低 需手动内存管理,字符串操作需用函数(strcat等) |
| 控制精度 | 弱 对内存布局、寄存器等底层控制有限 | 强 可直接操作内存地址、指针、寄存器,适合精细漏洞利用 |
| 适用场景 | 快速PoC、概念验证、自动化脚本 | 独立攻击载荷、需要精确内存操作的利用(如ROP链) |
| 典型打包工具 | PyInstaller(打包为exe) | GCC、MinGW(编译器) |
综上,
-
执行方式
-
Python (脚本) :需要解释器,不能在没有Python的环境中独立运行。
-
C (编译) :直接编译成独立可执行文件,可在目标系统上直接运行。
-
-
开发与控制
-
Python :开发简单快速 。自动管理内存,字符串操作直观,但底层控制力弱。
-
C :开发复杂易错 。必须手动管理内存和指针,但能实现精准的底层控制,适合编写精细的漏洞利用。
-
如何选择?
-
用 Python 进行快速原型验证、编写测试脚本。
-
用 C 制作独立的攻击载荷、或需要精确内存操作的利用程序。
两者结合是常态:用Python构建攻击框架,用C编写核心的Shellcode。
1.1.3.2 内存管理方式的不同
在 Python 中,自动内存管理 。你可以直接写 "A"*780 + "\x83\x0c\x09\x10",解释器会自动为你分配和管理所需的内存。比如:
而在 C 语言中,手动内存管理。 字符串本质上是字符数组,必须手动分配和操作内存,无法直接"相加"。常见的连接方式有:
-
使用函数 :如
strcat(dest, src)或更安全的strncat。 -
手动复制 :用
memcpy或循环将字节逐个复制到预先分配好的缓冲区中。
常用的C语言字符串连接方法
① strcat() 函数 - 基础连接
objectivec
#include <string.h>
char buffer[100] = "Hello, ";
char name[] = "World!";
strcat(buffer, name); // 结果: "Hello, World!"
⚠️ 风险 :不检查目标缓冲区大小,可能导致缓冲区溢出。
② strncat() 函数 - 相对安全的连接
objectivec
char buffer[20] = "Hello";
char addition[] = ", World!";
strncat(buffer, addition, sizeof(buffer)-strlen(buffer)-1);
✅ 优点:可限制最大复制字符数,避免溢出。
③ 手动操作字符数组
objectivec
char buffer[100] = "前缀";
char *ptr = buffer + strlen(buffer); // 定位到字符串末尾
memcpy(ptr, "要添加的内容", 15); // 直接复制内存
ptr[15] = '\0'; // 手动添加结束符
对比示例:
| 操作需求 | Python实现 | C语言实现 |
|---|---|---|
| 简单连接 | result = str1 + str2 |
strcat(dest, src) |
| 连接多个字符串 | result = s1 + s2 + s3 |
多次调用strcat或使用sprintf |
| 创建重复字符 | "A" * 780 |
memset(buffer, 'A', 780) |
| 构造漏洞利用载荷 | offset + JMP_ESP + nops + shellcode |
分别使用memcpy或循环填充各部分 |
1.1.4 分析并修改C语言漏洞利用代码 (42341.c)
使用 searchsploit -m 命令将漏洞利用复制到本地工作目录后,可检查其内容。
编译环境识别
打开代码阅读,看到包含 winsock2.h 等头文件,表明这段代码专为Windows平台编译而设计的 。意思是:++这个代码正常是在windows平台下直接编译成exe文件利用的。++
跨平台编译选项
虽然可在Windows环境直接编译,也可通过 Kali Linux 使用交叉编译器(minw-w64)进行编译,使其能在目标环境中运行。编译的动作是在修改c代码完成后进行,现在先继续阅读这个c语言代码。
1.1.4.1 修改目标IP与端口
问题 :C代码中使用了硬编码的IP地址和端口,必须调整为实际目标信息。
方法:
-
定位代码中的连接配置部分
-
将固定值替换为目标环境的实际IP地址和端口号
把以下的C语言代码:
修改为:目标IP和端口。
1.1.4.2 理解缓冲区构造逻辑
接下来,仔细检查核心部分:
| 代码片段 | 功能说明 | 类比比喻 |
|---|---|---|
int initial_buffer_size = 780; |
定义缓冲区大小为780字节 | 确定信封的大小 |
char *padding = malloc(initial_buffer_size); |
动态分配780字节内存,并将返回的指针存储在padding中。此时,padding 指向的是一块动态分配的内存区域。 | 领取一个空信封 |
memset(padding, 0x41, initial_buffer_size); |
使用 memset 将 padding 指向的内存区域的前 780 字节全部填充为 0x41。0x41 是ASCII码中的字符 'A',所以这行代码是将这块内存区域填充为字母 'A'。 |
在信封里塞满白纸 (填充物) |
memset(padding + initial_buffer_size - 1, 0x00, 1); |
将最后一个字节设为空终止符。 再调用一次 memset, padding + initial_buffer_size - 1 意思: 从 padding 指针开始,向后移动 (initial_buffer_size - 1) 字节,最终指向缓冲区的最后一个字节(779字节)。将该字节设置为 0x00,即 'A' 被替换为null 字符,以确保它是一个合法的C字符串, 通常用于字符串结束标志。变成如下: |
在信封封口处盖章(标记结束) |
**问题:**原来的返回地址失效,要寻找适合本例的返回地址。
原始代码:
objectivec
unsigned char retn[] = "\xcb\x75\x52\x73"; // msvbvm60.dll中的返回地址
问题分析:
-
注释说明返回地址指向msvbvm60.dll(Visual Basic 6.0运行库)
-
但目标Windows系统可能缺少此DLL文件
-
因为缺失此DLL文件,因此将导致跳转地址无效,漏洞利用失败
msvbvm60.dll
这是Microsoft Visual Basic 6.0的虚拟机文件。它是一个动态链接库(DLL),用于支持运行使用Visual Basic 6.0开发的程序和应用程序,是Visual Basic 6.0程序运行所依赖的核心文件。
****但是:****在我们的Windows目标上检查调试器中加载的模块时,注意到这个DLL文件是缺失的,这意味着返回地址对我们的目标无效。(当然,如有没有缺失,该返回地址可用。)
- 注意!如果没有启用 ASLR(地址随机化): 同一个 DLL 文件在不同的 Windows 系统上加载时,它的加载基址会相同 ,因此
jmp指令的跳转目标地址是一样的。这就解释了为什么要寻找一个合适的返回地址的根本原因。
比喻理解:
这就像制作一把万能钥匙 ,但钥匙的齿形设计 基于特定品牌的锁芯。如果目标门上安装的是不同品牌的锁,这把钥匙就完全无效。
由于篇幅有限,对该利用代码要修改返回地址、自定义shellcode等内容见下一篇文章。
欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论
每一份支持,都是我持续输出的光。感谢阅读,下一篇文章见。
