栈溢出实验报告.docx

上传人:b****6 文档编号:8609155 上传时间:2023-02-01 格式:DOCX 页数:18 大小:22.86KB
下载 相关 举报
栈溢出实验报告.docx_第1页
第1页 / 共18页
栈溢出实验报告.docx_第2页
第2页 / 共18页
栈溢出实验报告.docx_第3页
第3页 / 共18页
栈溢出实验报告.docx_第4页
第4页 / 共18页
栈溢出实验报告.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

栈溢出实验报告.docx

《栈溢出实验报告.docx》由会员分享,可在线阅读,更多相关《栈溢出实验报告.docx(18页珍藏版)》请在冰豆网上搜索。

栈溢出实验报告.docx

栈溢出实验报告

华中科技大学计算机学院《信息系统应用安全》实验报告

实验名称团队成员:

注:

团队成员贡献百分比之和为1

教师评语:

一.实验环境

?

操作系统:

windowsxpsp3?

编译平台:

visualc++6.0?

调试环境:

ollydbg

二.实验目的

1.掌握缓冲区溢出的原理;

2.掌握缓冲区溢出漏洞的利用技巧;3.理解缓冲区溢出漏洞的防范措施。

三.实验内容及步骤

1.缓冲区溢出漏洞产生的的基本原理和攻击方法

?

缓冲区溢出模拟程序

由于拷贝字符串时产生缓冲区溢出,用“abcd”字符串的值覆盖了原来eip的值,所以main函数返回时eip指向44434241,引发访问异常。

?

运行命令窗口的shellcode

由于把main函数的返回eip地址替换成了jmpesp的地址,main函数

返回的时候就会执行我们的shellcode代码。

该shellcode,运行命令窗口。

2.ms06-040缓冲区溢出漏洞分析和利用

?

溢出点定位篇二:

缓冲区溢出实验报告

院系:

计算机与通信工程学院

班级:

信息安全10-02班

1.实验目的

掌握缓冲区溢出的原理

掌握常用的缓冲区溢出方法

理解缓冲区溢出的危害性

掌握防范和避免缓冲区溢出攻击的方法

2.实验工具

溢出对象:

ccproxy7.2

(1)

(2)调试工具:

使用vmware虚拟机,安装ccproxy7.2进行实验调试。

3.实验步骤

了解ccproxy7.2

代理服务器为大家解决了很多问题,比如阻挡黑客攻击和局域网共享上网等。

?

国内非常受欢迎的一款代理服务器软件

?

设置简单,使用方便

关于ccproxy6.2缓冲区溢出漏洞说明

ccproxy在代理telnet协议时,可以接受ping命令

ping命令格式:

pinghostname\r\n

当hostname的长度大于或者等于1010字节时,ccproxy6.2会发生缓冲区溢出,导致程序崩溃

ccproxy6.2缓冲区溢出漏洞演示

在目标主机运行ccproxy,使用默认设置

运行ccproxy的机器ip是192.168.6.132

使用telnet命令连接ccproxy:

telnet192.168.6.13223

返回信息:

(如图)

输入ping命令,后接畸形数据:

在ping命令后接10个字符a(pingaaaaaaaaaa),观察返回信息

将字符a的数量变为100个、1000个、2000个,观察返回信息

(注:

由于本人安装的是7.2版本,其漏洞已修复,故智能识别252个字符,其后被截断,所以当出现的畸形字符长度超过252时,就不再被识别,所以会有“hostnotfound”)

原理:

如果终端提示“hostnotfound”,说明ccproxy正确地处理了这个畸形数据,仍工作正常

如果终端提示“失去了跟主机的连接”,表明ccproxy已经崩溃

ccproxy6.2缓冲区溢出漏洞利用

如何利用这个漏洞,来实现攻击目的,做一些特别的事情。

我们知道,栈是一个后进先出的结构,函数在入栈时,先将返回地址ret压入栈,接着是ebp基址寄存器,然后根据局部变量的大小,开辟一定大小的缓冲区,再将局部变量压入。

