缓冲区溢出漏洞分析
一、实验目的
熟悉软件安全需求分析方法,掌握软件安全分析技术。
二、实验软硬件要求
1、操作系统:windows 7/8/10等
2、开发环境:VS 6.0(C++)、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>
- #include<string.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>
- #include<string.h>
- #include<stdlib.h>
- void Attack()
- {
- printf("Hello!:-):-):-)\n");
- exit(0);
- }
- void fun()
- {
- char password[6] = "ABCDE";
- char str[6];
- FILE *fp;
- if(!(fp=fopen("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:利用格式化串漏洞读取内存数据
实验代码
- #include"stdio.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向内存写数据
实验代码
- #include"stdio.h"
- int main()
- {
- int num=0x61616161;
- 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 into(F11),代码往下运行一行,发现num值改变改变
4-5-1在下方的右侧输入&num,获取num的地址
4-5-2点开memory,开启内存窗口,输入num,直接跳转到num地址
4-6这里需要按step over(F10)来进入下一行代码(第1条printf语句),如果按step into(F11)了话,系统会跳出一个窗口让我去找printf.c文件,但按step over(F10)就不会有这个问题
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等版本软件上运行,实验进行的溢出漏洞已经被修复,显示栈溢出的警告。实验参考的教材有些错误,误导实验进程,已靠经验解决。实验过程中,也曾出现软件版本老旧陌生、操作不懂、编译语言掌握不熟等问题,但都已解决。
实验比较老旧,希望下次实验能比较新,比较实用些。
相关文章:

缓冲区溢出漏洞分析
一、实验目的 熟悉软件安全需求分析方法,掌握软件安全分析技术。 二、实验软硬件要求 1、操作系统:windows 7/8/10等 2、开发环境:VS 6.0(C)、OllyDbg 三、实验预习 《软件安全技术》教材第3章 四、实验内容&#…...

【高阶数据结构】红黑树(C++实现)
⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:C进阶 ⭐代码仓库:C进阶 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…...

算力百川汇蓝海,商海荡漾绘宏图
算力百川汇蓝海 01 新兴技术呼唤算力 崭新时代逐浪前,科技浪潮涌向天。 人工智能、数字孪生、元宇宙等新兴技术的迅速发展,引爆全球算力需求的规模式增长。尤其,以ChatGPT为代表的人工智能技术发展,引发了全球算力需求的进一步增长…...

ORACLE 内存结构之系统全局区(SGA)
每个 Oracle 数据库实例都会在内存中分配一个很大的内存结构, 称为系统全局区(System Global Area), 这是一个大型的共享内存结构,每个Oracle进程都会访问它。 在Linux/Unix操作系统上,SGA是一个物理实体,使用操作系统命令能“看到它”。 它被操作系…...
主要文档分享网站一览
136****0621的全部文档-第1页-原创力文档 目前能提供上传文档并付费的网站: 1、得利文库 www.deliwenku.com 先说我自已的吧!见笑了 2、百度文库 wenku.baidu.com 这个算头部了、有流量倾斜、但资源多、用户现在上传的大部份为重复的,…...
CPU访问一个虚拟地址的整体流程
一、虚拟地址转换成物理地址 涉及到的部件: MMU:虚拟地址—MMU—>物理地址。MMU会控制整个流程(查快表、查慢表等等)TLB快表:组号(若为组相联TLB)、TLB标记、有效位、页框号页表(…...

UE5 虚幻引擎 如何使用构造脚本(Construction Script)? 构造脚本的奥秘!
目录 1 构造脚本(Construction Script)1.1 介绍1.2 案例1:利用样条组件程序化生成树木1.2 案例2:利用样条组件和样条网格体组件程序化生成道路 1 构造脚本(Construction Script) 1.1 介绍 问题:…...

Mysql高级——数据库设计规范(2)
8. ER模型 ER 模型中有三个要素,分别是实体、属性和关系。 实体,可以看做是数据对象,往往对应于现实生活中的真实存在的个体。在 ER 模型中,用矩形来表示。实体分为两类,分别是强实体和弱实体。强实体是指不依赖于其…...

c++-string
文章目录 前言一、STL库介绍二、标准库中的string类1、string类介绍2、string类使用3.1 string类的构造函数3.2 string类对象的容量操作3.3 string类对象的遍历操作3.4 string类对象的访问操作3.5 string类对象的修改操作3.6 string类对象的字符串操作 三、模拟实现string类四、…...

KNN-K近邻算法(K-Nearest Neighbors)
k近邻算法的特点 思想极度简单应用数学知识少(近乎为零)效果好(缺点?)可以解释机器学习算法使用过程中的很多细节问题更完整的刻画机器学习应用的流程 k近邻算法 k近邻算法整体是这样的一个算法,我们已经知道的这些数据点其实是…...
ChatGPT:理解HTTP请求数据格式:JSON、x-www-form-urlencoded和form-data
ChatGPT:理解HTTP请求数据格式:JSON、x-www-form-urlencoded和form-data 使用postman发送一个post请求,在body里面加上了form-data数据,namexxx,age23,为什么输出request.body()得到的是这样的结果 -------…...

字符集、IO流(一)
字符集、IO流(一) 各位同学,前面我们已经学习了File类,通过File类的对象可以对文件进行操作,但是不能操作文件中的内容。要想操作文件中的内容,我们还得学习IO流。但是在正式学习IO流之前,我们还需要学习一个前置知识叫做字符集,只有我们把字符集搞明白了,再学习IO流…...
相乘(蓝桥杯)
相乘 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小蓝发现,他将 1 至 1000000007 之间的不同的数与 2021 相乘后再求除以 1000000007 的余数,会得到不同的数。 小蓝想知道,能不能在 1 …...

[AFCTF 2018]你能看出这是什么加密么
最开始是我对rsa的小小的理解 rsa也就是非对称加密算法,拥有公开的加密密钥和解密密钥,这也是我们写脚本的基础 选取素数p和q,计算乘积npq,以及(n)(p-1)(q-1)。(欧拉函数) 选择一个e值作为密钥…...

基于springboot+vue的重庆旅游网(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...
pymysql执行delete删除操作
视频版教程 Python操作Mysql数据库之pymysql模块技术 执行delete操作,雷同前面的update操作 from pymysql import Connectioncon Nonetry:# 创建数据库连接con Connection(host"localhost", # 主机名port3306, # 端口user"root", # 账户…...

25862-2010 制冷与空调用同轴套管式换热器
声明 本文是学习GB-T 25862-2010 制冷与空调用同轴套管式换热器. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了制冷与空调用同轴套管式换热器(以下简称"换热器")的术语和定义、基本参数、要 求、试验、检验规则、标…...

JetBrains 产品安装插件(plugins)的两种方式
安装分为在线、离线两种方式: 在线方式: File > Settings > Plugins 搜索插件 Install 即可 离线方式: 官网:https://plugins.jetbrains.com/ 搜索到插件后,点击 "Get",选择自己安装的…...

SOLIDWORKS二次开发
SOLIDWORKS是一套三维设计软件, 采用特征建模、变量化驱动可方便地实现三维建模、装配和生成工程图。SOLIDWORKS软件本身所具有的交互方式,可以使用户对已生成模型的尺寸、几何轮廓和相互约束关系随时进行修改, 而不需要编程。SOLIDWORKS软件本身的方程式可以实现简…...
Linux下压缩和解压缩
在Linux下,您可以使用多种命令来进行文件和目录的压缩和解压缩操作。以下是一些常见的压缩和解压缩命令: tar:tar命令可用于创建和提取tar压缩文件。例如,要创建一个名为archive.tar的.tar文件,可以使用以下命令&#…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...