版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026校招:财务BP总监题目及答案
- 2026校招:Python开发题目及答案
- 餐厅礼仪培训制作教程
- 2026中考冲刺动员大会教师发言稿:以爱为翼我们为你护航远航
- 餐厅收银员培训
- 企业投融资管理制度
- 《病理解剖学》试题及答案
- 医疗机构医用耗材管理办法
- 2025年银行金融基础知识竞赛抢答题库及答案(共50题)
- 2025年广东省公务员考试(行政执法专业和申论)综合练习题及答案二
- 2026湖南衡阳日报社招聘事业单位人员16人备考题库附答案详解
- 《中国的地理区域划分》教案-2025-2026学年商务星球版(新教材)初中地理八年级下册
- 2025年天津市检察官、法官入员额考试真题(附答案)
- 建筑施工企业诚信承诺书范本
- 消防改造免责协议书
- GB 3608-2025高处作业分级
- 医疗器械进销存管理台账模板
- 2025年安徽省普通高中学业水平选择性考试地理含答案详解及试卷分析
- DB15∕T 3413-2024 住宅小区和商业用房供配电设施规范
- 2025年滨州邹平市面向社会公开招聘硕博士高层次人才笔试笔试备考试题附答案详解(精练)
- 食品行业原料来源与安全质量措施
评论
0/150
提交评论