在将局部变量压入栈的时候,如果压入数据过长,大于事先声明的缓冲区大小,就会覆盖ebp和ret。

漏洞的利用有5个方面的问题需要考虑。

一是ret的定位,要用我们的地址覆盖ret,就需要先知道ret在哪,也就是我们定好的这个地址,应该放在字符串的什么位置。

二是要寻找一个跳转指令,将这个指令的地址填充到ret,这样才能在返回时通过跳转指令转到其它地方执行程序

三是要构造shellcode,也就是完成一些特定的功能。

四是将所构造的shellcode放在跳转指令转向的地方。

最后一个步骤就是根据上面的这些分析过程,将它们整合成攻击程序,运行这个攻击程序就能直接利用缓冲区溢出漏洞。

函数栈布局,栈顶是内存低地址,栈底是内存高地址篇三:

数据结构栈和队列实验报告

一、实验目的和要求

(1)理解栈和队列的特征以及它们之间的差异,知道在何时使用那种数据结构。

(2)重点掌握在顺序栈上和链栈上实现栈的基本运算算法,注意栈满和栈空的条件。

(3)重点掌握在顺序队上和链队上实现队列的基本运算算法,注意循环队队列满和队空的条件。

(4)灵活运用栈和队列这两种数据结构解决一些综合应用问题。

二、实验环境和方法

实验方法:

(一)综合运用课本所学的知识,用不同的算法实现在不同的程序功能。

(二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。

(三)根据实验内容,编译程序。

实验环境:

windowsxpvisualc++6.0

三、实验内容及过程描述

实验步骤:

①进入visualc++6.0集成环境。

②输入自己编好的程序。

③检查一遍已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有

错,及时改正。

④进行编译和连接。

如果在编译和连接过程中发现错误,频幕上会出现“报错信息”,

根据提示找到出错位置和原因,加以改正。

再进行编译,如此反复直到不出错为止。

⑤运行程序并分析运行结果是否合理。

在运行是要注意当输入不同的数据时所得结果

是否正确,应运行多次,分别检查在不同情况下结果是否正确。

实验内容:

编译以下题目的程序并调试运行。

1)、编写一个程序algo3-1.cpp,实现顺

的各种基本运算,并在此基础上设计一

程序并完成如下功能:

(1)初始化栈s;

(2)判断栈s是否非空;序栈个主

(3)依次进栈元素a,b,c,d,e;

(4)判断栈s是否非空;

(5)输出出栈序列;

(6)判断栈s是否非空;

(7)释放栈。

图3.1proj3_1工程组成

本工程proj3_1的组成结构如图3.1所示。

本工程的模块结构如图3.2所示。

图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。

图3.2proj3_1工程的程序结构图

其中包含如下函数:

initstack(sqstack*&s)//初始化栈s

destroystack(sqstack*&s)//销毁栈s

stackempty(sqstack*s)//判断栈空

push(sqstack*&s,elemtypee)//进栈

pop(sqstack*&s,elemtype&e)//出栈

gettop(sqstack*s,elemtype&e)//取栈顶元素

对应的程序如下:

//文件名:

algo3-1.cpp

#include<stdio.h>

#include<malloc.h>

#definemaxsize100

typedefcharelemtype;

typedefstruct

{

elemtypedata[maxsize];

inttop;//栈顶指针

}sqstack;

voidinitstack(sqstack*&s)//初始化栈s

{s=(sqstack*)malloc(sizeof(sqstack));

s->top=-1;//栈顶指针置为-1

}

voiddestroystack(sqstack*&s)//销毁栈s

{

free(s);

}

boolstackempty(sqstack*s)//判断栈空

{

return(s->top==-1);

}

boolpush(sqstack*&s,elemtypee)//进栈

{if(s->top==maxsize-1)//栈满的情况,即栈上溢出

returnfalse;

s->top++;//栈顶指针增1

s->data[s->top]=e;//元素e放在栈顶指针处

returntrue;

}

boolpop(sqstack*&s,elemtype&e)//出栈

