关于缓冲区溢出(Buffer Overflow)

article/2025/9/17 5:21:27

接触黑客的同志们经常遇到,使用一些扫描工具扫描的时候,会得到一些缓冲区溢出的漏洞,但是怎么利用自己是一团雾水

网上很少有相关的工具,也很少有相关的文章,下面我们就说说这个“窿西”吧

 [蛋痛]文章丢失了一次,CSDN需要改进暂存机制

 

用VB的便宜不太明白“缓冲区”,当然这一点对熟悉API的朋友有一定改善,缓冲区就是一段内存,通俗这么讲吧。

我们给局部变量或者全局变量赋值时,变量的内存大小不可能是无限的,也很难做到自动适应(否则执行效率会很慢),当

赋值的数据大小超过变量的内存大小时,就会造成溢出,这歌溢出经常看到的描述是:不可意料的结果。

 

我们通过VC6编写一个简单的程序,来说明这个不可意料的结果吧。

// buffer overflow code by cto@renshenguo.com
#include <windows.h>
#include <stdio.h>
void fnHack()	//the host never expect to run this
{	printf("Your computer has been hacked!\n");	//example for hack action
exit(0);	//exit process
}
int main()
{	int var[4] = {NULL};
var[5] = (int)fnHack;
printf("the host is running in normal way.\n");
return 0;
}


简单吧!有人吐了,这个不就比我在学校时候的那个“helloworld”差不多嘛。不错,你可以这么理解。

在这里我们没有给main函数声明参数如 main(int argc, char **args),但是在WIN32运行时,仍然是传递这些参数的,在VC

下的DASM看不到这些,我们用OllyIce查看其编译后运行的反汇编代码:

函数的调用一般按照这样的方式:返回地址入栈,被调函数入栈,被调函数返回地址入栈,相关参数入栈……

可以看到程序有两个函数,当然这是Debug,OllyIce能够识别相关的源代码文件,如果是发布的Release版本,可能只看到地址

跳转执行,到后面“后进先出”依次出栈,返回原来地址继续执行……

那么,我们看一下,按照C/C++编译后的代码:(因为博客主要不再面向新手,怎么做我就不说了)

注意选中的那一行,本来main函数的返回地址入栈,再到我们声明的4个32位整型变量,其内存范围是【ebp】到【ebp-0x10】

注意堆栈的栈底是高地址,这个可以参考相关的说明,我对汇编代码注释一下,如图:

10:   int main()
11:   {   int var[4] = {NULL};
00401070   push        ebp				;基址指针ebp入栈,寄存器入栈主要是暂存其内容
00401071   mov         ebp,esp				;堆栈指针esp传至基址指针ebp
00401073   sub         esp,50h				;堆栈指针减少0x50,也就是初始化堆栈大小800字节
00401076   push        ebx				;基地址寄存器ebx入栈
00401077   push        esi				;源变址寄存器esi入栈
00401078   push        edi				;目的变址寄存器edi入栈
00401079   lea         edi,[ebp-50h]			;传送[ebp-0x50]偏移的32位内存值到目的变址edi
0040107C   mov         ecx,14h				;将0x14传送到计数寄存器ecx
00401081   mov         eax,0CCCCCCCCh			;将0xCCCCCCCC传送到累加器eax,VC初始化变量
00401086   rep stos    dword ptr [edi]			;填充[edi]指向的内存,串操作
00401088   mov         dword ptr [ebp-10h],0		;初始化[ebp-0x10]的值为0,“高高低低”,var[3] = NULL
0040108F   xor         eax,eax				;eax与自身异或运算,其实就是累加器eax清零
00401091   mov         dword ptr [ebp-0Ch],eax		;初始化[ebp-0x0C]的值为0,var[2] = NULL
00401094   mov         dword ptr [ebp-8],eax		;初始化[ebp-0x08]的值为0,var[1] = NULL
00401097   mov         dword ptr [ebp-4],eax		;初始化[ebp-0x04]的值为0,var[0] = NULL,内容涵盖到ebp,共4字节
12:       var[5] = (int)fnHack;				;注意下面这条,它将fnHack函数地址覆盖main函数返回地址
0040109A   mov         dword ptr [ebp+4],offset @ILT+5(fnHack) (0040100a)
13:       printf("the host is running in normal way.\n");
004010A1   push        offset string "the host is running in normal wa"... (00420044)
004010A6   call        printf (004012b0)
004010AB   add         esp,4
14:       return 0;
004010AE   xor         eax,eax
15:   }

执行到完毕的汇编代码如图

当函数执行到返回后总会调用__chkesp检查堆栈指针,其代码贴出来可以研究,不过跟我们关系不大

