内存溢出攻击分析(下)

[CTF-PWN]攻防世界新手村-when_did_you_born[wp] 事件起因(无语) 手残博主因在27日从根地址误删了自己两年半配置和使用的kali虚拟机。。。在一步步恢复环境配置的时候,从头到尾刷一遍题,总结思路。 题目分析 开启场景后,服务端会开启对应的端口,并在端口上部署和附件相同的ELF二进制可执行文件,我们要做的就是下载附件并在本地进行反汇编,反编译等操作分析程序漏洞,从而利用漏洞获取题目的flag。 从描述中可以看出当前程序是要进行年龄的输入操作的,有输入操作,还是在新手村,那么大概率是gets()等C函数输入漏洞,进一步猜测是普通的内存地址覆盖的题。 che 阅读详情

非堆栈攻击

前面的例子里面我们展示了如何在接管了程序的控制权后执行自己代码的方法,但是如果被攻击者阻止执行任何在堆栈上面的代码,那么这个方法将立即失效。所以现在所谓的基于“非堆栈”的方法正在被越来越多的使用。其实这个方法的原理也不新鲜,就是我们返回地址不再填充为stack上面的地址,而是直接填系统函数的地址,比如WinExec的程序段地址。剩下的问题是,如何将参数压入堆栈,刚刚好在调用系统函数的时候可用,下图展示了“非堆栈”攻击方法的stack结构:

Fig. 4 A non-stack based exploit

 

Legend:

非堆栈攻击不需要在缓冲保存任何指令,只需要把调用WinExec的参数放在堆栈即可。因为我们不能在字符串里面加NULL,所以我们就使用‘|’代替,在WinExec的命令参数里面可以使用‘|’来分隔多个命令,这样WinExec将顺序执行|分隔开的命令。使用两个’||’就保证后面的填充物不会被当作命令来执行。在填充物的后面,我们将返回地址改写到WinExec的地址。此外改写了返回地址后,我们需要保证正确的堆栈长度。由于WinExec不对第二个参数进行限制,因此,我们只需要向前覆盖第一个命令行参数字符串指针的地址即可。

要测试这个方法,我们需要稍微修改一下被攻击的程序,这个和前面那个非常类似,唯一的不同是我们需要一个更大的缓冲空间(后面解释原因),我们把这个程序编译为victim2.exe,代码如下:

Listing 5 – A victim of a non-stack based exploit attack

#include

#define BUF_LEN 1024

void main(int argc, char **argv)

{

char buf[BUF_LEN];

if (argv > 1)

{

printf(„/nBuffer length: %d/nParameter length: %d”, BUF_LEN, strlen(argv[1]) );

strcpy(buf, argv[1]);

}

}

To exploit this program we need a piece given in Listing 6.

Listing 6 – Exploit of the program victim2.exe

#include

char* code = "victim2.exe /"cmd /c calc||AAAAA...AAAAA/xaf/xa7/xe9/x77/x90/x90/x90/x90/xe8/xfa/x12/"";

void main()

{

WinExec( code, 0 );

}

为了简化,我们忽略了部分的“AAAA”,程序中的字符串长度需要控制在1011.

当WinExec函数返回的时候,程序跳转到我们替换的返回地址,然后会返回一个调用错误,不过那时候我们的命令已经被执行了。

有不少人会问,我们的“恶意代码”只有区区十几个字节,为啥要1K那么大的缓冲呢?为啥要填充那么多字节呢?其实原因前面也提到过,当函数返回的时候,堆栈的地址会回到返回地址的地方,后面调用开始转向执行返回地址的函数(WinExec函数)代码,在这个函数里面会先分配部分局部变量,这些局部变量需要压入堆栈,而正好刚刚我们改写的堆栈内容在函数返回后已经被认为是空闲的空间,会被那些局部变量改写。事实上,根据调试,程序开始的时候的WinExec函数会占用84字节的堆栈空间,在这个函数里面调用的别的子函数也会增加堆栈的大小,我们必须保证刚刚写入的那个命令行不会被冲掉,下图形象的展示了堆栈的内容结构:

Fig. 5 A sample non-stack based exploit: stack usage

 

联想:

这是另外的一个解决方法,它的优点是很容易编译,没有什么shellcode,而且还对监控不允许执行堆栈上面的非法代码的防御免疫!

System function calling

