Eswlnk Blog Eswlnk Blog
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈
  • 注册
  • 登录
首页 › 攻防对抗 › 关于缓冲区溢出漏洞那些事之C-gets函数

关于缓冲区溢出漏洞那些事之C-gets函数

Eswlnk的头像
Eswlnk
2022-08-06 12:08:07
关于缓冲区溢出漏洞那些事之C-gets函数-Eswlnk Blog
智能摘要 AI
缓冲区溢出是指数据量超过缓冲区容量,导致程序覆盖相邻存储器的问题,常见于C语言等缺乏内存边界检查的语言。攻击者利用此漏洞覆盖程序内存,改变执行路径或注入恶意代码。C和C++因其低级特性易受攻击,而Java、JavaScript等语言内置安全机制降低了风险。预防措施包括使用安全函数如fgets替代危险的gets,启用地址空间随机化(ASLR)、数据执行保护(DEP)及结构化异常处理器覆盖保护(SEHOP)。修复建议包括及时更新软件补丁和改进编码实践。

缓冲区是存储器存储区,当数据从一处传送到另一处时,它会暂时保存数据。缓冲区溢出(或缓冲区溢出)发生在数据量超过缓冲区容量时。其结果是,试图向缓冲区写入数据的程序覆盖了相邻存储器。

关于缓冲区溢出漏洞那些事之C-gets函数-Eswlnk Blog
关于缓冲区溢出漏洞那些事之C -gets函数

缓冲区溢出是指当数据超过处理常识回传堆栈位置限制时所发生的异常操作。原因如下:

  1. 程序设计有缺陷;
  2. 特别是 C语言,它不像其他高级语言那样,会自动检查数组或指针堆栈区的边界,从而增加了溢出的风险;
  3. C标准库在 C语言中还有一些非常危险的操作函数,如果使用不当,可能会造成溢出。

什么是缓冲区溢出攻击

攻击者利用缓冲区溢出问题来覆盖应用程序的内存。这会改变程序的执行路径,触发文件损坏或暴露个人信息。例如,攻击者可能会引入额外的代码,向应用程序发送新的指令以便访问 IT系统。

如果攻击者知道程序的内存布局,他们会故意提供缓冲区无法存储的输入,以覆盖保存可执行代码的区域。例如,攻击者可能覆盖指针(对象指向另一内存区域),并将其指向漏洞利用负载,从而控制程序。

缓冲区溢出攻击的类型

基于栈的缓冲区溢出更常见,并且只在函数执行过程中使用堆栈内存。

基于堆的攻击执行起来会更加困难,并且会使分配给程序的内存空间超出当前运行时操作的内存。

哪些编程语言更容易受到攻击?

C和 C++是最容易受到缓冲区溢出攻击的两种语言,因为它们不具备覆盖或访问内存数据的内置保护机制。Mac OSX, Windows和 Linux使用 C++编写代码。

像 PERL, Java, JavaScript, C#这样的语言都使用内建的安全机制将缓冲区溢出的可能性降到最低。

如何防止缓冲区溢出

开发者可以在代码中设置安全措施,或者使用提供内建保护的语言来防止缓冲区溢出。

此外,现代操作系统有运行时保护功能。有三个常见的保护措施:

地址空间随机化 (ASLR)——随机移动数据区域的地址空间位置——随机移动数据区的地址空间位置。通常,缓冲区溢出攻击需要知道可执行代码的位置,随机化地址空间几乎不可能做到。

数据保护——标记特定的内存区域不能执行或可执行,从而阻止攻击在非执行区域执行代码。

结构化异常处理器覆盖保护—帮助阻止恶意代码攻击结构化异常处理(SEH)。这样就能防止攻击者利用 SEH覆盖技术。在功能层面, SEH覆盖使用基于堆栈的缓冲区溢出来覆盖线程栈中存储的异常注册记录。

在代码和操作系统保护方面没有足够的安全措施。当一个组织发现缓冲区溢出漏洞时,他们必须迅速做出反应,修复受影响的软件,确保软件用户能够访问补丁。

示例代码

根据STACK1_VS_2017.cpp代码进行修改

#include <stdlib.h>
#include  <stdio.h>
#include "Windows.h"

int main(int argc, char **argv) {

MessageBoxA((HWND)-0, (LPCSTR) "缓冲区溢出测试\n", (LPCSTR)"功能", (UINT)0);

int cookie;
char buf[2];
    int *a = &cookie;
    char * b = buf;
printf("buf: %08x cookie: %08x\n", b, a);
    u_int64 p =(u_int64)a-(u_int64)b;
    printf("两变量内存地址之差=%d\n",p);
gets(buf);
if (cookie == 0x41424344)
printf("缓冲区溢出成功!\n");

}

运行效果

使用MessageBoxA函数检测程序是否正常运行,点击确定开始测试

关于缓冲区溢出漏洞那些事之C-gets函数-Eswlnk Blog

使用printf()函数输出提示信息,使用gets()函数获取用户输入信息

关于缓冲区溢出漏洞那些事之C-gets函数-Eswlnk Blog

