格式化字符串溢出实验

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.”,回车。

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

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

原文地址:https://www.cnblogs.com/nul1/p/10859408.html

时间: 2024-08-04 16:52:07

格式化字符串溢出实验的相关文章

Linux pwn入门教程——格式化字符串漏洞

本文作者:[email protected] 原文来自:https://bbs.ichunqiu.com/thread-42943-1-1.html 0×00 printf函数中的漏洞printf函数族是一个在C编程中比较常用的函数族.通常来说,我们会使用printf([格式化字符串],参数)的形式来进行调用,例如 然而,有时候为了省事也会写成 事实上,这是一种非常危险的写法.由于printf函数族的设计缺陷,当其第一个参数可被控制时,攻击者将有机会对任意内存地址进行读写操作. 0×01 利用格

使用stringstream格式化字符串

stringstream所在头文件为<sstream> 一般有如下常用功能: 1.安全格式化字符串 stringstream常用来安全的格式化若干个字符串,数值到一个缓冲区, 而不用担心溢出, 可以用来取代sprintf. 注:使用stringstream 将int or double 等类型转换成string,如果你想要转换多个int/double等类型的变量,而又始终用一个stringstream对象(避免总是创建stringstream的开销),那么你就需要在再一次用stringstre

CSAPP缓冲区溢出实验记录(一)

题目说明: 开启漏洞之旅,从基础做起.近日,下载了CMU为<深入理解计算机系统>(CSAPP)一书教学配合的缓冲区溢出实验Buffer Bomb,重温了栈溢出的原理. 题目提供了一个有漏洞溢出的程序bufbomb,包括五个Level,在每个Level中要求返回指定的函数.修改全局变量.执行Shellcode等,难度逐渐递增.为保证实验者作业的唯一性,实验提供了程序makecookie,生成指定用户名的cookie,在实验中将会用到这个cookie值.在我的机器上, [email protect

YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出【高危】

YS VTM模块存在格式化字符串漏洞,可导致VTM进程异常退出[高危] 问题描述:          YS VTM模块开放对外监听端口(8554和8664),此次使用sulley fuzzing框架对监听在8664端口的私有二进制协议进行测试,以检测可能发生的各种问题.在该协议中,客户端会向8664端口发送一个二进制+文本格式的报文,对该报文格式的各个字段进行fuzzing,发现当向服务端的VTM进程传入格式化字符串时会崩溃并退出. 测试步骤: 1.  分别在客户机和服务器安装sulley fu

SEED缓冲区溢出实验笔记

缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本文记录了做SEED缓冲区溢出实验的体会与问题,侧重实践,而不是讲解缓冲区溢出原理的详细教程) 1. 准备工作 使用SEED ubuntu虚拟机进行缓冲区溢出实验,首先要关闭一些针对此攻击的防御机制来简化实验. (1)内存地址随机化(Address Space Randomization):基于Lin

格式化字符串利用小结

格式化字符串利用小结 格式化字符串漏洞基本原理: Printf()函数的一般形式为printf("format",输出表列),其第一个参数就是格式化字符串,用来告诉程序以什么格式进行输出.正常情况下,这样使用: char str[100]; scanf("%s",str); printf("%s",str); 但也有人这么用: char str[100] scanf("%s",str); printf(str) 也许代码编写者

格式化字符串攻击原理及示例

一.类printf函数簇实现原理 类printf函数的最大的特点就是,在函数定义的时候无法知道函数实参的数目和类型. 对于这种情况,可以使用省略号指定参数表. 带有省略号的函数定义中,参数表分为两部分,前半部分是确定个数.确定类型的参数,第二部分就是省略号,代表数目和类型都不确定的参数表,省略号参数表中参数的个数和参数的类型是事先的约定计算出来的,每个实参的地址(指针)是根据确定参数表中最后一个实参的地址算出来的. 这里涉及到函数调用时的栈操作.函数栈的栈底是高地址,栈顶是底地址.在函数调用 时

编写高质量代码改善C#程序的157个建议——建议13: 为类型输出格式化字符串

建议13: 为类型输出格式化字符串 有两种方法可以为类型提供格式化的字符串输出.一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable.这对类型来 说,是一种主动实现的方式,要求开发者可以预见类型在格式化方面的要求.更多的时候,类型的使用者需为类型自定义格式化器,这就是第二种方法,也是最灵活 多变的方法,可以根据需求的变化为类型提供多个格式化器.下面就来详细介绍这两种方法. 最简单的字符串输出是为类型重写ToString方法,如果没有为类型重写该方法,默认会调用Obj

Python格式化字符串

在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的printf()函数的字符串格式化(C语言中也是使用%). 下面整理了一下Python中字符串格式化符合: 格式化符号 说明 %c 转换成字符(ASCII 码值,或者长度为一的字符串) %r 优先用repr()函数进行字符串转换 %s 优先用str()函数进行字符串转换 %d / %i 转成有符号十进制数 %u