Sun Java虚拟机畸形Gif文件处理堆溢出漏洞初步分析

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情
Sun Java虚拟机畸形Gif文件处理堆溢出漏洞初步分析

by jb绕脖

昨天晚上看到漏洞信息,于是开始整,一开始就觉得applet方面利用起来
应该比较有价值,于是我和云舒同学就往这个方向鼓捣了,我用我遗忘了
差不多的java知识整出了个简单的applet程序,用来下载并显示一个GIF
图片文件。

之后,我们便根据漏洞描述来构造GIF图片,开始理解为图片头部的宽度
和高度,后来云舒同学仔细看了下发现不是这样的,而是图片块,这个玩
意是GIF图片内部一个结构,于是我们开始琢磨GIF图片格式,云舒尝试手
工构造这个图片块的宽度,而我则开始写程序来构造,幸运的是云舒同学
很快找到了图片块宽度的地方,在UE里搜索2c,这个是图片块之间的分隔
字符,于是我们随便整了个图片,搜索2c,然后往后观察,如果后面8个字
节看起来依次很像是x,y,width,height这样的值的话,那说明找对地方了,
我们把width值改为0。

我们把图片和我的applet程序放到本地的http server下面,这里为什么要
放在http server下面是因为如果不这样做会因为权限问题,applet不能访
问本地资源。我的IE 7 with JVM 1.5.0_6成功的crash了,而云舒同学的
IE 7 with JVM 1.4.2_7 怎么也不能成功。另外测试了一台1.5.0的机器也
成功crash了,初步判断是版本的问题,我们构造的poc只能适用于1.5.0.x
系列。

晚上我回来一个人继续调试,crash基本都出现在jvm.dll的JVM_ArrayCopy
这个函数里,漏洞的具体形成的代码还没有分析到,但是连猜带蒙搞出了
个劣质的POC执行代码。调试时发现crash时eax指向堆内地址,之前看描述
也大致猜出是个堆溢出覆盖函数指针,于是我观察了下eax指向的内存,发
现有大量连续的0x01,我怀疑0x01就是堆溢出覆盖的结果,于是往宽度后
面找,果然找到了个0x01的值,我试着修改了看看,结果还真蒙对了,这
个值最终在堆里面形成覆盖,并且由于在JVM_ArrayCopy函数里的一些运算
使得ecx和edi寄存器可以控制,最终call一个edi计算得到的地址,于是才
有了这个POC。

JVM_ArrayCopy里代码片断:

.text:6D709EFA                 mov     eax, [eax]    ; eax存放被覆盖的堆内存的地址
.text:6D709EFC                 push    edi
.text:6D709EFD                 push    esi
.text:6D709EFE                 push    [ebp+arg_18]
.text:6D709F01                 mov     ecx, [eax+4]    ; ecx得到覆盖的内容,可以通过上面提到的那个值控制
.text:6D709F04                 add     ecx, 8
.text:6D709F07                 push    [ebp+arg_14]
.text:6D709F0A                 mov     edi, [ecx]    ; edi值是取得ecx作为地址指向的值,因为ecx可控制,所以edi同样可以控制
.text:6D709F0C                 push    dword ptr [edx]
.text:6D709F0E                 push    [ebp+arg_C]
.text:6D709F11                 push    eax
.text:6D709F12                 call    dword ptr [edi+24h] ; 调用edi+24h,edi可控制,这里就可以用来执行我的代码

这里看明白了,你肯定第一个想起的就是0x0x0x0x,里面存放的内容也是0x0x0x0x,又是Heap Spary,于是就整出这个没啥技术含量的POC,在我机器上测试了下IE 7和Firefox都可以成功,而且成功率较高,这个漏洞主要是出在jvm,所以应该是浏览器无关的,只要支持applet,都会受影响,所以我觉得这个漏洞危害还是挺大的。

3.GIF里偏移19B处就是宽度值,被我们设置为0,3.GIF里偏移1A3处就是我用来控制寄存器的值,这里我填的05,当然你也可以填0c,0d,Heap还是利用javascript的方式来分配的

