首页 > 其他分享 >缓冲区溢出实验

缓冲区溢出实验

时间:2024-10-30 16:45:09浏览次数:1  
标签:py ret 实验 offset 缓冲区 服务器 shellcode 溢出

 

 

 

作业题目

本实验的学习目标是让学生将从课堂上学到的有关缓冲区溢出漏洞的知识进行实践,从而获得有关该漏洞的第一手经验。缓冲区溢出是指程序试图将数据写入预先分配的固定长度缓冲区边界之外的情况。恶意用户可利用此漏洞改变程序的流控制,甚至执行任意代码。此漏洞是由于数据存储(如缓冲区)和控件存储(如返回地址)的混合造成的:数据部分的溢出会影响程序的控制流,因为溢出会改变返回地址。

本实验将提供四台不同的服务器,每台服务器运行一个带有缓冲区溢出漏洞的程序。实验任务是开发一个利用漏洞的程序,并最终获得这些服务器上的root权限。除了进行这些攻击实验之外,还将试验几种针对缓冲区溢出攻击的对策。学生需要评估这些计划是否有效,并解释原因。

实验步骤及结果

Task 1: Get Familiar with the Shellcode

Please modify the shellcode, so you can use it to delete a file. Please include your modified the shellcode in the lab report, as well as your screenshots.(以shellcode_32.py为例)

A)执行以下命令,测试题目给的代码:

task1.0task1.1

可以完成。

B)创建一个文件test.txt

task1.2

修改shellcode_32.py:

捕获

重复A)中执行的命令:

task1.3

成功实现删除文件。

Task 2: Level-1 Attack

  1. 搭建实验环境

执行以下命令,运行四台服务器:

task2.0task2.1task2.2

关闭随机地址:

task2.5

两次运行,地址未改变(关闭成功):

task2.3

task2.4

  1. 分析exploit.py

fx1

生成一个全由NOP组成的517个bytes的content。

  • NOP:空转,不进行任何操作。
  • 517:对应stack.c中的从stdin(标准输入,通常是键盘)读取517个字符。

通过修改shellcode的值,在exploit.py中填入需要执行的shellcode代码,

fx2.1

并通过修改start的值,将全是NOP的content中的部分替换为shellcode。

fx2.2

将content中从offset开始到offset后面4个byte的值替换为ret生成的地址:

fx3

所以,ret值要修改为shellcode执行“入口”的地址,offset值要修改为函数栈中偏移地址的值。

f38b10afb362451392f23b518ef73f94

所以,ret = ebp + 8,offset = ebp - buffer’s address + 4

fx1.1

最终,执行代码后会生成一个内容为content名为badfile的文件。

将没有修改的exploit.py放入服务器运行:

task2.6

task2.7

可知,ebp = 0xffffd3b8,buffer’s address = 0xffffd348。

D)

修改exploit.py:

xg1

xg2

生成badfile,将badfile放入服务器中执行:

cg2cg

成功。

Task 3: Level-2 Attack

测试服务器2:

t2t1

发现它只给出buffer的地址0xffffd2f8,没有ebp,这意味着不能确定缓冲区的大小。

通过题目知道,bufferSize在[100,300]范围内,所以,offset应该在[100+4,300+4]范围内,且一定为4的倍数。

offset最大为304,则ret后面(高地址方向)都是NOP指令或shellcode代码,因此ret = buffer’s address + 304 + 4 (ret部分占有空间大小)一定会指向NOP指令或shellcode指令入口处,而NOP指令会一直向下跳。

从offset=104开始一直填写上面一部确定好的ret值到offset=304结束,则ret部分一定会得到上面的ret值。

修改代码exploit2.py:

t3

执行代码,生成文件badfile2,在服务器2中运行:

t5

t4

成功。

Task 4: Level-3 Attack

测试服务器3:

t2t1

buffer’address = 0x00007fffffffe220

rbp = 0x00007fffffffe2d0

这是一个64位的服务器,地址为8bytes,最高两个字节恒为0,这会导致一个问题,我们通过strcpy()将内容拷贝到stack中,但strcpy()见到0就会停止复制,比如radfile文件中的ret=0x0000XXXXXXXXXXXX。

由结果可知,buffersize = 208 bytes,shellcode的长度是165bytes,所以,我们可以将shellcode复制到buffer中。

我们要在执行ret之前执行shellcode"/bin/ls -l; echo Hello 64; /bin/tail -n 4 /etc/passwd *"(字符串之前(包含该字符串)的shellcode长为133bytes),buffer_size+ebp段=208+8=216,offset(208+8)-start+1≥133,所以,0≤star≤84

ret=buffer’address+[0,start]

offset=buffer_size+8

修改代码exploit3.py:

将shellcode修改为64位的shellcode

t3

t4

执行代码,生成文件badfile3,在服务器3中运行:

t6t5

成功。

Task 5: Level-4 Attack

测试服务器4:

t1t2

buffer’address = 0x00007fffffffe290