我们注意到,前面的方法预先获得了系统函数在内存中(程序段的)地址,这样的方法决定了我们的程序无法在各种Windows平台上面移植。为什么呢?因为各种Windows OS使用不同的user和kernel地址,因此kernel基地址在不同的系统上面不同,下图是地址系统对照表:

Table 1. Kernel addresses vs. OS environment

Windows Platform

Kernel Base Address

Win95

0xBFF70000

Win98

0xBFF70000

WinME

0xBFF60000

WinNT (Service Pack 4 and 5)

0x77F00000

Win2000

0x77F00000

你可以在不同的系统(Windows NT/2000/XP)上面执行我们的代码来验证这一点。

有没有什么解决方法呢?关键点是增加一些代码,动态获得函数的地址。幸运的是有两个系统函数可以帮助我们完成这个目标,他们是GetProcAddress 和LoadLibraryA。更多的细节请参考Harmony开发的Kungfoo项目[6]。

其它的获取缓冲开始地址的方法

所有之前的方法,我们都是基于Debugger去查找堆栈缓冲地址的起始位置的,而且我们需要非常精确的定位到这个地址。一般来说,这个并不是必须的。假如我们的修改后的返回地址计算的位置没有正好落在我们要执行的shellcode位置,但是落在了我们填充的NOP指令的话,那么会返回NOP,然后又一个一个的跳转,直到我们设定的返回代码被执行为止。换句话来说,如果我们用0x90填充直到代码开始,我们猜到正确的返回地址的概率将大大增加,如下图所示:

Fig. 6 Using NOPs during an overflow attack

 

联想:

0x90对应于NOP指令什么都不做,只是顺序的向下执行,直到我们的shellcode被执行。这个小技巧就避免了需要精确查找缓冲开始地址的麻烦。(译者注:但是对于第二个方法,如果目标程序阻止在堆栈里面执行代码的话,是否也会组织NOP的执行?如果这样,第二个方法就不能使用这个技巧了。)

危险存在在哪里?

糟糕的程序和存在缺陷的软件当然是存在这种风险。一般来说,对于那些处理文本字符串的函数,如果依赖于NULL结尾来判定字符串长度的话就存在一定的风险。比如标准的C/C++库函数strcpy(), strcat(), sprintf(), gets(), scanf()等都存在这个危险。如果他们的目标是一个固定尺寸的stack变量,内存溢出就有可能在他们接收用户输入的时候发生。

另外一个比较普通的情况是,通过一个循环反复的从一个文件读取内容,依靠某个特定的字符来退出循环,这种情况和上面的字符串函数一样危险。

阻止内存溢出攻击

最直接有效的方法就是使用安全的代码。在市场上,有好几款商业的和免费的解决方案能有效的防止大部分的内存溢出工具,以下两个方法比较普遍:

- 基于安全库的方法,他们重新实现了哪些不安全的函数,这些函数不会内存溢出,一个典型的例子是Libsafe项目。(译者注:VS2008的运行库提供了安全的函数,并且对使用不安全函数的程序会提出警告!)

- 另外的一个方法也是基于库的,不过这个库检测并阻止在堆栈上面执行非法的代码。如果程序被攻击,程序会发出警告,在SecureStack开发的SecureWave就是基于这个原理。

另外一个解决的技术是使用编译时运行边界检查,该技术最近被提出来并拥有非常好的前景。内存溢出问题始终是系统管理员头疼的问题之一,不管怎么说,好的编程始终是阻止安全漏洞的最好方法!

总结

当然,还有很多有趣的内存溢出问题没有在这里讨论,我们的目的是演示一下基本的概念和解决基本的问题。我们希望这个文章能够通过让程序员更清楚的理解内存溢出威胁的原因,从而更好的改进软件开发的过程,最终给我们提供更安全的软件。

引用

下面这些链接只是众多的相关文章中的一小部分:

[1] Aleph One, Smashing The Stack For Fun and Profit, Phrack Magazine nr 49, http://www.phrack.org/show.php?p=49&a=14
[2] P. Fayolle, V. Glaume, A Buffer Overflow Study, Attacks & Defenses, http://www.enseirb.fr/~glaume/indexen.html
[3] I. Simon, A Comparative Analysis of Methods of Defense against Buffer Overflow Attacks, http://www.mcs.csuhayward.edu/~simon/security/boflo.html
[4] Bulba and Kil3r, Bypassing StackGuard and Stackshield, Phrack Magazine 56 No 5, http://phrack.infonexus.com/search.phtml?view&article=p56-5
[5] many interesting papers on Buffer Overflow and not only: http://www.nextgenss.com/research.html#papers
[6] http://harmony.haxors.com/kungfoo
[7] http://www.research.avayalabs.com/project/libsafe/
[8] http://www.securewave.com/products/securestack/secure_stack.html

 