__chkesp:
00401330   jne         __chkesp+3 (00401333)
00401332   ret
00401333   push        ebp
00401334   mov         ebp,esp
00401336   sub         esp,0
00401339   push        eax
0040133A   push        edx
0040133B   push        ebx
0040133C   push        esi
0040133D   push        edi
0040133E   push        offset string "The value of ESP was not properl"... (004200a0)
00401343   push        offset string "" (0042009c)
00401348   push        2Ah
0040134A   push        offset string "i386\\chkesp.c" (0042008c)
0040134F   push        1
00401351   call        _CrtDbgReport (004046b0)
00401356   add         esp,14h
00401359   cmp         eax,1
0040135C   jne         __chkesp+2Fh (0040135f)
0040135E   int         3
0040135F   pop         edi
00401360   pop         esi
00401361   pop         ebx
00401362   pop         edx
00401363   pop         eax
00401364   mov         esp,ebp
00401366   pop         ebp
00401367   ret
00401368   int         3

后面它将跳到fnHack函数的地址,而不是main函数的调用处执行fnHack函数,执行结果如图:

这就是缓冲区溢出造成所谓的不可预料的结果,所带来的执行任意代码……

 

一般来说,黑客才回造成这样的结果,而本地溢出没有什么特别大的入侵意义,而远程溢出则还要学习shellcode方面的东西,这个以后再说吧

缓冲区溢出离我们其实并不远,往往我们看到的更多的情况是这样:

很多软件即使全面测试无数次,在特定的条件下,也会造成溢出,不测试的就更多了……

但是这种溢出不是人为的,也就是说溢出后执行的代码是不确定的,最后往往造成内存访问冲突而被操作系统终止。

 

好了,就说这么多吧!


http://chatgpt.dhexx.cn/article/bKtmf4Xl.shtml

相关文章

高并发缓存队列防止溢出解决方案

目录 1 背景介绍1.1 设计分析微信抢红包1.2 红包定时导入缓存队列 2 队列术限流2.1 高并发场景分析2.2 队列削峰实战 3 设计原则3.1 动静分离3.2 微服务化3.3 负载均衡3.4 异步消息3.5 缓存预热 4 Nginx通过LUA脚本访问RabbitMQ消息队列 1 背景介绍 并发量非常大的系统&#x…

【2021.12.12】缓冲区溢出利用

文章目录 1.1 实验环境和开发工具1.2 任务描述1.3 分析过程1.4 结论1.4.1 利用漏洞1.4.2 修复漏洞 1.1 实验环境和开发工具 处理器 i5-8300H 内存&#xff08;RAM&#xff09; 8G 硬盘 476G 软件环境&#xff1a; Windows 10 开发工具: Visual studio 2019 IDA PRO7.5 1.2 …

本地缓冲区溢出分析

栈溢出是缓冲区溢出中最为常见的一种攻击手法&#xff0c;其原理是&#xff0c;程序在运行时栈地址是由操作系统来负责维护的&#xff0c;在我们调用函数时&#xff0c;程序会将当前函数的下一条指令的地址压入栈中&#xff0c;而函数执行完毕后&#xff0c;则会通过ret指令从栈…

关于缓冲区溢出的对策

从编译器的角度出发 以下两种方法均是编译器采取的关于缓冲区溢出的对策 Stackshield 主要思想是在函数调用之前&#xff0c;将return address的副本保存在一个安全的地方&#xff0c;函数返回时将返回地址与预先保存的返回地址比较&#xff0c;以判断缓冲区溢出是否发生。 …

浅析缓冲区溢出

最近一直在学习缓冲区溢出漏洞的攻击&#xff0c;但是关于这一块的内容还是需要很多相关知识的基础&#xff0c;例如编程语言及反汇编工具使用。所以研究透彻还需要不少的时间&#xff0c;这里简单的做一个学习的总结&#xff0c;通过具体的实验案例对缓冲区溢出进行简要的解析…

缓冲区溢出原理详解

下面将有实例引入缓冲区溢出的介绍&#xff1a; void main() { int i0; int a[]{1,2,3,4,5,6,7,8,9,10}; for(i0;i<10;i) { a[i]0;printf("Hello World!\n");} } 首先&#xff0c;这段代码会出现死循环&#xff0c;为什么&#xff1f;因为数组溢出了&…

C语言 缓存区溢出 3221225725

目录 问题描述解决办法&#xff1a; 问题描述 DEV-C报错 Process exited after 4.03 seconds with return value 3221225725 原因 数组定义的容量太大 - 五十万起步的样子 而且每次循环都会再定义一次&#xff0c;导致缓存区溢出 解决办法&#xff1a; 思路来源&#xff1a…

什么是缓冲区溢出?有什么危害?原因是什么?

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量&#xff0c;溢出的数据覆盖在合法数据上。 危害有以下两点&#xff1a; 1、程序崩溃&#xff0c;导致拒绝服务 2、跳转并且执行一段恶意代码 原因&#xff1a;造成缓冲区溢出的主要原因是程序中没有仔细检查用…