rbp = 0x00007fffffffe2f0

buffersize = 96bytes

函数栈很小,不能将shellcode放进缓冲区,而放在ret段后面又会被截断。但是badfile传进目标程序时已载入数据段,因此可以将ret设置跳转到数据段的shellcode代码部分执行shellcode。

ret=rbp+n,n在1184与1424之间。

修改代码exploit4.py:

t5

生成badfile4,并在服务器4中执行:

t4t3

成功。

Task 6: Experimenting with the Address Randomization

开启随机地址:

t1

测试服务器1,服务器3:

t3t2t4t5

在/Labsetup/attack-code目录下执行exploit.py程序,并另打开一窗口进行监听。

执行/Labsetup/attack-code目录下的brute-force.sh程序,该程序会一直执行exploit.py程序直到获得目标服务器shell。

15C(@QI~]0_3JKQ4_W`ZH0V

在第79943次获得目标服务器shell。

Task 7.b: Turn on the Non-executable Stack Protection

A.

打开StackGuard保护,并将badfile文件传输到stack-L1文件中,在/Labsetup/serve-code目录下直接执行stack-L1文件:

task7

检测到了 stack smashing

B.

打开Non-executable Stack(栈堆不可执行)保护

task8

发生了segmentation fault,堆栈不能执行,但没有阻止缓冲区溢出。

标签:py,ret,实验,offset,缓冲区,服务器,shellcode,溢出
From: https://www.cnblogs.com/wxrwajiez/p/18516093

相关文章

  • shellcode编写实验
       作业题目shellcode广泛用于许多涉及代码注入的攻击中。编写shellcode是相当有挑战性的。虽然我们可以很容易地从互联网上找到现有的shellcode,但是能够从头开始编写我们自己的shellcode总是令人兴奋的。shellcode中涉及到几种有趣的技术。本实验室的目的是帮助学生理解这......
  • 环境变量与set-uid实验
       作业题目本实验室的学习目标是让学生了解环境变量如何影响程序以及系统行为。环境变量是一组动态命名值,可以影响正在运行的进程将在计算机上运行。大多数操作系统都使用它们,因为它们是1979年引入Unix。尽管环境变量会影响程序行为,但它们是如何实现的这一点很多程序员都......
  • XSS攻击实验(Elgg)
       作业题目跨站点脚本(XSS)是一种常见于web应用程序中的计算机安全漏洞。此漏洞使攻击者有可能将恶意代码(如JavaScripts)注入受害者的web浏览器。为了演示攻击者可以做什么,我们在预先构建的UbuntuVM映像中设置了一个名为Elgg的web应用程序。我们已经注释掉了Elgg的一些保护......
  • 实验 1:域名信息收集工具
    作业题目本次实验主要考察大家的编程能力及子域名的信息收集方法,在文件夹“Lab1_code”提供了使用Bing搜索引擎的域名收集功能。请对该代码进行扩展,使其可支持百度搜索引擎的域名收集功能。需要实现如下功能:a)支持百度搜索引擎的域名提取,其中从百度搜索引擎提取的域名需......
  • Javaweb 实验6 JSP内置对象
    我发现了有些人喜欢静静看博客不聊天呐,但是ta会点赞。这样的人呢帅气低调有内涵,美丽大方很优雅。说的就是你,不用再怀疑哦目的:掌握JSP内置对象的使用。理解JSP的作用域掌握JSP的表达式使用实验要求:完成实验题目要求提交实验报告,将代码和实验结果页面截图放入报告中第......
  • 实验3
    task11#include<stdio.h>23charscore_to_grade(intscore);4intmain(){5intscore;6chargrade;78while(scanf("%d",&score)!=EOF){9grade=score_to_grade(score);10printf(&quo......
  • 实验三
    实验一源代码#include<stdio.h>charscore_to_grade(intscore);intmain(){intscore;chargrade;while(scanf("%d",&score)!=EOF){grade=score_to_grade(score);printf("分数;%d,等级:%c\n\n",score......
  • 实验2 类和对象_基础编程1
    实验任务1头文件#pragmaonce#include<string>//类T:声明classT{ //对象属性、方法public: T(intx=0,inty=0);//普通构造函数 T(constT&t);//复制构造函数 T(T&&t);//移动构造函数 ~T();//析构函数 voidadjust(intratio); voiddispla......
  • 实验3_C语言函数应用编程
    task1:输入分数,返回等级有问题。当输入高于E等级对应的分数时,函数返回值将是从该等级到E等级全部等级,如输入9将返回BCDE。 #include<stdio.h>charscore_to_grade(intscore);//函数声明intmain(){intscore;chargrade;while(scanf("%d",&score)!......
  • 实验3
    任务11#include<stdio.h>2charscore_to_grade(intscore);3intmain(){4intscore;5chargrade;6while(scanf("%d",&score)!=EOF){7grade=score_to_grade(score);8printf("分数:%d,等级:%c\n\n......