缓冲区溢出原理浅析以及防护

缓冲区溢出漏洞原理与实战复现:从内存布局到现代防护机制 缓冲区溢出是计算机安全领域的基础性漏洞,其本质源于程序对数据边界检查的缺失。当向固定大小的内存区域写入超量数据时,多余数据会覆盖相邻内存,从而可能篡改关键控制数据如函数返回地址。这一原理构成了众多高危漏洞的底层机制,在永恒之蓝等经典漏洞复现中常被利用。从技术价值看,理解缓冲区溢出不仅是漏洞挖掘和渗透测试的基石,也是开发人员编写健壮代码、实现有效防御的前提。在应用场景上,它常见于C/C++等内存不安全的语言编写的软件,涉及文件上传、输入处理等多个环节。本文通过栈溢出实验,详细剖析了内存布局、偏移计算和攻击载荷 阅读详情
 
【摘要】本文从程序语言本身的缺陷,不够健壮的角度出发,详细分析了缓冲溢出攻击的基本原理,描述了黑客利用缓冲区漏洞进行系统攻击的一般过程,最后又简单讨论了几种防范溢出攻击的策略.
 
【关键字】缓冲溢出; 程序跳转; 长跳转缓冲区;
 
近些年来,黑客攻击事件频繁发生,尤其是缓冲区溢出漏洞攻击占据了网络远程攻击的绝大多数. 因为这类攻击可以使任何人获得系统主机的完全控制权,所以它代表了一类十分严重的攻击.
缓冲区溢出攻击之所以常见,是因为它太常见了,且易于实现, 这完全是软件发展史上不可避免的问题. 缓冲区漏洞是程序员在编写程序时未检查内存空间,导致内存泄漏而引起,以下我们先来简单了解一下它:
 
一、认识缓冲区溢出
缓冲溢出是一种系统攻击的手段,借着在程序缓冲区编写超出其长度的代码,造成溢出,从而破坏其堆栈,使程序执行攻击者在程序地址空间中早已安排好的代码,以达到其目的. 一般黑客攻击root程序,然后执行类似exec(sh)的代码获得root的shell. 它造成了两种严重的后果:
1.     覆盖堆栈的相邻单元. 使程序执行失败, 严重可导致系统崩溃.
2.     可执行认识指令代码,最后获得系统root特级权限.
现在很多人使用C或C++编写程序,但同时太多的人忽略了对其的数组边界检查和类型安全检查,所以现今的大多数溢出都和C语言有关, C语言中中有可能产生溢出的函数有:char s[n],strlen(s),strcpy(dst, src),p=malloc(n),strcat(s,suffix)等等,所以我们要尽可能地避免使用这些危险函数,即使使用,也一定要做严格的检查.为容易理解,我们来看一个简单的程序:
 
/*
 * example.c
 * written by Devil_Angel <Devil___Angel@126.com>
 * gcc –o example example.c
                */
void func(char * str)
{
char buf[8];
strcpy(buf, str);
printf(“%sn”,buf);
}
int main(int argc, char * argv[])
{
If(argc >1)
                            Func(argv[1]);
}//end of main
 
该程序在输入时,并没有对str的大小进行检查便直接送入数组buf,一旦输入超出buf长度,就产生了最简单的溢出,当然象这样的溢出一般只会出现Segmentation fault错误,而不能达到攻击的目的. 这里并没有进一步深入分析,只是让大家对溢出有一个大概的概念,在以后将会对其做进一步的分析.
 
二、缓冲区溢出漏洞攻击方式
最常见的攻击手段是通过制造缓冲区溢出使程序运行一个用户shell,在通过shell执行其他命令. 若该程序输入root且有suid权限的话,攻击者就获得了一个有root权限的shell,此时就可以对系统进行随意操作了.下面我来介绍一下如何控制程序跳转到攻击代码:
l         打开记录(Activation Records)
在程序中,每一个函数调用发生,在堆栈中会留下一个Activation Records,它包括函数结束时返回的地址,攻击者通过溢出这些自动变量,使地址指向攻击程序代码. 通过改变程序的返回地址,当调用结束时,程序就跳到攻击者设定的地址,而不是原地址.这类溢出被称为 stacks mashing attack.
 
l         函数指针(Function Pointers)
void(*foo)(1)定义一个返回函数指针的变量foo, Function Pointers可用来定位任何地址空间. 所以只需在任何空间内的Function Pointers附近找到一个能溢出的缓冲区,然后溢出它来改变Function Pointers. 在某时刻,当程序通过Function Pointers调用函数时,程序的流程就按黑客的意图实现了(典型的溢出程序有:Linux下的Superprobe程序).
 
