加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

格式化字符串溢出实验

发布时间:2020-12-14 02:02:05 所属栏目:Windows 来源:网络整理
导读:sh视频链接: ? 课程编写 类别 内容 实验课题名称 格式化字符串溢出实验 实验目的与要求 了解格式化字符串溢出的基本概念 掌握格式化字符串溢出的原理和性质 熟悉格式化字符串溢出攻击的方法 简单掌握格式化字符串溢出的防范方法 实验环境 VPC1( 虚拟PC) Wi

sh视频链接:

?课程编写

类别

内容

实验课题名称

格式化字符串溢出实验

实验目的与要求

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

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

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

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

实验环境

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)n",&secret);

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

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

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

printf("Please enter a decimal integern");

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

printf("Please enter a stringn");

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

// Vulnerable place

printf(user_input);

printf("n");

// Verify whether your attack is successful

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

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

return 0;

}

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

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

?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读