该文章翻译自: http://www.windowsecurity.com/articles/Analysis_of_Buffer_Overflow_Attacks.html
作者: Maciej Ogorkiewicz & Piotr Frej
翻译:陈伟
转载请注明!

ESP32、MicroPython、天问ASR-PRO,串口发送数据并播报 天问ASRPRO语音芯片内置脑神经网络处理器,支持DNN、TDNN、RNN等神经网络及卷积运算硬件运算,非软件运算,支持语音识别、声纹识别、语音增强、语音检测、单麦克风降噪增强、单麦克风回声消除、360度全方位拾音等功能。ASR-PRO可以图形化编程,降低开发难度,对小白友好。之前使用ASRPRO与ESP32进行过语音控制,这次由于一个项目需要对ESP处理过后的数据进行播报,就想到利用该模块。以下程序主要为测试代码,并非实际项目,仅供参考学习(若有错误,欢迎指正)。二者通过串口通信,波特率为9600。 阅读详情

相关推荐

【论文阅读】2021-(Pidinet)Pixel Difference Networks for Efficient Edge Detection

文章目录摘要1. Introduction 摘要 motivations: 基于CNN的边缘检测的高性能是通过一个大的预训练CNN主干来实现的,该主干占用大量内存和能量。传统边缘检测器(如Canny、Sobel和LBP)很少被研究。 contributions: 提出了一种简单、轻量级但有效的架构,称为像素差分网络(PiDiNet),用于有效的边缘检测。PiDiNet采用了新颖的像素差卷积,将传统的边缘检测算子集成到现代CNN中流行的卷积运算中,以增强任务性能。 experiments: 在BSDS500

轻舟的万重重山 1万+

缓冲区溢出攻击实验(一)

本周心情异常不好。无聊之余,想弄一下缓冲区溢出实验,之前一直听说这个,也没有亲自动手 做一下,发现真正弄起来的时候还是没那么简单的,其实学到的东西还是不少的。特此记下学习的过程。 一、基础知识 这一部分主要是关于程序内存布局相关的知识,也涉及少量at&t汇编、gdb调试、gcc编译的知识。再次说明本人 非科班出生,所以在有些问题上要比科班出身的要纠结得多,但职业生涯还长,只要

Venscor技术养成之路 1万+

AI 编程新范式:一文彻底搞懂 LLM、Agent、MCP、Skill 是怎么协作的

本文用通俗易懂的方式解析了AI编程新架构的核心概念。通过"三国演义"类比,文章将复杂的技术架构拆解为:Agent(军师/大脑)负责思考和决策,Skill(招式/手脚)执行具体操作,MCP(令箭/协议)作为通信标准,MCP Server(将军/身体)承载多个Skill。这套分工架构使AI从单纯聊天进化成能完成实际编程任务的全能助手,实现了关注点分离——Agent专注智能提升,Skill专注功能实现,MCP确保稳定连接。这正是Cursor、Claude等新一代AI开发工具采用的核心架构,标志

猫老板的豆 3077

二进制漏洞:从简单栈溢出到写自己编写shellcode

0x00 简介 本次主要记录缓冲器溢出的:原理、实现和shellcode的编写 详细的去理解原理,和底层开始写shellcode 本次实验的C代码 #include <stdio.h> #include <windows.h> #define PASSWORD "1234567" int verify_password (char *password) { int authenticated; char buffer[44]; authenticated=strcmp(pass

god_Zeo的安全博客 1229

概率论与数理统计基础概念与重要定义汇总

