栈溢出实验报告Word格式.docx
- 文档编号:21745369
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:18
- 大小:22.86KB
栈溢出实验报告Word格式.docx
《栈溢出实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《栈溢出实验报告Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
掌握常用的缓冲区溢出方法
理解缓冲区溢出的危害性
掌握防范和避免缓冲区溢出攻击的方法
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*&
amp;
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&
lt;
stdio.h&
gt;
malloc.h&
#definemaxsize100
typedefcharelemtype;
typedefstruct
{
elemtypedata[maxsize];
inttop;
//栈顶指针
}sqstack;
voidinitstack(sqstack*&
{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;
top++;
//栈顶指针增1
data[s-&
top]=e;
//元素e放在栈顶指针处
returntrue;
boolpop(sqstack*&
top==-1)//栈为空的情况,即栈下溢出
e=s-&
top];
//取栈顶指针元素的元素
top--;
//栈顶指针减1
boolgettop(sqstack*s,elemtype&
//取栈顶指针元素的元素
设计exp3-1.cpp程序如下//文件名:
exp3-1.cpp
#definemaxsize100
externvoidinitstack(sqstack*&
s);
externvoiddestroystack(sqstack*&
externboolstackempty(sqstack*s);
externboolpush(sqstack*&
s,elemtypee);
externboolpop(sqstack*&
e);
externboolgettop(sqstack*s,elemtype&
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*&
pop(listack*&
gettop(listack*s,elemtype&
对应的程序如下:
algo3-2.cpp
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
{elemtypedata[maxsize];
/*栈顶指针*/
}sqstack;
//定义顺序栈类型
voidinitstack(sqstack*&
s)/*初始化*/
s=(sqstack*)malloc(sizeof(sqstack));
s)/*销毁*/
intstackempty(sqstack*s)/*判断是否为空*/
intpush(sqstack*&
s,elemtypea[],intn)
inti;
if(s-&
top==maxsize-1)//栈满的情况,即栈上溢出return0;
for(i=0;
i&
n;
i++){s-&
top]=a[i];
intpop(sqstack*&
e)/*出栈一个元素*/{
top==-1)//栈为空的情况,即栈下溢出return0;
//取栈顶元素
return1;
}return1;
intgettop(sqstack*s,elemtype&
e)/*取栈顶元素*/{
intstacklength(sqstack*s)/*求栈长度*/
top+1);
voiddispstack(sqstack*s)
inti,j;
elemtypestr[5]={a,b,c,d,e};
//定义字符数组sqstack*st;
//定义栈
initstack(st);
/*初始化*/
i=stackempty(st);
//判断栈是否为空
if(i==0)inti;
for(i=s-&
top;
=0;
i--)printf(%c,s-&
data[i]);
printf(顺序栈非空\n);
elseprintf(顺序栈为空\n);
push(st,str,5);
//进栈
j=stackempty(st);
if(j==0)
printf(栈长度为:
%d\n,stacklength(st));
//输出栈长度
printf(出栈序列:
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为栈顶指针)来指示当前栈顶位置
参考程序:
#definemaxnum20
#defineelemtypeint
/*定义顺序栈的存储结构*/
typedefstruct
{elemtypestack[maxnum];
/*初始化顺序栈*/
voidinitstack(sqstack*p)
{if(!
p)
printf(eorror);
p-&
/*入栈*/
voidpush(sqstack*p,elemtypex)
{if(p-&
top&
maxnum-1)
{p-&
top=p-&
top+1;
stack[p-&
top]=x;
else
printf(overflow!
/*出栈*/
elemtypepop(sqstack*p)
{elemtypex;
if(p-&
top!
=0)
{x=p-&
printf(以前的栈顶数据元素%d已经被删除!
\n,p-&
top]);
top-1;
return(x);
{printf(underflow!
return(0);
/*获取栈顶元素*/
elemtypegettop(sqstack*p)
=0)
s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 溢出 实验 报告