任意输入两个数值,不满足条件,程序运行完毕

关于缓冲区溢出漏洞那些事之C-gets函数-Eswlnk Blog

代码分析漏洞成因

诱因:char buf[2];

代码部分解析

代码使用 char,声明变量 buf为2个元素阵列,其中字符 buf有2个字节长度。

#include <stdlib.h>
#include  <stdio.h>
#include "Windows.h"

int main() {
    char test[] = "test1";
    printf("test1初始值为%s\n清输入st值:",test);
    char st[2];
    gets(st);
    printf("输出test:%s\n",test);
    printf("输出st:%s\n",st);
}

提示:u_int64 p=(u_int64)a-(u_int64) b;代码部分对程序变量的内存地址做了减分运算,并将其赋值给变量 p (为了使运算成立,还对变量进行了类型转义),结果显示了两个变量的内存地址距离,方便溢出。

隐患:使用 gets ()函数获取输入数据,因为 gets函数可以无限读取数据而不检查缓冲区大小限制,因此会继续向堆栈中写入超出缓冲区的数据,从而造成溢出风险。

关于缓冲区溢出漏洞那些事之C-gets函数-Eswlnk Blog

从运行效果来看,超过堆栈空间继续写入堆栈会覆盖 test在堆栈中对应的值,导致值发生变化:test1-3456

对运行过程堆栈进行反汇编分析

通过运行得知程序初始关键字:test1初始值test1

通过这个关键字,可以快速定位到程序相关函数的运行区域。

修复建议

可使用fgets或gets_s函数替换gets函数。

函数解析

  1. fgets()函数的第2个参数指明了读入字符的最大数量。
  2. 如果该参数的值是n,那么fgets()将读入n-1个字符,或者读到遇到的第一个换行符为止;
  3. 这里为3,故获取的数值为12,共输入6个数读取到第2个结束
关于缓冲区溢出漏洞那些事之C-gets函数-Eswlnk Blog

本站默认网盘访问密码:1166
本站默认网盘访问密码:1166
C语言代码溢出漏洞堆栈攻防对抗缓冲区攻击实验缓冲区溢出编程语言
0
0
Eswlnk的头像
Eswlnk
一个有点倒霉的研究牲站长
赞赏
CTF系列之从入门到精通|教你如何玩转CTF
上一篇
「攻防对抗」某校园跑软件签名算法分析
下一篇

评论 (0)

请登录以参与评论
现在登录
    发表评论

猜你喜欢

  • 「漏洞资讯」CVE-2025-12914:宝塔面板曝出注入漏洞
  • 今日热点:伪Clash软件下载陷阱曝光,附防范建议
  • 「攻防对抗」利用 fastjson 原生反序列化与动态代理突破安全限制
  • 「攻防对抗」从上传漏洞到Getshell | 一次完整的渗透过程
  • 「日志记录」从零起步揭开路由器漏洞挖掘的面纱
Eswlnk的头像

Eswlnk

一个有点倒霉的研究牲站长
1108
文章
319
评论
679
获赞

随便看看

Web Hacking Playground本地渗透测试平台
2023-02-16 0:34:23
关于360最新版杀毒引擎的那些事
2021-05-04 0:42:18
体验新版本360网络空间测绘|因为看见,所以安全
2022-02-01 22:50:57

文章目录

专题展示

WordPress53

工程实践37

热门标签

360 AI API CDN java linux Nginx PDF PHP python SEO Windows WordPress 云服务器 云服务器知识 代码 免费 安全 安卓 工具 开发日志 微信 微软 手机 插件 攻防 攻防对抗 教程 日志 渗透分析 源码 漏洞 电脑 破解 系统 编程 网站优化 网络 网络安全 脚本 苹果 谷歌 软件 运维 逆向
  • 首页
  • 知识库
  • 地图
Copyright © 2023-2025 Eswlnk Blog. Designed by XiaoWu.
本站CDN由 壹盾安全 提供高防CDN安全防护服务
蜀ICP备20002650号-10
页面生成用时 0.441 秒   |  SQL查询 41 次
本站勉强运行:
友情链接: Eswlnk Blog 网站渗透 倦意博客 特资啦!个人资源分享站 祭夜博客 iBAAO壹宝头条
  • WordPress142
  • 网络安全64
  • 漏洞52
  • 软件52
  • 安全48
现在登录
  • 资源
    • 精彩视频
    • 破解专区
      • WHMCS
      • WordPress主题
      • WordPress插件
    • 其他分享
    • 极惠VPS
    • PDF资源
  • 关于我
    • 论文阅读
    • 关于本站
    • 通知
    • 左邻右舍
    • 玩物志趣
    • 日志
    • 专题
  • 热议话题
    • 游戏资讯
  • 红黑
    • 渗透分析
    • 攻防对抗
    • 代码发布
  • 自主研发
    • 知识库
    • 插件
      • ToolBox
      • HotSpot AI 热点创作
    • 区块
    • 快乐屋
    • 卡密
  • 乱步
    • 文章榜单
    • 热门标签
  • 问答中心反馈