检测到基于堆栈的缓冲区溢出_检测到堆栈粉碎

检测到基于堆栈的缓冲区溢出

打印 我敢打赌,每个Java开发人员在他们的职业生涯开始时第一次遇到Java代码的本机方法时都会感到惊讶。

我还可以肯定,多年来随着了解JVM如何通过JNI处理对本机实现的调用而使惊奇消失了。

这篇文章是关于本机方法的最新经验。 更详细地讲,使用本机方法如何导致JVM静默崩溃,而日志文件中没有任何合理的跟踪。 为了向您介绍经验,我创建了一个小测试用例。

它由一个简单的Java类组成 ,可计算文件的校验和。 为了实现Awesome Performance(TM),我决定使用本机实现来实现校验和计算部分。 该代码简单明了,因此正在运行。 您只需要克隆存储库并启动它,类似于以下示例:

$ ./gradlew jarWithNatives
$ java -jar build/libs/checksum.jar 123.txt
Exiting native method with checksum: 1804289383
Got checksum from native method: 1804289383

该代码似乎按预期工作。 当您发现自己盯着输出时使用的输入文件名略有不同(更长),就会暴露出不太直接的部分:

$ java -jar build/libs/checksum.jar 123456789012.txt
Exiting native method with checksum: 1804289383
*** stack smashing detected ***: java terminated

因此,本机方法可以很好地完成其执行,但是控件没有返回给Java。 而是,JVM崩溃而没有崩溃日志。 您应该意识到以下事实:我仅在Linux和Mac OS X上测试了示例,并且在Windows上的行为可能有所不同。

根本的问题不是太复杂,并且可能在C代码中立即可见:

char        dst_filename[MAX_FILE_NAME_LENGTH];
// cut for brevity
sprintf(dst_filename, "%s.digested", src_filename);

从上面可以明显看出,缓冲区只能容纳固定数量的字符。 输入较长时,剩余字符将被写到末尾。 实际上,这将导致堆栈崩溃,并为潜在的黑客攻击或使应用程序处于不可预测的状态打开大门。

对于C开发人员,底层的堆栈保护器机制是众所周知的,但是对于Java开发人员,可能需要更多说明。 除了使用更安全的snprintf占用缓冲区长度并且不会超出该长度之外,还可以要求编译器向堆栈中添加堆栈保护器或内存清理。 可用的安全网因编译器而异,甚至在同一编译器的不同版本之间也存在很大差异,但这是一个示例:

gcc -fstack-protector CheckSumCalculator.c -o CheckSumCalculator.so

使用适当的堆栈保护器编译代码后,运行时库或OS的实现在某些情况下可能会检测到这种情况,并终止程序以防止意外行为。

如下面的示例所示,在未进行清理的情况下编译代码时,

gcc -fno-stack-protector CheckSumCalculator.c -o CheckSumCalculator.so

运行此类代码的结果可能变得完全不可预测。 在某些情况下,代码可能看起来不错,但是在某些情况下,您可能会遇到缓冲区溢出。 尽管在此示例中使用snprintf并启用清除功能肯定会有所帮助,但该错误可能比该错误更微妙,并且不会自动捕获。

回到所谓的安全Java世界,这样的缓冲区溢出可能会破坏内部JVM结构,甚至使提供字符串的任何人都可以执行任意代码。 因此,JVM将保护值添加到内存中,如果在本机方法完成后对这些值进行了修改,则立即终止应用程序。 为什么在没有更详细的错误日志的情况下完成堕胎是一个不同的问题,不在本文的讨论范围之内。

我希望这篇文章在面对突然的JVM死亡甚至没有崩溃日志时能为某人节省一整夜的时间。 在所有平台上甚至都没有出现标准错误流中的“ stack smashed”消息,而且可能需要花费大量时间才能确定发生了什么情况,尤其是在运行没有源代码的第三方本机库的情况下。

翻译自: https://www.javacodegeeks.com/2015/09/stack-smashing-detected.html

检测到基于堆栈的缓冲区溢出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探讨 C++ 虚函数 virtual

点击蓝字关注我们来源于网络,侵删有无虚函数的对比C 中的虚函数用于解决动态多态问题,虚函数的作用是允许在派生类中重新定义与积累同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。首先写两个简单的类,类…

C++ STL详解(4)

点击蓝字关注我们来源于网络,侵删unordered_set / unordered_multiset这两个容器的方法与上一篇 C STL简介(3) 提到的 set / multiset 基本一样。但是要注意的是:这两个是无序的,基于哈希表实现的,增删改查…

js压缩图片_Web 性能优化: 图片优化让网站大小减少 62%

图像是web上提供的最基本的内容类型之一。他们说一张图片胜过千言万语。但是如果你不小心的话,图片大小有时高达几十兆。因此,虽然网络图像需要清晰明快,但它们尺寸可以缩小压缩的,使用加载时间保持在可接受的水平。在我的网站上&…

春春幼儿园堆积木大赛_春云边车

