Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当写入一个本地数组的字符出现在另一个本地数组中时,这是否是基于堆栈的缓冲区溢出的一个示例?

当写入一个本地数组的字符出现在另一个本地数组中时,这是否是基于堆栈的缓冲区溢出的一个示例?
EN

Stack Overflow用户
提问于 2013-09-18 19:53:12
回答 3查看 212关注 0票数 3

为了更好地理解该漏洞,我试图使用下面的代码触发缓冲区溢出。

我有某些字段,有些字段指定了一个宽度以防止溢出,但我在一种情况下(firstName)忽略了这一点,以使溢出成为可能:

代码语言:javascript
运行
AI代码解释
复制
char firstName[21], surName[31], job[16];

printf("Enter first name: ");
scanf("%s", firstName);
printf("Enter surname: ");
scanf("%30s", surName);
printf("Enter job name : ");
scanf("%15s", job);

现在,当我输入以下内容时:

代码语言:javascript
运行
AI代码解释
复制
UmbertoTestingOverflow
Example
Janitor

记录的变量如下:

代码语言:javascript
运行
AI代码解释
复制
UmbertoTestingOverfoExample
Example
Janitor

根据我对缓冲区溢出的理解,名字中的额外字符应该会进入另一个字段,但在这种情况下,它从另一个变量中获取用户输入并将其添加到名字中。那么,这种缓冲区溢出行为还是其他原因造成的呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-18 19:59:54

是的,这是堆栈上的溢出缓冲区。

firstName输入确实溢出到surName中。但是在输入时,您更改了surName,并且它用Example覆盖了字符。

因为您溢出了firstName,所以字符串上没有空终止符,所以看起来firstName比实际长。然后,它的“结束”被覆盖(因为这些字节属于另一个变量)。

这实际上是未定义的行为。您不知道编译器将把缓冲区放在堆栈中的位置。

为了防止缓冲区溢出,您应该使用fgets来读取字符串,而不是scanf

代码语言:javascript
运行
AI代码解释
复制
fgets( firstName, 21, stdin );
票数 3
EN

Stack Overflow用户

发布于 2013-09-18 20:00:35

是的,这是缓冲区溢出行为。

第4行,名为scanf,确实遇到了缓冲区溢出。它保存了从firstName开始的长名称,并继续到surName占用的空间中。当然,它的结尾是零终止。

第6行之后,用新的姓“”覆盖,从surName开始。它还以零终结者结束。

然后,firstName的printf从firstName的开头开始,在firstName结束后继续到surName,直到找到一个零终止符。

当缓冲区溢出被用作漏洞时,通常是firstName在surName之后被扫描的位置,这样它所写入的溢出本身就不会被覆盖。

票数 1
EN

Stack Overflow用户

发布于 2013-09-18 20:02:52

是的,您将第一个数组溢出到第二个数组中。

在第一个任务中,firstName包含UmbertoTestingOverflosurName的第一个字符设置为w。在第二个任务中,surName被设置为Example

当您打印firstName时,它一直打印字母,直到它遇到\0字符,该字符位于surName的末尾。与job相关的内存从未改变过。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18885905

