• 格式化字符串溢出实验


    视频链接:https://drive.google.com/open?id=1gtUlztkKCP2Oy42mdtkS3WAdgsWCNJHF

     课程编写

    类别

    内容

    实验课题名称

    格式化字符串溢出实验

    实验目的与要求

    了解格式化字符串溢出的基本概念

    掌握格式化字符串溢出的原理和性质

    熟悉格式化字符串溢出攻击的方法

    简单掌握格式化字符串溢出的防范方法

    实验环境

    VPC1(虚拟PC)

    Windows XP操作系统

    软件描述

    实验代码

    预备知识

    格式化字符串的漏洞是由像这样的代码 printf(user_input)引起的,其中 user_input 是用户输入的数据,具有 Set-UID root 权限这类程序在运行的时候,printf 语句将会变得非常危险,因为它可能会导致下面的结果:

    1、使得程序崩溃。

    2、任意一块内存读取数据。

    3、修改任意一块内存里的数据。

    最后一种结果是非常危险的,因为它允许用户修改 set-UID root 程序内部变量的值,从而改变这些程序的行为。本次实验将会提供一个具有格式化漏洞的程序,我们的任务是制定一个计划来探索这些漏洞。除了攻击这些漏洞,我们将会探索如何制定一种策略来防御这种攻击,并且评估这种策略是否起作用,并解释其中的原因。

    实验内容

    介绍格式化字符串的基本概念;

    使用一个具有格式化字符串漏洞的程序来掌握格式化字符串溢出的攻击原理和性质;

    通过实验理解和掌握简单的格式化字符串溢出防范方法。

    实验步骤

    1、打开控制台,进入虚拟环境。

     

    2、下面的程序要求用户提供输入数据,这些数据将会被保存在 user_input 缓冲区 buffer 中,程序将会使用 printf 打出缓冲区 buffer 中的数据,这个程序是一个 set-UID 程序,它以 root 权限运行。不幸地是,这个程序在 printf 打出 user_input 数据的过程中存在一个格式化漏洞。我们将会探索这些漏洞,并检验一下可以造成多大的危害。程序有两个秘密的值存在内存中,我们对这些秘密的值感兴趣。但是这些秘密值对我们来说是未知的,不可能通过读二进制代码来获取它们(实验中为了简单起见,硬编码这些秘密值为 0x44 和 0x55)。尽管我们不知道这些秘密的值,但是我们获取存放这些秘密值的内存地址倒不是特别困难,因为对大多数系统而言,每次运行程序,这些内存地址基本上是相同的。实验假设我们已经知道了这些内存地址,为了达到这个目的,程序特意为我们打出了这些地址。

    注意:这些二进制代码对我们来说,只有只读和运行权限,我们没有办法修改它。也就是说在不能修改二进制代码的前提下,达到上述目标。幸运的是,我们可以有一份源码的拷贝,利用它,我们可以制定我们的攻击策略。

    源码的拷贝程序如下:

    //vul_prog.c

    #define SECRET1 0x44

    #define SECRET2 0x55

    int main(intargc, char *argv[])

    {

    charuser_input[100];

    int *secret;

    intint_input;

    int a, b, c, d; //other variables, not used here.

    // The secret value is stored on the heap

    secret = (int *) malloc(2*sizeof(int));

    // getting the secret

    secret[0] = SECRET1; secret[1] = SECRET2;

    printf("The variable secret's address is 0x%8x (on stack) ", &secret);

    printf("The variable secret's value is 0x%8x (on heap) ", secret);

    printf("secret[0]'s address is 0x%8x (on heap) ", &secret[0]);

    printf("secret[1]'s address is 0x%8x (on heap) ", &secret[1]);

    printf("Please enter a decimal integer ");

    scanf("%d", &int_input); // getting an input from user

    printf("Please enter a string ");

    scanf("%s", user_input); // getting a string from user

    // Vulnerable place

    printf(user_input);

    printf(" ");

    // Verify whether your attack is successful

    printf("The original secrets: 0x%x -- 0x%x ", SECRET1, SECRET2);

    printf("The new secrets: 0x%x -- 0x%x ", secret[0], secret[1]);

    return 0;

    }

    3、找到d: ools51elab5007BDebugvul_prog.exe双击,在实验环境下运行上述程序进行攻击,首先输入“1”,回车,然后输入10个“%S.”,回车。

    攻击结果如下,发现程序崩溃:

     

    利用格式化字符函数引发非法指针访问内存,引起程序崩溃。

  • 相关阅读:
    python—logger
    print默认在末尾添加一个换行符,但其实也可以不用!
    Python做int()强制类型转换的时候,小数是如何取舍的?
    Python基础之好玩的字符串格式化f-string格式
    【奔走相告】- Github送福利:用户可免费创建私有代码库啦
    我30岁了,转行学编程可以吗? 排除法告诉你答案
    Python基础之好玩的字符串格式化之类C风格
    Python基础之白话说函数
    变量 和 注释
    什么是编程语言,什么是Python解释器
  • 原文地址:https://www.cnblogs.com/nul1/p/10859408.html
Copyright © 2020-2023  润新知