格式化字符串溢出实验

Posted nul1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了格式化字符串溢出实验相关的知识,希望对你有一定的参考价值。

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 integer\\n");

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

printf("Please enter a string\\n");

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%x\\n", SECRET1, SECRET2);

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

return 0;

}

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

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

技术图片 

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

以上是关于格式化字符串溢出实验的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 iOS 上的格式字符串攻击和缓冲区溢出?

字符串哈希(自然溢出模板)

CSAPP实验四----缓冲区溢出实验bufbomb

NSCTF 2017-pwn2

缓冲区溢出攻击实验(另附源代码)

带有尾递归函数c ++的堆栈溢出