文章目录一、随机事件和概率1:互斥,对立,独立事件的定义和性质。2:概率,条件概率和五大概率公式3:古典型,几何型概率和伯努利试验 一、随机事件和概率 1:互斥,对立,独立事件的定义和性质。 互斥事件\color{red}\textbf{互斥事件}互斥事件 事件A和B的交集为空,A与B就是互斥事件,也叫互不相容事件。也可叙述为:不可能同时发生的事件。如A∩B为不可能事件(A∩B=Φ),那么称事件A与事件B互斥,其含义是:事件A与事件B在任何一次试验中不会同时发生。 则P(A+B)=P(A)+P(B)(这个公

csyifanZhang的博客 1万+

PINN内嵌物理知识神经网络入门及文献总结

内嵌物理知识深度学习方法(PINN)已经成功用于解决各类科学计算问题,其本质是将物理先验知识嵌入神经网络训练中,将一个求解PDE的问题转化为一个优化问题。这篇博客主要记录PINN相关论文

山里娃的博客 7万+

内存溢出攻击分析

什么是内存溢出?简单的说,内存溢出就是程序向内存写入了比分配更多的空间更多的内容。攻击者据此控制程序执行的路径,冒名执行它的代码。对那些好奇这一切都是如何发生的人,本文试图详细介绍攻击的实现机制并提出一些预防措施。 从我们知道的经验来看,大多都听说过这些攻击,但是很少几个真的理解攻击的具体机制,有些人有些模糊的印象,甚至有些人根本不知道越界攻击是什么。还有些人认为这个属于秘密的智慧和技能只有少数

LEAKERS_ZZW的专栏 1万+

iStoreOS路由器(openwrt软路由) AdGuard Home 客户端 IP 总是 localhost(127.0.0.1)?这样设置让你精准识别真实IP!

在iStoreOS等软路由上部署AdGuard Home时,客户端IP常显示为localhost(127.0.0.1)。本文详细介绍如何让adguardhome直接识别客户端真实IP🌐,帮助你实现网络流量的精准追踪和管理。🔍

XiaoqiangClub的博客 2253

栈溢出攻击和shellcode

README 本文默认读者熟悉C语言编程和x86汇编语法,熟悉函数调用过程和调用规约,简单了解linux系统,包括进程内存布局,系统调用和内核内存管理机制,对栈溢出攻击有基本认知。 文章会做一个栈溢出攻击的DEMO,来展示一个典型的shellcode是如何打造,如何工作的。 文章将抛开宏观层面的解释,尽量细致地阐述shellcode的构建过程和异常问题分析等诸多细节,帮助读者把栈溢出攻击和s...

LittleEmperor 6642

rv1126如何切换720p和1080p

切换720p和1080p可以使用modetest,但是需要将这两种模式都添加到connector中去 添加一个新的mode到connector中去,其实内核中已经有相关接口了,需要做一些小改动。 1.不采用设备树的方式去配置,将720p和1080p的timing参数配置放在数组中。 2.这里的printer和设备树中的.compatible = "printer"一致。 3.将其添加到connector中去 static int panel_simple_get_fixed_modes(struct

weixin_42097108的博客 864

动力学约束下的运动规划算法——Kinodynamic RRT*算法

动力学约束下的运动规划算法——Kinodynamic RRT*算法

慕羽★的博客 6749

内存溢出攻击

综述 计算机组成上的实验内容 最近考试太多了,所以没时间详细讲解。暂时先留坑。 过程 计算机组成实验 反汇编——内存溢出攻击 [说明] 首先要说明的是小段模式:也即 比如要输入 01 02 03 04 你的16进制输入应该为04 03 02 01 查看touch1的地址
 栈pop的时候去的是上面这两个 一个是取到r7中 一个取到pc中 未特别处理前: 66...

FrankDura的博客 1150

嵌入式铁头山羊stm32:一文总结

本文是一篇STM32嵌入式开发的综合知识总结,涵盖了STM32基础概念、GPIO、通信协议、外设驱动等核心内容。文章首先介绍了STM32的基本概念和型号含义,然后详细讲解了GPIO的8种工作模式及实验案例。接着重点阐述了USART、I2C、SPI三种通信协议的原理和实现方法,包括硬件连接、编程接口和实验应用。此外还介绍了OLED显示原理、中断系统、定时器、ADC转换等关键技术,每个模块都配有对应的实验案例和代码实现参考。文章内容全面系统,既包含理论知识,又提供实践指导,适合作为STM32开发的快速参考手册。

古泽汉书的博客 2785

内存溢出攻击分析(上)

内存溢出攻击分析什么是内存溢出?简单的说,内存溢出就是程序向内存写入了比分配更多的空间更多的内容。攻击者据此控制程序执行的路径,冒名执行它的代码。对那些好奇这一切都是如何发生的人,本文试图详细介绍攻击的实现机制并提出一些预防措施。从我们知道的经验来看,大多都听说过这些攻击,但是很少几个真的理解攻击的具体机制,有些人有些模糊的印象,甚至有些人根本不知道越界攻击是什么。还有些人认为这个属于秘密

2466

IEM模型,地表粗糙度模拟

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【专项测试】【内存溢出】篡改报文导致内存溢出问题复盘

Java专项测试之内存溢出

weixin_45589713的博客 342

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

网络设备被异常报文攻击实例浅析

本案例主要分析网络设备OLT被异常报文攻击/内存溢出,导致OLT出现脱管情况,脱管后主控盘挂死,无法登录OLT的命令行管理系统,严重会伴有用户偶发断网等故障现象。LineTerminal)设备是互联网中常用的宽带用户接入(光电一体)网络设备,它不仅具备L2交换机或L3路由交换机功能,还具备对用户端设备ONU的控制、管理等功能。某OLT不定期每隔约1周左右就会出现脱管情况,脱管后主控盘挂死,无法登录OLT的命令行管理模式,但是现场连接串口后有无关信息打印。每次拔插主控盘进行主备倒换或重启可恢复正常。

qq_44005305的博客 1540

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c++基础知识(2)

内存溢出:内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于计算机能提供的最大内存。在windows系统中,一般提供的栈的大小是1M或者2M 导致内存溢出问题的原因有很多,比如: (1) 使用非类型安全的语言如 C/C++ 等。 (2) 以不可靠的方式存取或者复制内存缓冲区。 (3) 编译器设置的内存缓冲区太靠近关键数据结构。 下面来分析这些

ch15717502064的博客 498

struts2 漏洞 和 缓存攻击

  本文首先发表在我的独立博客站点: 码蜂笔记     http://coderbee.net/index.php/java/20130719/304   本文主要讲我对漏洞的探索和探索过程中发现的一个可以进行缓存攻击的坑。   问题 struts2 的漏洞在网上已经够热闹了,各个技术站点都是头条显示,微博上也有大佬转发。   这个漏洞的危害行在于允许执行远程命令,直接攻击...

Liuwenhao866595的专栏 329

IE7 0Day 漏洞分析及防御原理(图)

 IE7 0Day 漏洞分析   自2008年12月10日曝出IE7 0DAY漏洞以来,网页挂马网站迅速增多,受影响用户人数已达百万,而且有继续增多的趋势,一些地下组织开始公然贩卖漏洞服务,对该漏洞微软至今还未公布相关补丁,据了解,微软IE 7 0day漏洞是一个基于IE7浏览器内核的漏洞,所有基于IE7内核的浏览器如傲游、腾讯TT都会成为攻击对象,而且一些内置了IE内核的杀毒软件、应用软件如Of

clubsondy的专栏 963

一种新的Heap区溢出技术分析[转贴]

一种新的Heap区溢出技术分析[转贴]---http://www.linuxsir.org/bbs/thread50097.html 作者:warning3 < maito:warning3@nsfocus.com > 主页:http://www.nsfocus.com 日期:2001-3-09 原文出处:http://www.nsfocus.ne...

weixin_30819163的博客 208

SVGKit安全性分析:防范SVG图像中的潜在风险

SVGKit作为iOS和macOS平台上优秀的SVG渲染框架,在提供强大矢量图形处理能力的同时,也面临着诸多安全挑战。本文将深入分析SVG图像在使用SVGKit时可能存在的安全风险,并提供实用的防范策略。 ## 🔍 SVG图像安全威胁概览 SVG(可缩放矢量图形)格式虽然具有诸多优势,但其复杂性也为恶意攻击者提供了可乘之机。SVG文件不仅包含图形数据,还可能嵌入JavaScript代码、外部

gitblog_00326的博客 1009

springboot项目中获取所有requestmapping的url路径

目前项目上线之后因为他人恶意请求项目导致项目内存溢出报如下错误 2019/06/26-02:42 [http-bio-19000-exec-273] ERROR org.springframework.boot.web.support.ErrorPageFilter- Forwarding to error page from request [error/n/n/n] due to except...

优快云_MrWang的博客 1万+
上一篇: 内存溢出攻击分析(上)
下一篇: sscanf支持正则表达式
oeichenwei
博客等级 码龄23年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值