{if(s->top==-1)//栈为空的情况,即栈下溢出

returnfalse;

e=s->data[s->top];//取栈顶指针元素的元素

s->top--;//栈顶指针减1

returntrue;

}

boolgettop(sqstack*s,elemtype&e)//取栈顶元素

{if(s->top==-1)//栈为空的情况,即栈下溢出

returnfalse;

e=s->data[s->top];//取栈顶指针元素的元素

returntrue;

}

设计exp3-1.cpp程序如下//文件名:

exp3-1.cpp

#include<stdio.h>

#include<malloc.h>

#definemaxsize100

typedefcharelemtype;

typedefstruct

{

elemtypedata[maxsize];

inttop;//栈顶指针

}sqstack;

externvoidinitstack(sqstack*&s);

externvoiddestroystack(sqstack*&s);

externboolstackempty(sqstack*s);

externboolpush(sqstack*&s,elemtypee);

externboolpop(sqstack*&s,elemtype&e);

externboolgettop(sqstack*s,elemtype&e);

voidmain()

{

elemtypee;

sqstack*s;

printf(栈s的基本运算如下:

\n);

printf(

(1)初始化栈s\n);

initstack(s);

printf(

(2)栈为%s\n,(stackempty(s)?

空:

非空));

printf((3)依次进栈元素a,b,c,d,e\n);

push(s,a);

push(s,b);

push(s,c);

push(s,d);

push(s,e);

printf((4)栈为%s\n,(stackempty(s)?

空:

非空));

printf((5)出栈序列:

);

while(!

stackempty(s))

{

pop(s,e);

printf(%c,e);

}

printf(\n);

printf((6)栈为%s\n,(stackempty(s)?

空:

非空));

printf((7)释放栈\n);

destroystack(s);

}

运行结果如下:

2)、编写一个程序algo3-2.cpp,实现链栈的各种基本运算,并在此基础上设计一个主程序并完成如下功能:

(1)初始化链栈s;

(2)判断链栈s是否非空;

(3)依次进栈a,b,c,d,e;

(4)判断链栈s是否非空;

(5)输出链栈长度;

(6)输出从栈底到栈顶元素;

(7)输出出队序列;

(8)判断链栈s是否非空;图3.3proj3_2工程组成

(9)释放队列。

本工程proj3_2的组成结构如图3.3所示。

本工程的模块结构如图3.4所示。

图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。

图3.4proj3_2工程的程序结构图

其中包含如下函数:

initstack(listack*&s)//初始化栈s

destroystack(listack*&s)//销毁栈

stackempty(listack*s)//判断栈是否为空

push(listack*&s,elemtypee)//进栈

pop(listack*&s,elemtype&e)//出栈

gettop(listack*s,elemtype&e)//取栈顶元素

对应的程序如下:

//文件名:

algo3-2.cpp

#include<stdio.h>

#include<malloc.h>

typedefcharelemtype;

typedefstructlinknode

{

elemtypedata;//数据域篇四:

数据结构顺序栈实验报告

一、设计人员相关信息

1.设计者姓名、学号和班号:

12地信李晓婧12012242983

2.设计日期:

2014.

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:

建立一个新的空栈,实际上将栈顶指针指向-1即可。

(2)销毁栈destroystack:

释放栈占用的存储空间

(3)判断栈是否为空stackempty:

栈为空的条件是s->op==-1。

(4)进栈push:

在栈不满的条件下,先将栈顶指针增1,然后在栈顶指针指向位置插入元素e。

(5)出栈pop:

在栈不为空的条件下,先将栈顶元素赋给e,然后将栈顶指针减1.

(6)取栈顶元素gettop:

在栈不为空的条件下,将栈顶元素赋给e。

5.算法描述或流程图:

#includestdio.h

#includemalloc.h

#include<stdlib.h>

#definemaxsize50

typedefcharelemtype;

typedefstruct

{elemtypedata[maxsize];

inttop;/*栈顶指针*/

}sqstack;//定义顺序栈类型

voidinitstack(sqstack*&s)/*初始化*/

{

s=(sqstack*)malloc(sizeof(sqstack));

s->top=-1;//栈顶指针置为-1

}

voiddestroystack(sqstack*&s)/*销毁*/

{

free(s);

}

intstackempty(sqstack*s)/*判断是否为空*/

{

return(s->top==-1);

}

intpush(sqstack*&s,elemtypea[],intn)

{

inti;if(s->top==maxsize-1)//栈满的情况,即栈上溢出return0;for(i=0;i<n;i++){s->top++;//栈顶指针增1

s->data[s->top]=a[i];//元素e放在栈顶指针处

}

intpop(sqstack*&s,elemtype&e)/*出栈一个元素*/{

if(s->top==-1)//栈为空的情况,即栈下溢出return0;

e=s->data[s->top];//取栈顶元素

s->top--;//栈顶指针减1

return1;

}

}return1;