POC地址:暂时去掉
(如果成功的话浏览器会挂掉,然后你的任务管理器里发现多一个~.exe的进程,是一个NOTEPAD.EXE,从 http://icylife.net/1.exe下载,这些因为时间问题直接拷贝的别人的硬编码的shellcode)

代码:暂时去掉
(你要在本地测试这个代码的话,要搭建个http server的环境,把poc.html 3.gif和Test.class放到一个目录里,然后修改html代码里的applet的img_src属性,指名图片的绝对路径,注意图片要和html的url在一个域下面,要不然由于跨域的安全问题会导致不能成功。)

之所以认为这个POC很没有技术含量,是因为我觉得还有几个有技术含量的事情值
得去做的:

1. 漏洞具体成因的代码分析,分析透了的话也许有更好的利用方式
2. 不要用外置的图片,直接在java程序里硬编码生成一个图片
3. 不要在javascript里的heap spary,而是利用java的特性,至少可以试试java里面
进行heap分配,分析分析java applet的内存结构的话,也许有更好的利用方式。
4. 搞定jvm 1.4.2系列的问题,如果不同版本利用方式有差异的话,可以考虑在java
里判断jvm的版本决定使用针对性的方式。
5. 不挂浏览器

最终的目的就是exp完全用一个java代码搞定,不需要额外的东西,除了一个html页用来放applet,等下面有空再深入整整看 
Java在窗口上加载显示GIF动画图像.rar Java在窗口上加载显示GIF动画图像,将多个独立的GIF图像串联在一起显示,形成GIF特有的动画形式。主要代码如下:   ImageIcon[] images; //用于动画的图标数组   Timer animationTimer;   int currentImage = 0; //当前图像编号   int delay = 500; //图像切换延迟   int width; //图像宽度   int height; //图像高度   public AnimatorIcon() //构造函数   {    setBackground(Color.white);    images = new ImageIcon[2]; //初始化数组    for (int i=0;i   images[i]=new ImageIcon(getClass().getResource("image" i ".gif")); //实例化图标    width = images[0].getIconWidth(); //初始化宽度值    height = images[0].getIconHeight(); //初始化高度值   }   public void paintComponent(Graphics g) { //重载组件绘制方法    super.paintComponent(g); //调用父类函数    images[currentImage].paintIcon(this,g,70,0); //绘制图标    currentImage=(currentImage 1)%2; //更改当前图像编号   }   public void actionPerformed(ActionEvent actionEvent) {    repaint();   }   public void startAnimation() { //开始动画    if (animationTimer==null) {    currentImage=0;    animationTimer=new Timer(delay, this); //实例化Timer对象    animationTimer.start(); //开始运行    } else if (!animationTimer.isRunning()) //如果没有运行    animationTimer.restart(); //重新运行   }   public void stopAnimation() {    animationTimer.stop(); //停止动画   }   public static void main(String args[]) {    AnimatorIcon animation = new AnimatorIcon(); //实例化动画图标    JFrame frame = new JFrame("动画图标"); //实例化窗口对象    frame.getContentPane().add(animation); //增加组件到窗口上    frame.setSize(200, 100); //设置窗口尺寸    frame.setVisible(true); //设置窗口可视    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序    animation.startAnimation(); //开始动画 立即下载

相关推荐

Oracle PLM Agile936 单点登录配置方式

Oracle PLM Agile936 单点登录配置方式

Jay的个人博客 825

JVM堆详解, 了解不迷路

上周工作比较忙,又是上线, 又是加班的, 搞得学习进度拉下来很多。上周也是有很大收获的, 自己上周, 学习到了一个牛逼的学习方法, 你通过我的学习笔记, 其实就可以看出来, 其中更多了很...

故事凌 350

逆向实战:喜马拉雅新版xm-sign算法解析与本地化生成方案

本文深入解析了喜马拉雅新版xm-sign算法的逆向过程与本地化生成方案。通过详细拆解browserid和sessionid的生成机制,提供了基于Node.js的核心代码实现,帮助开发者在不依赖官方环境的情况下生成有效签名。文章还涵盖了参数获取技巧、常见问题排查及性能优化建议,为爬虫开发者提供了实用的技术参考。

weixin_29256771的博客 299

漏洞分析中常用的堆调试支持

  我们在分析堆漏洞,如堆溢出、UAF等时常常会启用一些堆的调试支持。可能很多人都用过这些功能,比如gflags.exe,比如在分析UAF时使用的+UST +DPH等等。但是却很少有人了解这些东西到底是什么、是怎样发挥的作用。这里我就来讲解一下这几个调试机制。内容参考自《软件调试》,顺带说一句,个人感觉软件调试是一本不可多得的好书,作者不仅精通内核而且对用户层也有深入的了解,个人感觉可以和Wind...

weixin_30835649的博客 180

CODESYS安装全攻略:从下载到配置的保姆级教程(含常见问题解决)

本文提供了一份详细的CODESYS安装与配置指南,涵盖从系统环境准备、安装包下载、Development System安装到Runtime System配置的全过程。教程重点解决了安装过程中的常见权限、兼容性和连接问题,并指导用户完成第一个PLC程序的创建与调试,帮助工业自动化开发者快速上手这一通用开发平台。

kkk56的博客 421

知识图谱中的 Ontology(本体论)

本文的部分图片和内容来自中国科学院自动化研究所刘康老师的课件 Ontology(本体论) Ontology 是(特定领域)信息组织的一种形式,是领域知识规范的抽象和描述,是表达、共享、重用知识的方法。 Ontology 是知识体系构建的关键技术,知识图谱是一种人工智能技术,它的关键在于让计算机能够处理人类的知识。然而,人类脑海中的知识通常是直觉性的,我们无法将这种直觉性的知识直接输入给计算机,On...

P01son的博客 2万+

CVE-2013-0077 堆溢出分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34413802的博客 482

STM32电机PID速度控制

2.3 STM32电机PID速度控制 之前的文章,完成了直流减速电机的PWM控制、电机测速。本篇文章,将实现电机的速度闭环控制。 在公众号:小白学移动机器人,发送:速度PID,即可获得本篇文章的STM32工程文件以及相关资料。 2.3.1 解决的问题 解决带编码器直流电机的速度闭环问题。 2.3.2 PID理论 将偏差的比例、积分、微分,通过线性组合构成控制量,用控制量对被控对象进行控制,这样的控制器称为PID控制器。在连续空间中,我们通常探讨模拟PID的控制原理,如图所示: 我们这里用电机速度控制为例,

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 6万+

JVM运行原理及调优

一。 JVM介绍  1。java类加载机制     java命令 启动java程序后 会启动java虚拟机加载类 类的.class文件中的二进制数据读入到内存中 ,其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象 站在Java开发人员的角度来看,类加载器可以大致划分为以下三类:启动类加载器:Bootstrap ClassLoader,负责加载存放在JDK\jre\...

liaomin416100569的专栏 1万+

亲测解决This application failed to start because no Qt platform plugin could be initialized.

这个问题是由于环境变量改变或者Qt的路径改变导致,解决办法是在环境变量里面重新添加Qt路径。

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 2929

数据挖掘实战-基于随机森林算法的交通事故预测模型

本实验数据集来源于Kaggle,原始数据集共有209306条,该数据集包含不同地区和时间段的交通事故详细信息。它包括各种指标,例如事故日期、天气状况、照明条件、碰撞类型、受伤人数和车辆参与情况。数据涵盖多个地点和事故类型,可全面了解交通事故及其原因。具体包括:crash_date:事故发生的日期。Traffic_control_device:所涉及的交通控制设备的类型(例如交通灯、标志)。weather_condition:事故发生时的天气状况。

m0_64336780的博客 1万+

IT忍者神龟之 《Java虚拟机原理图解》JVM运行时数据区

[last updated :2014/11/7]      JVM运行时数据区(JVM Runtime Area)其实就是指JVM在运行期间,其对计算机内存空间的划分和分配。本文将通过以下几个话题来讨论JVM运行时数据区。 Topic 1. JVM运行时数据区里有什么?Topic 2. 虚拟机栈 是什么?虚拟机栈里有什么?Topic 3.栈帧是什么?栈帧里有什么?Topic

IT忍者神龟 1409

【人工智能】Gemini怎么使用智能体的能力? Gemini Gems: 定制你的AI智能体

Gems 是 Gemini 的定制版本。你可以通过设定特定的指令(Instructions),让它变成你需要的专家。一旦创建,它会记住这些设定,你不需要在每次对话时重复输入背景信息。目前创建和使用自定义 Gems 通常需要订阅(Google One AI Premium 计划)。对于大多数用户来说,Gemini Advanced 中的 Gems是使用智能体能力的最直接方式。它能让你把重复性的提示词封装成一个好用的工具。

奶爸的编程之路,也就一周冷个三天 783

java堆溢出_JVM 堆(heap)溢出案例

一、说明当虚拟机申请不到内存空间的时候,会报堆内存溢出: OutOfMemoryError:java heap space。我测试到时候,运行在 16G 内存的机器上。JVM 堆内存 默认为物理内存的1/4,即 16 * 1/4 = 4GJDK 8的 JVM 在 JDK 7 的基础上从堆内存中移除了永久代(Perm Generation),替换为了堆内存之外的元空间(Metaspace),元空间是...

weixin_29821223的博客 871

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java整形溢出漏洞_Sun Java运行时环境图形解析堆溢出漏洞

BUGTRAQ ID: 28125CVE(CAN) ID: CVE-2008-1193Solaris系统的Java运行时环境(JRE)为JAVA应用程序提供可靠的运行环境。Java运行时环境的图形解析库中在解析畸形JPEG图形的ICC配置文件时存在堆溢出漏洞,以下是漏洞代码:Limit = SpGetUInt32 (Buf);...UInt16Ptr = (KpUInt16_t *)SpMall...

weixin_36269334的博客 291

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

各种图片格式(BMP,JPG, GIF,PNG, TGA) 简单介绍

BMP格式: Windows系统下的标准位图格式,未经过压缩,一般图像文件会比较大。在很多软件中被广泛应用.所以编程的时候用opencv,是不是首先应该考虑BMP格式会比较好,因为看到很多大神的源代码也都是用的这个格式 JPEG格式: 也是应用最广泛的图片格式之一,它采用一种特殊的有损压缩算法,将不易被人眼察觉的图像颜色删除,从而达到较大的压缩比(可达到2:1甚至40:1),因为JPEG格式

hyqsong的专栏 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java jvm 之 栈帧的具体图解

qq_36382679的博客 364

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 303

第三篇 第 6 课

前置:第三篇第 1 课(stdx 引入),第二篇第 1 课(std.regex)。环境:仓颉 SDK 1.2.0。本文所有代码与输出均逐行实测。

weixin_41618057的博客 542

信创环境下PageOffice文档控件适配与实践

信创适配做到文档控件这一层,拼的已经不是"有没有国产版本",而是同一个功能在两类终端上是否真的等价。等价的标准很具体:同一次点击能得到同样的结果,同一份公文能得到同样的版式,同一个项目不需要维护两套代码。这背后是三件并不轻松的工作:服务端用一套接口同时支撑两类终端,客户端把两种系统与四种芯片的安装包分发清楚,文档内核层由产品侧跟着 WPS 的版本走。浏览器这一层的压力,则被收进了产品自己的窗口里——升级节奏由产品掌握,不再交给运气。

zi_wu_xian的专栏 333

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 567

Java 集合容器高频面试题全解:HashMap 树化阈值、1.7 死循环与 ConcurrentHashMap 演进(2026 招聘 JD 真题复盘)

HashMap 树化阈值 8 的泊松分布依据、退化阈值 6 的防抖设计、JDK 1.7 头插成环死循环的排查与修复、1.8 尾插后为何仍线程不安全、ConcurrentHashMap 放弃分段锁的原因与 ForwardingNode 协作扩容、computeIfAbsent 死锁陷阱、大集合找重复的场景题选型,附三层追问链自测。题目来源为 38 期公开招聘 JD 样本与字节、拼多多、建行、美团、快手公开面经。

蒙眼过河 423

spdlog 同步日志库使用详解

spdlog是一个轻量级 C++ 日志库,支持同步日志、异步日志、多线程日志、日志文件轮转和自定义日志格式。对于嵌入式 Linux 应用开发,我建议先使用。它可以帮我们完成:日志级别过滤。时间戳和线程 ID 输出。日志格式化。终端和文件输出。多线程安全写入。日志文件按大小或时间轮转。我们不需要自己实现互斥锁、文件写入、日志格式化和轮转等底层功能。

zengjiajun2006的博客 1121

JavaSE通关手册:数据类型与变量

代码无需额外处理,编译时编译器自动完成转换。

xys_678的博客 231

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 368

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 179
上一篇: PCI cards the next haven for rootkits?
下一篇: Sina UC 2006 Activex SendChatRoomOpt Exploit
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值