l         长跳转缓冲区(Longjmpbuffers)
在C语言中,包含了一个简单的检验/恢复系统,称为setjmp/longjmp.即在检验点设定setjmp(buffer),用longjmp(buffer)恢复. 但若攻击者能够进入缓冲区空间,则longjmp(buffer)实际上跳转到攻击者的程序代码. 像Function Pointers, longjmp缓冲区能指向任何地方,所以攻击者要做的就是找到一个可供溢出的buffer即可.
 
最常见的是在一个字符串中综合了代码植入和打开记录. 攻击者定位或提供溢出的自动变量,然后向程序传一个超大字符串,在引发buffer溢出改变打开记录时植入程序代码,由此达到入侵系统的目的.
 
三、应对远程缓冲区溢出攻击
对付缓冲区溢出攻击的方法不少,但常见的也是最重要有一下四种方式:
1.     编写严格的代码
编写正确严格的代码是一件有意义但非常耗时的工作, 有C程序设计或汇编语言经验的人会深有体会,尽管软件的发展经历了不短的时间了,但漏洞程序依旧存在,因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全的程序.例如高级查错工具,如faultinjection等. 这些工具的目的在于通过人为随机地产生一些缓冲区溢出来寻找代码的安全漏洞.但由于C语言的特点,这些工具不可能找出所有的缓冲区溢出漏洞. 所以,侦错技术只能用来减少缓冲区溢出漏洞,并不能完全地消除其存在. 错误的消除还是要靠程序员来编写.
 
2.     不可执行堆栈数据段
通过操作系统时数据断地址空间不可执行,从而使得攻击者不能执行被植入的攻击代码,但攻击者不一定是非要植入攻击代码来实现缓冲区溢出的攻击,所以这种方法还是存在很多弱点的.
 
3.     利用程序编译器的边界检查
植入代码是引起缓冲区溢出的一个方面,改变程序执行流程是另一方面. 而利用编译器边界检查则使得缓冲区溢出不可能实现,从而完全消除了缓冲区溢出的威胁,但相对而言代价较大.
 
4.     指针完整性检查
程序指针完整性检查和边界检查略微不同. 程序指针完整性检查在程序指针被改变之前检测.因此,即便攻击者成功改变了程序的指针,也会因先前检测到指针的改变而失效,这样虽然不能解决所有问题,但它的确阻止了大多数的缓冲区攻击,而且这种方法在性能上有很大的优势,兼容性也很好.
 
从长远来看,要想从根本上消除缓冲区溢出攻击,需要对编程模式或CPU体系的基础性修改才能解决问题. 不过,随着信息技术的飞速发展和人们对网络安全的重视程度不断加深, 缓冲区溢出攻击总会有解决的一天.
【参考文献】
[1] 黑客大曝光. [美]Joel Scambray,Stuart McClure,George Kurtz著.
[2] The Art and Science of C. [美]Eric S.Roberts,斯坦福大学著.
       [3]缓冲区溢出原理及防护. 中科院研究生院 蒋涛著.
从SQL注入到缓冲区溢出:四大经典漏洞原理、利用与防御深度解析 在软件安全领域,漏洞是程序在逻辑、协议或系统设计层面存在的缺陷,攻击者通过精心构造的输入,诱使程序行为偏离开发者预期,从而实现数据泄露、权限提升等恶意目的。其核心原理在于程序对输入或状态的信任超出了合理边界。理解漏洞原理不仅能提升渗透测试和代码审计的效率,更是构建安全防线的基石。从技术价值看,掌握漏洞分析有助于实施纵深防御体系,涵盖安全开发、编译加固、运行时防护等多个层面。在应用场景上,无论是Web应用的SQL注入、XSS,还是系统层的缓冲区溢出、文件包含,都需要从原理出发,结合具体利用手法进行针对性防护。 阅读详情

相关推荐

从缓冲区溢出到永恒之蓝:Windows经典漏洞原理与实战利用深度解析

缓冲区溢出是软件安全领域的核心漏洞类型之一,其原理源于程序对用户输入数据缺乏严格的边界检查,导致数据覆盖相邻内存区域,从而可能被攻击者利用来劫持程序控制流。理解其底层机制,如栈溢出、堆溢出以及针对返回地址的覆盖,是掌握漏洞利用技术的基础。这项技术价值在于揭示了软件安全中“输入验证”与“内存安全”的根本性挑战,是构建现代系统防御体系(如DEP、ASLR)的直接驱动力。其应用场景广泛,从早期的远程服务攻击到后期的内核级利用,贯穿了整个Windows安全攻防史。本文将以MS03-026(冲击波)和MS17-010

weixin_30480075的博客 326

缓存区溢出的原理分析和防范

缓冲区溢出(buffer-overflow)是一种非常普遍、同时非常危险的漏洞,在各种操作系统、应用软件中广泛存在。

m0_57313444的博客 5824

Codex工作原理浅析:从提示词到代码的魔法

