up777
2.bindiff使用
详见安装目录的:file:///C:/Program%20Files%20(x86)/zynamics/BinDiff%204.2/doc/index.html
bindiff是结合IDA一起使用的,首先使用IDA打开一个可执行文件(如打补丁之后的exe),保存配置idb,保持这个ida;然后再用ida打开要比较的文件(如打补丁之前的文件)
,保存配置idb,关掉这个ida
。
之后在打补丁之后的exe
的IDA窗口,使用快捷键crtl+6 ,
弹出bindiff插件窗口,选择Diff Database选择要比较的idb文件
,这里就是OldEnqEdit.idb
bindiff就会比较两个可执行文件之间函数的差异。从上到下看,可以看到差异较大的函数是哪个。
在关闭IDA是可以选择保存bindiff生成的信息,之后再次打开直接选择loadresults 可以达到一样的效果。
各位已经看到了上面用来做演示的程序了,是wps的公式对象程序,分别是wpsoffice2010_10.1.0.6930和当前官网上最新的。关注厄运公式漏洞的朋友知道在office中这个模块有两个漏洞一个是11882,而另外一个是0802,而这个模块在office中已经被取消了(也就没有0802的补丁了)。
那么,wps office有没有类似的公式对象呢?如果有,有类似的漏洞吗?都被正确的修补了吗(尤其是第二个)?
要找到wps公式对象的位置很简单 ,打开wps,
弹出公式编辑器
在任务管理器中找到程序路径即可。
4.小试牛刀
这里比较这两个版本的公式对象程序
接着第二步的往后讲,
看最下面三个函数
同时也用IDA打开OldEqnEdit.exe
4.1
sub_4200E2
new:
__int16 __cdecl sub_4200E2(char *a1, __int16 a2, int a3, __int16 a4)
{
unsigned int v4; // ecx@1
__int16 v6; // [sp+8h] [bp-8h]@1
char *v7; // [sp+Ch] [bp-4h]@1
v6 = sub_420362();
v7 = (char *)&unk_459480 + 49 * (v6 - 1);
v4 = strlen(a1) + 1;
if ( v4 >= 0x21 )
v4 = 32;
qmemcpy(v7, a1, v4);
...
}
__int16 __cdecl sub_4200E2(char *a1, __int16 a2, int a3, __int16 a4)
{
unsigned int v4; // ecx@1
__int16 v6; // [sp+8h] [bp-8h]@1
char *v7; // [sp+Ch] [bp-4h]@1
v6 = sub_420362();
v7 = (char *)&unk_459480 + 49 * (v6 - 1);
v4 = strlen(a1) + 1;
if ( v4 >= 0x21 )
v4 = 32;
qmemcpy(v7, a1, v4);
...
}
New中v7是局部变量,从传入a1参数拷贝到v7使用的是
qmemcpy(v7, a1, v4);v4肯定小于等于32,嘿嘿和office 公式对象字体名称最大长度一样啊(不明白的可以搜搜CVE-2017-11882相关的文章看看)
Old
__int16 __cdecl sub_4200E2(char *a1, __int16 a2, int a3, __int16 a4)
{
__int16 v5; // [sp+8h] [bp-8h]@1
char *v6; // [sp+Ch] [bp-4h]@1
v5 = sub_420362();
v6 = (char *)&unk_459480 + 49 * (v5 - 1);
strcpy((char *)&unk_459480 + 49 * (v5 - 1), a1);
...
}
Old中是直接从
a1
拷贝字符串到
v6
,可以造成栈溢出
。
从sub_4200E2来看,感觉就是厄运公式的补丁嘛,嘿嘿。
4.2接着看第二个
sub_41189B
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-4-13 13:03
被树梢之上编辑
,原因: