作业题目
本实验的学习目标是让学生将从课堂上学到的有关缓冲区溢出漏洞的知识进行实践,从而获得有关该漏洞的第一手经验。缓冲区溢出是指程序试图将数据写入预先分配的固定长度缓冲区边界之外的情况。恶意用户可利用此漏洞改变程序的流控制,甚至执行任意代码。此漏洞是由于数据存储(如缓冲区)和控件存储(如返回地址)的混合造成的:数据部分的溢出会影响程序的控制流,因为溢出会改变返回地址。
本实验将提供四台不同的服务器,每台服务器运行一个带有缓冲区溢出漏洞的程序。实验任务是开发一个利用漏洞的程序,并最终获得这些服务器上的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)执行以下命令,测试题目给的代码:
可以完成。
B)创建一个文件test.txt
修改shellcode_32.py:
重复A)中执行的命令:
成功实现删除文件。
Task 2: Level-1 Attack
- 搭建实验环境
执行以下命令,运行四台服务器:
关闭随机地址:
两次运行,地址未改变(关闭成功):
- 分析exploit.py
生成一个全由NOP组成的517个bytes的content。
- NOP:空转,不进行任何操作。
- 517:对应stack.c中的从stdin(标准输入,通常是键盘)读取517个字符。
通过修改shellcode的值,在exploit.py中填入需要执行的shellcode代码,
并通过修改start的值,将全是NOP的content中的部分替换为shellcode。
将content中从offset开始到offset后面4个byte的值替换为ret生成的地址:
所以,ret值要修改为shellcode执行“入口”的地址,offset值要修改为函数栈中偏移地址的值。
所以,ret = ebp + 8,offset = ebp - buffer’s address + 4。
最终,执行代码后会生成一个内容为content名为badfile的文件。
将没有修改的exploit.py放入服务器运行:
可知,ebp = 0xffffd3b8,buffer’s address = 0xffffd348。
D)
修改exploit.py:
生成badfile,将badfile放入服务器中执行:
成功。
Task 3: Level-2 Attack
测试服务器2:
发现它只给出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:
执行代码,生成文件badfile2,在服务器2中运行:
成功。
Task 4: Level-3 Attack
测试服务器3:
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
执行代码,生成文件badfile3,在服务器3中运行:
成功。
Task 5: Level-4 Attack
测试服务器4:
buffer’address = 0x00007fffffffe290
rbp = 0x00007fffffffe2f0
buffersize = 96bytes
函数栈很小,不能将shellcode放进缓冲区,而放在ret段后面又会被截断。但是badfile传进目标程序时已载入数据段,因此可以将ret设置跳转到数据段的shellcode代码部分执行shellcode。
ret=rbp+n,n在1184与1424之间。
修改代码exploit4.py:
生成badfile4,并在服务器4中执行:
成功。
Task 6: Experimenting with the Address Randomization
开启随机地址:
测试服务器1,服务器3:
在/Labsetup/attack-code目录下执行exploit.py程序,并另打开一窗口进行监听。
执行/Labsetup/attack-code目录下的brute-force.sh程序,该程序会一直执行exploit.py程序直到获得目标服务器shell。
在第79943次获得目标服务器shell。
Task 7.b: Turn on the Non-executable Stack Protection
A.
打开StackGuard保护,并将badfile文件传输到stack-L1文件中,在/Labsetup/serve-code目录下直接执行stack-L1文件:
检测到了 stack smashing
B.
打开Non-executable Stack(栈堆不可执行)保护
发生了segmentation fault,堆栈不能执行,但没有阻止缓冲区溢出。
标签:py,ret,实验,offset,缓冲区,服务器,shellcode,溢出 From: https://www.cnblogs.com/wxrwajiez/p/18516093