摘要: Codex等AI代码生成工具本质上是基于概率的语言模型,而非真正的"代码编译器"。它通过统计训练数据中的常见模式生成看似合理但不保证安全的代码。开发者需警惕三个隐藏假设:1)生成的是典型而非最优方案;2)缺乏业务上下文理解;3)倾向简洁而非健壮。典型案例包括SQL注入、内存越界等安全隐患,这些漏洞因在训练数据中高频出现而被模型"学习"。建议将提示词细化如需求文档、假设所有生成代码存在安全隐患、优先生成独立片段而非完整模块,并重点检查模型遗漏的边界条件。

叫我天天吃鸡的博客 654

Linux下缓冲区溢出攻击的原理及对策

前言从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。尽管堆栈帧结构的引入为在高级语言中实现函数或过程这样的概念提供了直接的硬件支持,但是由于将函数返回地址这样的重要数据保存在程序员可见的堆栈中,因此也给系统安全带来了极大的隐患。历史上最著名的缓冲区溢出攻击可能要算是1988年11月2

1万+

CVE-2021-3177浅析

CVE-2021-3177浅析CVE-2021-3177漏洞成因PoC环境准备浮点数覆盖返回地址方法运行 这篇文档作为对CVE-2021-3177的学习记录。 CVE-2021-3177 CVE-2021-3177发布日期为2021年02月19日,内容为python的函数库_ctypes/callproc.c中存在缓冲区溢出问题,具体的函数为ctypes.c_double.from_param。最为简单的PoC如下: >>> from ctypes import * >>&gt

weixin_42421477的博客 2075

MS08-067漏洞攻防实战:从原理复现到防御体系构建

缓冲区溢出是网络安全领域的基础性漏洞类型,其原理在于程序向固定大小的内存缓冲区写入超出其容量的数据,导致相邻内存区域被覆盖。这种内存破坏漏洞的核心技术价值在于,攻击者可通过精心构造的输入数据覆盖函数返回地址或关键变量,从而劫持程序执行流程,实现任意代码执行。在应用场景上,缓冲区溢出常被用于远程渗透、权限提升等攻击环节,是红蓝对抗演练中的经典课题。本文以MS08-067这一影响广泛的SMB服务漏洞为标本,通过Metasploit框架完整复现了从信息收集、漏洞利用到后渗透的完整攻击链,并深入剖析了在终端防护与网

weixin_30312563的博客 400

缓冲区溢出攻击原理分析

本文从C/C++语言的函数帧结构出发,分析缓冲溢出攻击如果修改eip进而控制执执行shellcode。

海枫的专栏 1万+

手把手教你学Simulink——基于Simulink的轮毂电机独立驱动转矩矢量分配

阐述了轮毂电机独立驱动的核心价值与转矩分配的必要性在 Simulink 中实现了完整的“上层稳定控制 + 下层最优分配”架构对比了三种分配策略在极限工况下的性能差异提供了工程落地的关键考量特斯拉 Cybertruck(后轮双电机矢量控制)Rivian R1T(四电机坦克掉头)宝马 iX(精准牵引力控制)核心思想“以软件定义底盘,以算法驾驭动力;化四轮之独立,为整车之协同。—— 让汽车在极限边缘依然从容不迫。

MHD0815的博客 369

(原创)攻击方式学习之(3) - 缓冲区溢出(Buffer Overflow)

堆栈溢出 堆栈溢出通常是所有的缓冲区溢出中最容易进行利用的。了解堆栈溢出之前,先了解以下几个概念: 缓冲区 简单说来是一块连续的计算机内存区域,可以保存相同数据类型的多个实例。 堆栈 堆 栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性:最后一个放入堆栈中的物体总...

weixin_34212189的博客 1471

微信Dat文件转图片(文末含工具下载)

PC端微信dat图片转换为jpg格式

weixin_40704848的博客 8083

在 NVIDIA Orin (JetPack 6.0) 上配置 PyTorch 2.4 + Torchvision 0.19 的完整避坑指南

本文提供在NVIDIA Jetson Orin设备上,基于JetPack 6.0系统配置PyTorch 2.4与Torchvision 0.19环境的完整指南。通过使用Miniconda环境隔离、安装特定版本PyTorch夜间构建版、编译匹配的Torchvision源码等步骤,解决版本不匹配、CUDA支持等常见问题,确保AI开发环境稳定可用。

weixin_29179311的博客 364

stylehack总结.缓冲区溢出原理浅析以及防护.

缓冲溢出; 程序跳转; 长跳转缓冲区; 近些年来,黑客攻击事件频繁发生,尤其是缓冲区溢出漏洞攻击占据了网络远程攻击的绝大多数. 因为这类攻击可以使任何人获得系统主机的完全控制权,所以它代表了一类十分严重的攻击.缓冲区溢出攻击之所以常见,是因为它太常见了,且易于实现, 这完全是软件发展史上不可避免的问题. 缓冲区漏洞是程序员在编写程序时未检查内存空间,导致内存泄漏而引起,以下我们先来简单