intgettop(sqstack*s,elemtype&e)/*取栈顶元素*/{

if(s->top==-1)//栈为空的情况,即栈下溢出return0;

e=s->data[s->top];//取栈顶元素

return1;

}

intstacklength(sqstack*s)/*求栈长度*/

{

return(s->top+1);

}

voiddispstack(sqstack*s)

{

}

voidmain()

{

inti,j;

elemtypestr[5]={a,b,c,d,e};//定义字符数组sqstack*st;//定义栈

initstack(st);/*初始化*/

i=stackempty(st);//判断栈是否为空

if(i==0)inti;for(i=s->top;i>=0;i--)printf(%c,s->data[i]);printf(\n);

printf(顺序栈非空\n);elseprintf(顺序栈为空\n);

push(st,str,5);//进栈

j=stackempty(st);

if(j==0)

printf(顺序栈非空\n);elseprintf(顺序栈为空\n);

printf(栈长度为:

%d\n,stacklength(st));//输出栈长度

printf(出栈序列:

\n);

dispstack(st);//输出栈

stackempty(st);

destroystack(st);

}

6.实验数据和实验结果:

篇五:

栈的操作(实验报告)

实验三栈和队列

3.1实验目的:

(1)熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作

在栈的顺序存储结构和链式存储结构上的实现;

(2)熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的基

本操作在队列的顺序存储结构和链式存储结构上的实现。

3.2实验要求:

(1)复习课本中有关栈和队列的知识;

(2)用c语言完成算法和程序设计并上机调试通过;

(3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括

时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。

3.3基础实验

[实验1]栈的顺序表示和实现

实验内容与要求:

编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:

(1)初始化顺序栈

(2)插入元素

(3)删除栈顶元素

(4)取栈顶元素

(5)遍历顺序栈

(6)置空顺序栈

分析:

栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。

对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:

p->top==maxnum-1,栈满时,不能入栈;否则出现空间溢出,引起错误,这种现象称为上溢。

出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。

通常栈空作为一种控制转移的条件。

注意:

(1)顺序栈中元素用向量存放

(2)栈底位置是固定不变的,可设置在向量两端的任意一个端点

(3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置

参考程序:

#include<stdio.h>

#include<stdlib.h>

#definemaxnum20

#defineelemtypeint

/*定义顺序栈的存储结构*/

typedefstruct

{elemtypestack[maxnum];

inttop;

}sqstack;

/*初始化顺序栈*/

voidinitstack(sqstack*p)

{if(!

p)

printf(eorror);

p->top=-1;

}

/*入栈*/

voidpush(sqstack*p,elemtypex)

{if(p->top<maxnum-1)

{p->top=p->top+1;

p->stack[p->top]=x;

}

else

printf(overflow!

\n);

}

/*出栈*/

elemtypepop(sqstack*p)

{elemtypex;

if(p->top!

=0)

{x=p->stack[p->top];

printf(以前的栈顶数据元素%d已经被删除!

\n,p->stack[p->top]);

p->top=p->top-1;

return(x);

}

else

{printf(underflow!

\n);

return(0);

}

}

/*获取栈顶元素*/

elemtypegettop(sqstack*p)

{elemtypex;

if(p->top!

=0)

{x=p->s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1