阿里巴巴网站头像你会放什么做头像,网站建设备案查询,动漫采集WordPress,培训网站设计一、实验目的
熟悉软件安全需求分析方法#xff0c;掌握软件安全分析技术。 二、实验软硬件要求
1、操作系统#xff1a;windows 7/8/10等
2、开发环境#xff1a;VS 6.0#xff08;C#xff09;、OllyDbg 三、实验预习
《软件安全技术》教材第3章 四、实验内容#…一、实验目的
熟悉软件安全需求分析方法掌握软件安全分析技术。 二、实验软硬件要求
1、操作系统windows 7/8/10等
2、开发环境VS 6.0C、OllyDbg 三、实验预习
《软件安全技术》教材第3章 四、实验内容实验步骤、测试数据等
1. 目标教材实验3_2、3_3、3_5、3_6。
2. 实验说明
1 实验3_2栈溢出修改相邻变量
说明fun()函数实现了一个基于口令认证的功能用户输入的口令存放在局部变量str数组中然后程序将其与预设在局部变量password中的口令进行比较以得出是否通过认证的判断此处仅为示例并非实际采用的方法。
当用户输入“ABCDE”时程序返回OK当用户数去“AAAAA”时程序返回No当用户输入“aaaaaaaaaaaaa”时程序返回OK当用户输入“aaaabbbbccccddddeeeefff”时程序提示错误 2实验3_3栈溢出修改返回地址
说明将例3-2程序稍作修改程序输入改为读取密码文件password.txt如果在password.txt文件中存入23个字符“aaaabbbbccccddddeeeefff”程序运行的效果将与从键盘输入一致。
将password.txt文件中最后4个字节改为Attack()函数的入口地址0x0040100F。得到函数的入口地址方法很多可以利用OllyDbg工具查看利用十六进制编辑软件UltraEdit打开password.txt文件将最后4字节改为相应的地址程序返回Attack函数结果 实验3_5:利用格式化串漏洞读取内存数据 实验3_6:用printf向内存写数据 3. 步骤
1 安装VS 6.0、OllyDbg
2 新建工程添加CPP文件。
3 编写实验代码并进入调试环境
4 按教材操作流程完成代码调试和实验操作
5 过程、结果截图完成实验报告 4. 要求提供实验步骤说明即相应截图完成实验报告。 五、实验步骤
1 实验3_2栈溢出修改相邻变量
实验代码
#include stdio.h #includestring.h void fun() { char password[6] ABCDE; char str[6]; gets(str); str[5] \0; if (strcmp(str, password) 0) printf(OK.\n); else printf(NO.\n); } int main() { fun(); return 0; } 1-1当用户输入“ABCDE”时程序返回OK 1-2当用户数去“AAAAA”时程序返回No 1-3当用户输入“aaaaaaaaaaaaa”时程序返回OK 1-4当用户输入“aaaabbbbccccddddeeeefff”时程序提示错误 实验3_3栈溢出修改返回地址
实验代码
#include stdio.h #includestring.h #includestdlib.h void Attack() { printf(Hello!:-):-):-)\n); exit(0); } void fun() { char password[6] ABCDE; char str[6]; FILE *fp; if(!(fpfopen(password.txt,r))) { exit(0); } fscanf(fp,%s,str); str[5] \0; if (strcmp(str, password) 0) printf(OK.\n); else printf(NO.\n); } int main() { fun(); return 0; } 2-1实验准备需要将“aaaabbbbccccddddeeeefff”存入password.txt而password.txt需要复制到如下图位置以供Ollbdg试调 2-2将password.txt复制到如下图位置以供vc6运行 2-3打开Olldbg导入文件查找文件发现Attack位置00401005 2-4利用十六进制编辑软件点开password 2-5修改最后4个字节修改成相应的地址05 10 40 00 2-5保存退出 2-6打开Ollbdg直接运行 2-7打开vc6运行程序函数Attack()被正常执行说明溢出修改返回成功 实验3_5:利用格式化串漏洞读取内存数据
实验代码
#includestdio.h int main(int argc,char * *argv) { printf(argv[1]); return 0; } 3-1向程序中传入普通字符串“security”将输出字符串security
3-2向程序中传入普通字符串“buffer overflow”将输出字符串中的第一个单词buffer
3-3向程序中传入字符串带有格式控制符printf会打印出栈中的数据。输入%p,%p,%p,%p,%p,%p,%p可以读出栈中的数据。
%p控制以十六进制整数方式输出指针。 4实验3_6:用printf向内存写数据
实验代码
#includestdio.h int main() { int num0x61616161; printf(Before:num%#x \n,num); printf(%.20d%n\n,num,num); printf(After:num%#x \n,num); return 0; } 4-1按下F9写入断点 4-2按下F5进入试调 4-3将下文的num值转为十六进制并在下文右侧输入num监视可疑变量num 4-4点击step intoF11代码往下运行一行发现num值改变改变 4-5-1在下方的右侧输入num获取num的地址 4-5-2点开memory开启内存窗口输入num直接跳转到num地址 4-6这里需要按step overF10来进入下一行代码第1条printf语句如果按step intoF11了话系统会跳出一个窗口让我去找printf.c文件但按step overF10就不会有这个问题 4-7点开registers跳出窗口参数从右向左依次压栈 4-8执行第3条语句第2条printf语句参数压栈内存布局如下 4-9执行第3条printf语句变量num的值已经变成了0x00000014对应十进制为20。 这是因为程序中将变量num的地址压入栈作为第2条printf()的第2个参数“%n”会将打印总长度保存到对应参数的地址中去打印结果如下。
0x61616161的十进制值为1633771873安装“%.20d”格式输出其长度为20。 执行第3条printf语句后的内存布局如下。 五、实验体会遇到的问题及解决方法
实验比较旧无法在vc2019等版本软件上运行实验进行的溢出漏洞已经被修复显示栈溢出的警告。实验参考的教材有些错误误导实验进程已靠经验解决。实验过程中也曾出现软件版本老旧陌生、操作不懂、编译语言掌握不熟等问题但都已解决。
实验比较老旧希望下次实验能比较新比较实用些。