什么是缓冲区溢出?有说明危害?

缓存溢出 缓存溢出(Buffer overflow) &#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满-一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以…

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

1.前言 缓冲区溢出(buffer-overflow)是一种非常普遍、同时非常危险的漏洞&#xff0c;在各种操作系统、应用软件中广泛存在。缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击&#xff0c;轻则可以导致程序失败、系统关机等&#xff0c;重则可以利用它执行非授权指令&#xff0…

缓存溢出

缓存溢出&#xff08;Buffer overflow&#xff09;&#xff0c;是指在存在缓存溢出安全漏洞的计算机中&#xff0c;攻击者可以用超出常规长度的字符数来填满一个域&#xff0c;通常是内存区地址。在某些情况下&#xff0c;这些过量的字符能够作为“可执行”代码来运行。从而使得…

逆向基础:软件手动脱壳技术入门

前言&#xff1a; 大家好&#xff0c;我是周杰伦 这里整合了一下之前自己学习软件手工脱壳的一些笔记和脱文&#xff0c;希望能给新学软件逆向和脱壳的童鞋们一点帮助。 1 一些概念 1.1 加壳 加壳的全称应该是可执行程序资源压缩&#xff0c;是保护文件的常用手段。加壳过…

iOS逆向之脱壳工具creakerXI+,最简单、最适合新手的脱壳工具

在学习iOS逆向中&#xff0c;脱壳是必备技能之一&#xff0c;在网上看教程有使用 Clutch 和 dumpdecrypted 但是&#xff0c;不知道 是我操作问题&#xff0c;还是手机版本&#xff0c;以及APP版本更新问题 尝试了几次&#xff0c;都无法成功脱壳 最后在网上看到有大神分享其…

【How2RE】 UPX壳及脱壳方式

0x00 什么是壳 壳是另外在PE文件中包含的代码&#xff0c;并且不影响PE文件正常的执行。而壳也分为很多种&#xff0c;这里从UPX壳开始介绍。 0x01 压缩壳 压缩的分类 压缩的目的就是将体积大的可执行文件缩小的过程。分为损失压缩和非损失压缩两种。损失压缩是指不能100%还…

脱壳(中) 脱壳的方法

那些年我们一起脱过的衣裳&#xff0d;脱壳(中) 珈蓝夜宇 2015/10/29 10:42 0x01 我能在万花从中脱去壳的衣裳!&#xff08;续&#xff09; 3.3ESP定律法 3.3.1ESP定律介绍 ESP定律法是脱壳的利器&#xff0c;是国外友人发现的。有了ESP定律&#xff0c;可以方便我们脱掉大多…

脱壳简单总结

title: 脱壳 date: 2021-07-05 14:37:06 tags: RE 脱壳 1.概述&#xff1a; 1.壳&#xff1a; 一&#xff1a;加壳的目的&#xff1a;为了隐藏程序真正的OEP&#xff08;入口点&#xff09;&#xff0c;防止被破解。 二&#xff1a;加壳软件是一种在编译好可执行文件之后&…

最新乐加固脱壳详细教程(有图有真相)

一、前言声明&#xff1a; 本次破解是基于Xposed Installer框架&#xff0c;具体使用方法请上网查询。假设你已经安装好框架&#xff0c;按照下面的步骤&#xff0c;实现乐加固加固脱壳修复DEX&#xff0c;并且重打包运行。本次选择脱壳的APP是小猿搜题&#xff0c;特此声明&a…

脱壳之简单加密壳

一、简单分析与解密 脱壳最重要的三步&#xff1a;找原始OEP&#xff0c;转存文件&#xff0c;修复文件   压缩壳按照这三步就可以完成脱壳&#xff0c;而加密壳因为对PE文件的信息进行了加密处理&#xff0c;找到OEP只是刚开始&#xff0c;还需要将加密之后的代码、数据进行…

iOS完美脱壳

iOS端IPA脱壳 背景&#xff1a;在软件安全领域中&#xff0c;我们与黑产做对抗时&#xff0c;不是被动防守&#xff0c;自己也可以做攻击方&#xff0c;来验证我方软件是否安全。 关于iOS端逆向分析如&#xff1a;虚拟定位、虚拟设备、修改内存等&#xff0c;始终离不开脱壳。…

脱壳工具:Youpk的使用详解

一. Youpk概述 Youpk基于ART的主动调用的脱壳机&#xff0c;主要针对dex整体加固和各式各样的dex抽取加固。 目前 Youpk 只支持 pixel 1代。所以必须需要 pixel 1代手机&#xff0c;而且需要刷入对应的系统。 Youpk可以处理大部分的加固&#xff0c;一些企业版的加固也能处理…