周怡_杨卓群_木热提江_第1页
周怡_杨卓群_木热提江_第2页
周怡_杨卓群_木热提江_第3页
周怡_杨卓群_木热提江_第4页
周怡_杨卓群_木热提江_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CENTRAL SOUTH UNIVERSITY病毒实验报告学生姓名 周怡 杨卓群 木热提江 学 号 0906130213 0906130211 0906130201 班 级 信息安全1302 指导教师 汪 洁 设计时间 2015年10月 目录格式化字符串漏洞实验3一、实验目的3二、实验要求3三、实验内容3四、实验过程及分析41程序源代码42程序分析53使程序崩溃54. 定位int_input在内存中的位置55. 输出secret1的值66. 修改secret1的值67. 修改secret0的值为0x012378. 内存随机化机制7五、实验心得9格式化字符串漏洞实验一、实验目的格式字符串漏洞是

2、由于像printf(user_input)一样的代码,变量user_input由用户提供。当这个程序运行特权程序(如set-uid)时,这printf语句将变得危险。因为它可能会导致以下后果之一:(1)崩溃;(2)任意读取内存;(3)在任意的内存中修改值。最后结果是非常危险的,因为它可以允许用户修改特权程序的内部变量,从而改变程序的行为。通过指导学生上机实践,让学生制定一个计划利用这个安全漏洞。二、实验要求1.了解实验目的及实验原理;2.进行格式字符串漏洞攻击代码的编写;3.总结在实验过程中遇到的问题、解决办法和收获。三、实验内容程序要求用户提供输入数据,这些数据将会被保存在user_inpu

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

4、的。实验假设我们已经知道了这些内存地址,为了达到这个目的,程序特意为我们打出了这些地址。拥有这些知识我们要达到下面的目标:一崩溃这个程序二打出这些秘密值三修改这些秘密值四修改这些秘密的值为你事先计划好的值四、实验过程及分析1程序源代码/* vul_prog.c */ #include <stdlib.h>#include <stdio.h>#define SECRET1 0x44#define SECRET2 0x55int main(int argc,

5、0;char *argv)  char user_input100;  int *secret;  long int_input;  int a, b, c, d; /* other variables, not used here.*/  /* The secret value is stored 

6、;on the heap */  secret = (int *) malloc(2*sizeof(int);  /* getting the secret */  secret0 = SECRET1; secret1 = SECRET2;  printf("The variable secret's addr

7、ess is 0x%8x (on stack)n", &secret);  printf("The variable secret's value is 0x%8x (on heap)n", secret);  printf("secret0's address is 0x%8x (on heap)n",

8、 &secret0);  printf("secret1's address is 0x%8x (on heap)n", &secret1);  printf("Please enter a decimal integern");  scanf("%d", &int_input);  /* get

9、ting an input from user */  printf("Please enter a stringn");  scanf("%s", user_input); /* getting a string from user */  /* Vulnerable place */  

10、;printf(user_input);    printf("n");  /* Verify whether your attack is successful */  printf("The original secrets: 0x%x - 0x%xn", SECRET1, SECRET2);  printf(&q

11、uot;The new secrets:      0x%x - 0x%xn", secret0, secret1);  return 0;2程序分析程序内存中存在两个秘密值,我们想要知道这两个值,但发现无法通过读二进制代码的方式来获取它们(实验中为了简单起见,硬编码这些秘密值为0x44和0x55)。尽管我们不知道它们的值,但要得到它们的内存地址倒不是特别困难,因为对大多数系统而言,每次运行程序,这些内存地址基本上是不变的。实验假设我们

12、已经知道了这些内存地址,为了达到这个目的,程序特意为我们打出了这些地址。3使程序崩溃4. 定位int_input在内存中的位置5. 输出secret1的值6. 修改secret1的值7. 修改secret0的值为0x01238. 内存随机化机制上述程序中如果没有第一个scanf语句(scanf(“%d”, int_input),则程序就不会要求你输入一个整数,那么对于那些具有内存地址随机化操作系统,2.1中的攻击将会变得特别的困难,我们可以注意一下secret0和secret1的地址,每一次运行程序,它们的地址都是不相同的。操作系统中内存地址随机化的引入,使得很多攻击,例如缓冲区溢出,格式化漏

13、洞等等变得非常困难。为了强调内存地址随机化的作用,我们在任务中关掉内存地址随机化机制,来检验一下对上面程序的格式化攻击是否还是困难的。注意:要把第一个scanf语句scanf(“%d”, int_input)删除。我们可以用下面的命名关掉内存地址随机化机制:sysctl -w kernel.randomize_va_space=0如何让一个scanf语句接收一个任意的数字?通常scanf语句会暂停下了等待你的输入,但是有时候你想要你的程序得到0x05,而不是字符5。但是你在输入中敲入5的时候,程序获取的是5的ASCII码:0x35,而不是0x5。出现这种问题的根本原因是在ASCII中,0x05

14、不是一个字符,因此我们没有办法获取这样的值。一种解决问题的方式,是使用文件操作。我们很容易写成一段C代码,把0x05写入一个文件中,我们命名这个文件为mystring。这样当我们运行上述漏洞程序(假设为a.out)的时候,我们可以用a.out < mystring。scanf将会从mystring中获取输入,而不是我们的键盘中。但是我们必须注意一些特别的数字,比如0x0A是换行符,0x020是空格符,scanf认为这些是分隔符,它们会停止输入这些分隔符后面的数据,如果我们在scanf中只有一个%s。如果这些特殊的字符碰巧在我们地址中,我们就需要找到方法绕开它。为了简化任务,如果我们不幸在

15、秘密数据中存在正想特殊的数字,实验允许我们在为secret2分配内存前,添加另一个malloc语句,这个额外的malloc为引起存放秘密值的地址发生变化,如果我们给malloc一个合适的值,将会有幸创造一个有利的情景,这些秘密值的内存地址中不存在上述的特殊数字。下面的程序写一个格式化的字符串到文件mystring中。文件中的前四个字节是我们想输入的任意一个数字,接下来的字符串是我们从键盘输入的。#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int main() char buf100

16、0; int fp, size; unsigned int *address;/ Putting any number you like at the beginning of your format string address = (unsigned int *) buf; *address = 0x22080;/Geting the rest of the format string scanf("%s", buf+4); size = strlen(buf+4) + 4; printf("The string length is %dn", si

17、ze); /Writing buf to "mystring" fp = open("mystring", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); if(fp !=-1) write(fp, buf, size); close(fp); else printf("Open failed!n"); return 0;五、实验心得这次的实验是在seed实验中的一个实验。这个实验是字符串的漏洞。在这整个实验过程中,遇到了不少的困难,最开始看到seed实验室的英文网站根本是无从下手,但是后来通过网上查阅资料,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论