复制
相关文章
arthas命令watch观察方法调用(下)
上期讲过了arthas命令watch观察方法调用(上)中官方文档和官方的Demo演示,本期讲一下watch命令的实践,主要内容是针对Demo里面用到的命令进行演示和一些想法的尝试。其中用到了部分ognl的语法,这方面我比较菜,只能照猫画虎,目前来说足够我用了。还有一部分监控方法性能细节的功能将会在接下来trace这个命令中讲解。
FunTester
2020/05/18
1.3K0
arthas命令watch观察方法调用(上)
今天分享一个非常重要的命令watch,官网定义这个方法的功能如下:让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
FunTester
2020/05/18
7860
Rx 和 Tx 是什么
我们在 ifconfig 查看网卡配置时或者嵌入式开发的时候,经常会看到rx/tx缩写。
HoneyMoose
2021/07/22
3.9K0
Rx 和 Tx 是什么
方法调用
参数传递值传递:在 Java 方法中传递参数,形参本质是实参的副本。参数是基础数据类型:对形参的改变不会影响实参。参数是指向对象的引用(包括数组、字符串):对对象数据进行更改会影响实参,但改变引用指向的对象不会影响实参。public class Test{ public static void main(){ int i = 0; int[] arr = {0}; test(i, arr); System.out.print(i);
Qwe7
2022/08/03
1.9K0
velocyto的正确安装方法
如果你已经尝试了100种错误方法,恭喜你,找到家了。这个是99.9%能保证成功的安装方式。如果你第一篇就看到这个,更加恭喜你,你少走了一万里弯路!
生信技能树jimmy
2022/01/10
4.7K0
Java 方法里面 调用异步的 方法
先把longTimeMethod 封装到Spring的异步方法中,这个方法一定要写在Spring管理的类中,注意注解@Async
一写代码就开心
2022/11/21
3.2K0
正确使用 equals 方法
Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。
崔笑颜
2020/06/08
9600
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
调用 jclass GetObjectClass(jobject obj) 或 jclass FindClass(const char* name) 方法 , 获取 jclass 类型变量 ;
韩曙亮
2023/03/27
8.6K0
【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
网页长截图的正确方法
在昨天,我准备将测试报告通过微信发送给同事,但是他没有权限查看链接内容。所以我准备将测试报告从网页截图发给他,此时我要用到网页长截图,但是又不想下载花里胡哨的工具,经过研究,谷歌浏览器自带页面长截图功能,现在就来分享给大家。
Python研究所
2022/06/17
2.2K0
网页长截图的正确方法
Github的正确使用方法
在了解了Git的基本用法后(如果你还未了解 Git 的基本使用方法,建议你先话点时间阅读下《 Pro Git 》这本书),相信你已经开始跃跃欲试了,那么我就说下如何正确的使用 Github。下面的图描述了使用 Github 的基本流程:
Allen Cheng
2018/09/10
5.4K0
Github的正确使用方法
currentThread()方法可返回代码段正在被哪个线程调用的信息
currentThread()方法可返回代码段正在被哪个线程调用的信息。首先给出一个正常的例子:
用户7365393
2021/10/07
5710
宏程序的调用方法
② 当 M98 程序段包含其他 NC 指令(如:G01 X100.0 M98 P )时,在该指令执行完后调用子程序,而 G65 则无条件调用宏程序。
lrglu
2022/05/16
2.5K0
宏程序的调用方法
方法的定义及调用
* 方法:其实就是完成特定功能的代码块 * 定义格式: * 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2...) { * 方法体; * return 返回值; * } * 格式解释: * A:修饰符 目前记住public static * B:返回值类型 用于限定返回值的数据类型 * C:方法名 为了方便我们调用方法的名字 * D:参数类型 用于限定调用方法时传入的数据的类型 * E:参数名 用于接收调用方法时传入的数据的
葆宁
2019/04/18
7520
[inside hotspot] java方法调用的StubCode
众所周知jvm有invokestatic,invokedynamic,invokestatic,invokespecial,invokevirtual几条方法调用指令,每个负责调用不同的方法, 而这些方法调用落实到hotspot上都位于hotspot\src\share\vm\runtime\javaCalls.hpp的JavaCalls :
racaljk
2019/02/26
3.4K0
方法的定义和调用
为每个运算符单独的创建一个新的类和main方法,我们会发现这样编写代码非常的繁琐,而且重复的代码过多。能否避免这些重复的代码呢,就需要使用方法来实现。 方法:就是将一个功能抽取出来,把代码单独定义在一个大括号内,形成一个单独的功能。 当我们需要这个功能的时候,就可以去调用。这样即实现了代码的复用性,也解决了代码冗余的现象。
共饮一杯无
2022/11/28
8540
关于同步方法里面调用异步方法的探究
我在写代码的时候(.net core)有时候会碰到void方法里,调用async方法并且Wait,而且我还看到别人这么写了。而且我这么写的时候,编译器没有提示任何警告。但是看了dudu的文章:一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相 了解了,这样写是有问题的。但是为什么会有问题呢?我又阅读了dudu文章里提到的一篇博文:.NET Threadpool starvation, and how queuing makes it worse 加上自己亲手实验,写下自己的理解,算是对dudu博文的一个补充和丰富吧。
ShenduCC
2020/05/01
2.6K0
对象的属性方法调用的两种方法
json格式创建一个对象: //        用原生形式创建对象(也叫用json格式创建对象)就是花括号新建         var mix2={color:'骚粉色',         size:'6.44寸',         weight:'314g',         price:'3299元',         call:function(){             alert('可以打电话')         },         surf:function(){             a
十月梦想
2018/08/29
1K0
RegQueryValueEx正确使用方法
      项目中需要读取注册表中的HKEY_CLASSES_ROOT主键下一个子键的值,看了看MSDN的说明,有RegOpenKeyEx和RegQueryValueEx两个函数可以用。也没仔细阅读函数说明,就写了一段简单的代码来测试: HKEY hKey; WCHAR szLocation[MAX_PATH] = {'\0'}; DWORD dwSize = sizeof(DWORD); DWORD dwType = REG_SZ; LPCTSTR studioPath = TEXT("insta360\
24K纯开源
2018/01/18
2.5K0
RegQueryValueEx正确使用方法
点击加载更多

相似问题

Rx .NET观察函数调用的正确方式是什么

111

观察LiveData的正确方法是什么?

27

调用方法的正确方法是什么?

12

为每个观察值调用RX Java2 onComplete方法

124

在xml中设置/观察实时数据的正确方法是什么?未能调用观察者方法

27
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文