春春幼儿园堆积木大赛我有一个部署到基于NetflixOSS的云的应用程序,该应用程序具有以下结构: 本质上是一种将信息持久保存到Cassandra集群的服务。 所有应用程序都已注册到Eureka –因此,在本例中,该服务以及Cassandra节点都已在…

C++ 标准输入的行加速

点击蓝字关注我们来源于网络,侵删一、前言c/c 的标准输入函数,在输入一行数据,当数据量比较大的时候, cin 的效率是非常低的,为了加快读入的效率,可以改用 scanf,当然,还有一种利用 …

redis安装_Redis安装

redis安装本文是我们学院课程的一部分,标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外,您还会在Redis命令行上乱七八糟。 接下来是更高级的主题,例如复制,分片和集群&#xff0c…

C++ 自动锁

点击蓝字关注我们来源于网络,侵删一、锁1.锁 是 多线程编程 中一个很常用的概念,这里不多加介绍其原理,有兴趣可以参考 临界区 进行更多的了解;2.锁 一般会提供三个接口:加锁(Lock)、解锁&#…

C++ 浮点数精度判定

点击蓝字关注我们来源于网络&#xff0c;侵删一、引例看下下面这段代码&#xff0c;会输出什么结果呢&#xff1f;double x 0;for (int i 0; i < 10; i) {x 0.1;}printf("%d\n", x 1);输出如下&#xff1a;0引起这种反差的原因就是浮点误差&#xff0c;浮点数…

字节流和字符流哪个不刷新_不喜欢节流吗?

字节流和字符流哪个不刷新您别无选择–底层系统&#xff08;此处的JVM将为您完成选择&#xff09;。 我仍然记得2013年夏天&#xff0c;当时我正在运行一个项目&#xff0c;整个应用程序中只有1个URL使服务器瘫痪。 问题很简单-机器人决定以很高的速率索引我们的网站&#xff…

C/C++动态内存管理—(new与malloc)

点击蓝字关注我们来源于网络&#xff0c;侵删1.C/C内存分布虚拟地址空间分布&#xff1a;由C/C编译的程序占用的内存分为以下几个部分&#xff1a;栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放为运行函数而分配的局部变量、函数参数、返回数据、…

C++ sort()排序详解

点击蓝字关注我们来源自网络&#xff0c;侵删一.sort()简介1.为什么选择使用sort()我们经常会碰到排序的问题&#xff0c;如果我们不使用一些排序的方法那我们只能手撕排序&#xff0c;这样就会浪费一些时间。而且我们还需要根据需要去选择相关的排序方法&#xff1a;冒泡排序、…

性能测试流程_流性能

性能测试流程当我阅读Angelika Langer的Java性能教程时-Java 8流有多快&#xff1f; 我简直不敢相信&#xff0c;对于一个特定的操作&#xff0c;它们花费的时间比循环要长15倍。 流媒体性能真的会那么糟糕吗&#xff1f; 我必须找出答案&#xff01; 巧合的是&#xff0c;我最…

C++vector用法总结

点击蓝字关注我们来源自网络&#xff0c;侵删一.vector1. vector 说明1&#xff09;vector是C标准模板库中的部分内容&#xff0c;它是一个多功能的&#xff0c;能够操作多种数据结构和算法的模板类和函数库。2.&#xff09;vector之所以被认为是一个容器&#xff0c;是因为它能…

C++ STL 线性容器的用法

点击蓝字关注我们来源于网络&#xff0c;侵删1.vectorvector 是顺序容器的一种&#xff0c;是可变长的动态数组&#xff0c;支持随机访问迭代器&#xff0c;所有stl算法都能对 vector 进行操作。vector 容器在实现时&#xff0c;动态分配的存储空间一般都大于存放元素所需的空间…

redis复制_Redis复制

redis复制本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c…

JavaWeb笔记之WEB项目

一. 版本控制 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理&#xff0c;是软件配置管理的核心思想之一。 版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变&a…

c++获取数组长度

点击蓝字关注我们来源于网络&#xff0c;侵删方法一&#xff1a; 用宏函数 #define#define foo(arr) sizeof(arr)/sizeof(arr[0])int main(){int arr[4] {1,2,3,4};cout<<foo(arr)<<endl; }方法二&#xff1a;用函数模板int getArrLen1(int *a ){return sizeof(a)…

C++ 利用硬件加速矩阵乘法

点击蓝字关注我们来源于网络&#xff0c;侵删1.矩阵乘法定义2.矩阵类封装我们用 C封装了一个n m 的矩阵类&#xff0c;用二维数组来存储数据&#xff0c;定义如下&#xff1a;#define MAXN 1000 #define LL __int64class Matrix { private:int n, m;LL** pkData; public:Matri…

redis分片_Redis分片

redis分片本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c…

解析C++全排列

点击蓝字关注我们来源于网络&#xff0c;侵删1.C实现全排列的函数next_permutation(start,end)这个函数在暴力解决问题方面有很大作用&#xff0c;使用时需要引入头文件 < algorithm >&#xff0c;当当前序列不存在下一个序列时就会结束&#xff0c;若想得到一个序列的全…