缓冲区溢出实验

 

 

 

作业题目

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

本实验将提供四台不同的服务器,每台服务器运行一个带有缓冲区溢出漏洞的程序。实验任务是开发一个利用漏洞的程序,并最终获得这些服务器上的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,堆栈不能执行,但没有阻止缓冲区溢出。

posted @ 2024-10-30 16:47  wajiez  阅读(200)  评论(0)    收藏  举报