stylehack blog. 518

【Cadence】Virtuoso@LayoutXL 差分电路版图同步修改

对于差分电路,器件和部分走线通常是对称的,只需要画一半,另一半通过镜像操作完成。因此,需要对差分电路进行同步的修改,保证电路的差分对称性和正确的连接关系。然而,通常版图会经过多次修改,修改的部分可能在镜像的时候被遗漏。左边画了金属块,右边也出现了同步出现了金属块。进入group会有同步复制的提示。

乾巽的博客 3049

浅析缓冲区溢出漏洞的利用与Shellcode编写

文章目录前言 前言 缓冲区是内存中存放数据的地方。在程序试图将数据放到及其内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出。缓冲区溢出就好比是将十升水放进只有五升容量的桶里。很显然,一旦容器满了,余下的部分就会溢出在地板上,弄得一团糟。缓冲区溢出漏洞是指在程序试图将数据放到及其内存中的某一个位置的时候,因为没有足够的空间就会发生缓冲区溢出的现象。 ...

道阻且长,行则将至 8900

农经权二轮延包—地块示意图生成

本文介绍了地块示意图制作软件的使用方法及模板制作要点。软件通过设置六个参数(示意图模板、属性数据、地块DBF、导航图、地块图片及存放位置)自动生成Word文档,并可导出PDF。文章详细说明了5页Word模板的制作过程,包括页脚三栏设置和页码插入技巧,支持每户最多28个地块的情况。同时指出该软件生成的图片分辨率(300dpi)满足清晰度要求,并提及软件免费提供插件但收费提供后续服务。

weixin_47364423的博客 1114

二进制部署的K8s集群,如何对到期证书更新

一年前搭建的k8s集群,突然不能够正常访问,出现502错误,首先怀疑容器没起来,先对问题进行排查,排查响应的容器有没有正常启动,状态一切正常,访问容器地址也可以正常访问,于是访问node port地址,发现无法正常访问,确定问题出现在svc中。 由于其他的应用、系统也无法提供正常的服务,应该是k8s的问题,非单个应用的原因。查看服务状态,kubectl describe svc xxx,endp...

时光旅行者 3770

浅谈缓冲区溢出

本篇文章浅析缓冲区溢出,帮助初学者快速入门

qq_35763649的博客 674

USB3.0 Type-B连接器SSTX/SSRX信号定义常见错误与硬件设计避坑指南

本文详细解析了USB3.0 Type-B连接器中SSTX/SSRX信号的定义标准与常见设计错误。针对连接器厂商图纸可能出现的信号标识错误,提供了实用的排查方法和硬件设计避坑指南,帮助工程师避免因引脚定义颠倒导致的通信降级或故障,确保USB3.0高速传输的稳定性。

gg901的博客 1266

Heap Spray原理浅析

转载自:http://blog.youkuaiyun.com/magictong/article/details/7391397 Heap Spray原理浅析 Magictong 2012/03   摘要:本文主要介绍Heap Spray的基本原理和特点、以及防范技术。 关键词:Heap Spray、溢出攻击、漏洞利用、堆溢出   Heap Spray定义

收集学习过程中对自己有帮助的牛人文章 819

第4节:cesium 0基础发布离线地图(含源码+视频)

cesium发布离线地图

qq_29384639的博客 1597

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

渗透测试-浅析WAF绕过

前言 WAF 是什么? 全称 Web Application Firewall (WEB 应用防护系统),与传统的 Firewall (防火墙) 不同,WAF 针对的是应用层。 WAF是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一种网络安全产品。WAF可以增大攻击者的攻击难度和攻击成本,但是不是100%安全的。 目前市场上的WAF主要有以下几类: 基于硬件W...

道阻且长,行则将至 4698

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CVE-2021-3156漏洞复现:从堆缓冲区溢出到Linux本地提权实战

堆缓冲区溢出是软件安全领域一种经典的内存破坏漏洞,其原理在于程序向预先分配的缓冲区写入数据时,超出了缓冲区的边界,从而覆盖了相邻的内存区域。这种漏洞的技术价值在于,攻击者可以利用溢出的数据覆盖关键的内存结构(如函数指针或返回地址),进而劫持程序的执行流程,实现任意代码执行。在Linux系统安全中,本地提权漏洞允许低权限用户获取系统最高权限(root),对服务器和云环境构成严重威胁。CVE-2021-3156(Baron Samedit)正是这样一个存在于sudo核心组件中的堆缓冲区溢出漏洞,它影响了近十年内

weixin_30673611的博客 366

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: Java编写的模拟ATM取款机程序
下一篇: 软件业里成功未必考研
wx红杉树
博客等级 码龄21年 383粉丝 296原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值