本地缓冲区溢出

article/2025/9/16 15:24:49

本地缓冲区溢出

【实验目的】

1、掌握缓冲区溢出的基本原理;
2、熟练利用jmp.egp指令实现缓冲区溢出;
3、掌握缓冲区溢出的危害及其防范手段。

【实验环境】

登录Linux靶机环境,在无root权限的情况下,通过编译运行程序,利用本地缓冲溢出,达到获取root权限的目的。
备注:使用Linux靶机作为本地环境。

【实验预备知识点】

本小节利用如下的一段程序来说明本地缓冲区溢出的工作原理:

void function (char *str)
{
char buffer [16];
strcpy (buffer,str);
}
void main( )
{
int t;
char buffer [128]for (I=0;I<127;I++)buffer [I]='A';
buffer [127]=0;
function (buffer);
print("this is a test \n");
}

这个是一个典型的存在缓冲区溢出错误的程序,在函数 function()中,将一个128字节长度的字符串复制到只有16字节长的局部缓冲区中去。在这个例子中,将128字节的字符床复制到只有16字节长的缓冲区中,必然导致16字节长的缓冲区溢出,进而覆盖栈中的返回地址,当子函数执行完毕后,不能正确返回到主程序,导致程序运行出错,系统必然会弹出一个错误的显示,显示程序运行失败。
在系统中,如果具有root权限的程序带有缓冲区溢出漏洞,那么攻击者(黑客)就可以对其进行本地缓冲区溢出攻击,当攻击成功后,攻击者就可以获得root权限了,实现了权限提升的目的。
防御策略。本缓冲区溢出攻击是针对本地系统或者运行的软件的缓冲区溢出漏洞,因此,用户对此的主要防御措施是要及时更新自己的系统,以及系统里安装的软件,将缓冲区溢出漏洞打上补丁。

【实验内容】

缓冲区溢出可以分为本地缓冲区溢出和远程缓冲区溢出。本地缓冲区溢出是指缓冲区溢出行为发生在攻击者本身使用的系统上,而攻击者采用本地缓冲区溢出进行攻击的目的主要是为了提升权限。发动本地缓冲区溢出攻击可以分为两种情况:一是远程入侵者已经成功入侵了主机,但是只有一般用户权限,能够访问的资源比较有限,要想获得更大的访问权限,一般可以通过本地缓冲区溢出攻击的方法来实现;二是某个攻击者本身是系统的一个普通账户,当该用户想非法获取更高访问权限时,也可以通过本地缓冲区溢出攻击的方法来实现。

【实验步骤】

1、在LINUX系统中打开终端,当前用户是root用户。使用su wist命令切换到普通用户wist,然后使用whoami命令查看身份。确认身份为wist,如下图1所示。
在这里插入图片描述

图 1用户为wist
2、在基于Linux内核的系统中,目前都使用内存地址随机化的机制来初始化堆栈,这将会使得猜测具体的内存地址变得十分困难,所以在本试验中,使用命令sysctl -w kernel.randomize_va_space=0来关闭内存随机化机制。(注意需要在root用户下才能关闭系统变量,并在关闭后退出root用户)如下图2所示。
在这里插入图片描述

图 2关闭内润随机机制
3、进入overflow文件夹,看到该文件夹下面有两个文件exe.c(攻击程序)和toto.c(攻击对象)。
4、将上面两个程序分别编译为可执行程序,执行命令
gcc exe.c –o exe
gcc toto.c –o toto
切换到root用户,将toto改为属主为root的setuid程序,执行命令
su
输入root密码
chown root.root toto
chmod +s toto
最后退出root用户,执行命令exit
如下图3所示
在这里插入图片描述

图 3编译exe.c和toto.c程序
5、用whoami看下当前的身份为wist,然后再执行命令./exe ./toto 0xbfffffff,会给出一个内存地址,例如为0xbxxxxxxx,该地址即为系统的漏洞所在。再执行一次该命令./exe ./toto 0xbxxxxxxx,即可破解成功。用whoami验证目前已经为root用户了。
在这里插入图片描述

图 4成功破解root权限的执行步骤

【实验思考题】

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

  2. 我们可以如何利用jmp.egp指令实现缓冲区溢出?
    答:JMP ESP在函数返回返回指令处填入在dll中搜索的 jmp esp的源码,在函数退出时将会把返回值处地址填入到EIP(即下一句要执行的指令地址)中,即程序跳到jmp esp处的地址执行该处的指令,此时ESP指向的地址也变为存储函数返回指令+4位置处的地址。
    add esp,-X
    jmp esp
    第一条指令抬高了栈指针到shellcode之前。X代表shellcode起始地址与esp的偏移。如果shellcode从缓冲区起始位置开始,那么就是buffer的地址偏移。这里不使用sub esp,X指令主要是避免X的高位字节为0的问题,很多情况下缓冲区溢出是针对字符串缓冲区的,如果出现字节0会导致缓冲区截断,从而导致溢出失败。
    第二条指令就是跳转到shellcode的起始位置继续执行。(又是jmp esp!)

  3. 如何发现系统存在缓冲区溢出时, 我们可以如何实现缓冲区溢出攻击?
    答:取得机器的控制权甚至是最高权限,利用缓冲区溢出漏洞攻击root程序,执行类似“exec(sh)”的执行代码来获得root 的shell。需要完成两个任务,就是在程序的地址空间里安排适当的代码和通过适当的初始化寄存器和存储器,让程序跳转到安排好的地址空间执行。
    1) 在程序的地址空间里安排适当的代码,通过“植入法”的方式来完成,
    2) 控制程序转移到攻击代码的形式,缓冲区溢出漏洞攻击都是在寻求改变程序的执行流程,使它跳转到攻击代码,最为基本的就是溢出一个没有检查或者其他漏洞的缓冲区,这样做就会扰乱程序的正常执行次序。

4.有什么好的方法保护缓冲区免受缓冲区溢出的攻击和影响?
答:目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响:
1)强制写正确的代码的方法;
2)通过操作系统使得缓冲区不可执行,从而阻止攻击者殖入攻击代码,这种方法有效地阻止了很多缓冲区溢出的攻击,但是攻击者并不一定要殖入攻击代码来实现缓冲区溢出的攻击,所以这种方法还是存在很多弱点的;
3)利用编译器的边界检查来实现缓冲区的保护,这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大;
4)在程序指针失效前进行完整性检查,这样虽然这种方法不能使得所有的缓冲区溢出失效,但它的确确阻止了绝大多数的缓冲区溢出攻击,而能够逃脱这种方法保护的缓冲区溢出也很难实现;

  1. 缓冲区溢出漏洞攻击方式有哪些?
    答:利用缓冲区溢出漏洞攻击root程序,大都通过执行类似“exec(sh)”的执行代码来获得root 的shell。有两种方式,就是在程序的地址空间里安排适当的代码和通过适当的初始化寄存器和存储器,让程序跳转到安排好的地址空间执行。

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

相关文章

关于缓冲区溢出(Buffer Overflow)

接触黑客的同志们经常遇到&#xff0c;使用一些扫描工具扫描的时候&#xff0c;会得到一些缓冲区溢出的漏洞&#xff0c;但是怎么利用自己是一团雾水 网上很少有相关的工具&#xff0c;也很少有相关的文章&#xff0c;下面我们就说说这个“窿西”吧 [蛋痛]文章丢失了一次&…

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

目录 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;始终离不开脱壳。…