Linux下缓冲区溢出攻击及Shellcode

4.3.2 Linux32环境下函数的返回地址

编译、链接、执行程序buffer_overflow.c,并关闭Linux的栈保护机制,参见截图:

下面用gdb调试程序:

在foo函数的入口、调用strcpy函数处和foo返回处设置断点:

 

继续运行,找到函数的返回地址:

 

buff的起始地址B到保存函数的返回地址A之间的偏移:

A-B=0xbffff29c-0xbffff280=0x1c=16+12=28

因此,如果Lbuffer的长度超过28字节,将会发生缓冲区溢出,Lbuffer中偏移28的4个字节“ABCD”将覆盖地址为0xbffff29c内存单元的值,即foo的返回地址变为“ABCD”(0x44434241)。

由于0x44434241不可访问,因此出现断错误。

 

4.3.3 Linux32环境下的Shellcode编写

编译、链接、执行shell_asm_fix_opcode.c,可以通过缓冲区溢出获得shell,参见下图:

4.4做实验并写实验报告

没有修改文件前:

 

为了找出发生溢出的原因,用gdb调试:

由于lvictim没有发生溢出,所以为了调试方便,我把老师的源代码buffer[512]改成了buffer[500],如图:

重新编译运行,发生段错误:

下面开始用gdb调试,找出smash_largebuf函数的返回地址所在的内存单元与缓冲区起始地址的距离。

先反编译smash_largebuf函数:

然后设置三个断点:

下面启动进程,得到函数的返回地址0xbffff35c:

继续执行到下一个断点,buff的开始地址在0xbffff158,存放在0xbfffed30中:

所以:

0xbffff35c-0xbffff158=0x204=516

OFF_SET=516

BUFFER_ADDRESS有一个范围,可以从0xbffff158开始设置

程序中需要改动的地方如下:

下面开始演示攻击lvictim,并获得shell,要注意关闭地址随机化:

可以看到,已经获得了shell,实验成功了。

时间: 2024-08-16 13:05:25

Linux下缓冲区溢出攻击及Shellcode的相关文章

缓冲区溢出攻击(待看)

缓冲区溢出攻击 本词条缺少信息栏.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动.缓冲区溢出是一种非常普遍.非常危险的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以导致程序运行失败.系统关机.重新启动等后果. 1简介编辑 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上.理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符.但是绝大多数程序都会

CSAPP缓冲区溢出攻击实验(下)

CSAPP缓冲区溢出攻击实验(下) 3.3 Level 2: 爆竹 实验要求 这一个Level的难度陡然提升,我们要让getbuf()返回到bang()而非test(),并且在执行bang()之前将global_value的值修改为cookie.因为全局变量与代码不在一个段中,所以我们不能让缓冲区一直溢出到.bss段(因为global_value初始化为0,所以它会被放在.bss而非.data段以节省空间)覆盖global_value的值.若修改了.bss和.text之间某些只读的段会引起操作系

Linux实验——缓冲区溢出漏洞实验

一.     实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.     实验准备 实验楼提供的是64位Ubuntu linux(系统用户名shiyanlou,密码shiyanlou),而本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备. 1.输入命令安装一些用于编译32位C程序的东

缓冲区溢出攻击-入门例子

由于工作的需要,开始学习安全领域的知识了.感觉这个领域的知识点太多,而且非常底层,缓冲区溢出攻击这个算是最容易理解的了,就先从这个开始入门吧~ 先试个最简单的例子,学习学习原理~ 本文代码和原理主要参考http://blog.csdn.net/linyt/article/details/43283331博客,大部分内容是直接抄原博客,加了一点自己测试时遇到的问题. 测试环境 Ubuntu 16.04 TLS 测试前准备 1. 关闭地址随机化功能: echo 0 > /proc/sys/kerne

使用Linux进行缓冲区溢出实验的配置记录

在基础的软件安全实验中,缓冲区溢出是一个基础而又经典的问题.最基本的缓冲区溢出即通过合理的构造输入数据,使得输入数据量超过原始缓冲区的大小,从而覆盖数据输入缓冲区之外的数据,达到诸如修改函数返回地址等目的.但随着操作系统和编译器针对缓冲区溢出问题引入防护机制,初学者想要由简入繁的学习和实践缓冲区溢出的原理变得困难.在 Linux 环境下,用户可以通过设置编译和系统环境来去除某些防护措施,从而方便的完成某些简单的缓冲区溢出实验. 1.关闭SSP( Stack Smashing Protector

缓冲区溢出以及缓冲区溢出攻击

缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量.溢出的数据覆盖在合法数据上.理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串.但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患. 操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出. 当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据.下一条指令的指针,或者是其他程序的输出内容,

缓冲区溢出攻击

缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典而又古老的话题.随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来.其中看雪的<0day安全:软件漏洞分析技术>一书将缓冲区溢出攻击的原理阐述得简洁明了.本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证.不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如MS的Visual Stu

缓冲区溢出攻击实验(另附源代码)

缓冲区溢出攻击代码如下: #include<Windows.h> #include<stdio.h> #include<string.h> void f(char *input) { char buffer[10]; strcpy(buffer,input); printf("缓冲区字符为=%s",buffer); /* // 进行防御,当输入长度过长时跳出 char buffer[10]; int b; b=strlen(input); if(b&

CSAPP缓冲区溢出攻击实验(上)

CSAPP缓冲区溢出攻击实验(上) 下载实验工具.最新的讲义在这. 网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上.只是没有关系,大体上仅仅是程序名(sendstring)或者參数名(bufbomb -t)的差异,不影响我们的实验. 1.实验工具 1.1 makecookie 后面实验中,五次"攻击"中有四次都是使你的cookie出如今它原本不存在的位置,所以我们首先要为自己产生一个cookie. 实验工具中的makecookie就是生成cookie用的.參数是你的