首页
社区
课程
招聘
[讨论]第15章MS07-014的问题
发表于: 2008-11-3 11:11 12230

[讨论]第15章MS07-014的问题

2008-11-3 11:11
12230
光盘中给了MS07-014的POC,版大给里面加了calc.exe。在本地虚拟机win2000 SP4运行,没有成功。按照书中介绍调了下,将触发漏洞的八字节地址0x34FF0000和0x300033D4稍做修改,可以成功跳转到书中所说文件偏移:0xF725的shellcode处。但是发现如下问题:
1、打开POC后,闪过黑框,生成了89K大小的WC.exe,实际上是calc.exe,但是并没有运行计算器。进程列表中有winword进程仍在运行。
2、书中介绍的0xF725处的shellcode貌似有验证,因为将这段代码其他shellcode,word直接报错。
请各位说说,这是怎么回事?
问题太菜,希望可以和各位牛牛多交流,讨论!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
2
你的Word是什么版本?
2008-11-3 12:03
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢vxasm的及时答复!
我的试验版本是:win2003 11.5604.5606
刚又跟了一段,发现calc.exe在文件偏移0x18200到文件尾,是和0x92异或过的。
顺便问一下:文件偏移:0xf725处的shellcode是啥功能啊,看了半天没分析出来。
后面跟着的shellcode是解码calc.exe,动态载入writefile,createprocess等几个函数,然后启动wc.exe。初步分析,还有很多疑点正在解决中。
2008-11-3 15:21
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
刚才把POC中的shellcode跟了下,笔记如下,有一段还是没搞明白,请各位指点:
1、POC是《0day》书附带光盘中,包含calc.exe,环境:win2000+office2003
2、POC中文件偏移:0xF7ED开始的八字节0x34FF0000 0x300033D4将覆盖某次调用的ebp和ret地址,由于机缘巧合,返回前执行的代码ret 14处(距离ret地址5个地址远)的地址保存的是doc文件中0xF725的代码,所以只要两次返回就可以执行到0xF725的代码。其中0x300033D4就是第二次RET。在本机调试后,改为0x300033C4,可以顺利执行到文件偏移0xF725.但是计算器没有正确执行。
3、书上说0xF725代码是shellcode,但是换成自己的shellcode,word报错,感觉不太象,或有可能有验证保护。这一段始终没有搞明白,水平太菜。。。。。。。
4、分析随后的代码,发现是文件偏移0x16734处的代码,功能是将文件偏移0x18200处的代码逐字节与0x88异或。0x18200处是已经异或过的calc.exe代码。
5、随后执行的是文件偏移0x167ee处的代码,这段代码的功能是根据传入的hash值在PE头中寻找函数地址,后面会反复用到这个函数。
6、第一个寻找的函数是CreateFileMappingA,传入的hash值是BD2BE000
7、第二个寻找的函数是WriteFileEx,传入的hash值是0xC8FF4053
8、第三个寻找的函数是CloseProfileUserMapping,传入的hash值是C8FF4053
9、然后寻找函数CloseHandle,hash值BFD87FEC
10、然后是CreateProcessA,hash值F390B59F,调用createProcess时传入的参数:lpApplicationName为NULL,lpCommandLine为“wc”,不知道没有成功运行计算器是不是这也原因。但是返回值为1,显示成功运行。奇怪了。
11、随后开始对解过码的calc.exe进行再编码,这里很奇怪,当时解码的时候是与0x88异或,但是这里编码却与0x92异或,导致只能正确释放一次计算器文件。将92改为88,解决只能正确释放一次的问题。
12、int 2E
2008-11-3 22:04
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
自己顶一下,大家帮帮忙!
2008-11-4 22:36
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
6
你的分析基本是正确的,不过少许地方还有出入,以下是我的调试笔记,如有不对,欢迎交流讨论。

测试环境:2KSP4,Office2003
需要修改返回地址为:300033c4
最终返回到:9A2335(这个值随机,但低16位总是2935),执行Shellcode。

Shellcode分析:
1 几次跳转后来到9A23AF处,调用INT 2E(EAX=8,查表可知为AddAtom),判断返回值,如果不等于5,则循环调用,直到等于5;
2 把39322143与EDI指向的缓冲区值作比较,直到相等(即EDI指向的地址数据为39322143),EDI的值从106730开始,每次循环加10000(ECX左移16位),然后跳转到EDI;这一步很重要,应该是因为存放在文件中的Shellcode数据会被WORD随机复制到内存某一区域,所以只能通过特定的标识(39322143)来定位。
3 把EDI的值加上1ACC,得到一个低16位为8200的值,然后用该值为开始地址,将数据与0x88异或;此地址开始处就是经过0x88编码的calc.exe数据,这样做是为了恢复原始数据;
4 调用0E8967EE,返回CreateFileA的地址并调用它,第一个参数为"wc.exe",意为创建wc.exe文件;
3 调用0E8967EE,返回WriteFileEx的地址并调用它,以0E898200(即3中的EDI值)地址为开始把缓冲区写入到文件,长度为16510;
4 调用0E8967EE,返回CloseHandle的地址并调用它,关闭文件;
5 调用0E8967EE,返回CreateProcessA的地址并调用它,启动wc.exe,实际上就是calc.exe;
6 最后再次调用INT 2E(EAX=E1,查表可知为TerminateThread),结束;

0E8967EE函数和书中前面讲解过的函数一样,就是在Kernel32.dll中寻找匹配的函数,输入参数是所要寻找函数名的异或值(4字节);异或算法是把函数名的每一个字符先存到EAX中,累加到EDI,再ROR EDI,4D,循环以上过程:指令如下:
add edi, eax
ror edi,4d

关于你的问题,我的看法如下:
3 文件偏移0xF725处是shellcode代码没错,不过此处的代码组织可能和WORD文档的格式有关,所以不能轻易换为其它的shellcode。你应该也看到了,在Shellcode开头连续几个JMP,似乎没有必要,我猜测可能就是为了符合特定的格式。
10 因为在同目录下已经生成了一个wc.exe,所以CreateProcess调用以wc为参数是没错的。
11 这里我也觉得奇怪,为什么还要对内存缓冲区的数据进行异或0x92,因为此时计算器进程都已经启动了。不知道是不是为了让WORD继续正常运行用的?
12 为什么要用INT 2E,而不直接调用函数呢?我也不明白,呵呵。我在调试过程中有几次蓝屏,不知道和这个有没有关系。


总结一下,文件类型的漏洞似乎很难做到通用,在我的测试中,这个例子成功利用的机率大概为1/3。
2008-11-4 23:11
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常感谢vxasm的详细答复。
我确实没有注意你第1、2点的分析,看来功力和心细程度还差很多。我再仔细跟一遍看看。
但是我跟到CreateProcessA的时候(之前WC.exe已经释放到同目录下),函数调用够eax是1,应该是运行成功的。将压入栈的参数在C程序下模拟,成功运行wc.exe。但在word运行中只是闪过黑框,WC.exe就是运行不了啊。真是很奇怪。
关于第11点中与0x92异或,我觉得是word会把内存中的数据写回磁盘文件,所以要再恢复成加密状态。个人理解。
再次感谢版主的答复。
2008-11-6 14:50
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
8
最后异或0x92并写回磁盘文件的话,那下次开始时异或0x88就不对了,这样会永远只有第一次才能利用成功,而实际情况下似乎并不如此,而且数据似乎并没有改变。这个问题看来只能等POC作者来回答了。

在我的调试中发现有时候生成的wc.exe数据不正确(即异或了0x88但没有恢复正确的数据),这可能是有时候运行不成功的原因所在。

继续调试吧,有什么心得的话别忘了贴上来。
2008-11-6 17:24
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你的问题我遇到过,后来重新从网站上下了15章的代码,发现第一次正确生成wc.exe,第二次就错了。后来再运行就变成有时可以,有时不能正确生成。仔细算了下,应该是三次正确生成一次。先和0x88异或,再和0x92异或,重复两次后,就能正确一次
把0x92改成0x88,每次都可以正确生成wc.exe。
个人觉得是POC作者与我们开的玩笑!
有点抓狂了,createprocessA返回1,但是计算器就是没运行起来。跟进createprocess,水平太菜,晕了
2008-11-6 18:29
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
实在想不出着了,使用了最笨的办法,把通过0x39322143标识定位的真正的shellcode抠出来,用书中调试shellcode的办法:
unsighed char shellcode[]={}
main()
{
unsigned char* re = (unsigned char *)shellcode;
_asm{
mov edi , re;
jmp edi;
}
}
其中shellcode中需要简单的修改几处地址。跟了一遍,计算器完全可以正常运行。
所以书中你给POC的shellcode应该没有问题的,个人理解问题出在word中,不让生成子程序?还是什么其他的问题,看在小弟调这么费劲的份上,请各位指点下吧
拜托了!
2008-11-6 20:34
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
问题解决了,将虚拟机还原,重新装office2003,就可以顺利执行计算器。谢谢Vxasm的细心解答。
2008-11-8 21:14
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
12
能够每次都成功吗?

从微软网站上可以看到,其实MS07-014里包含了WORD的多个漏洞,而这个POC并未标明具体是哪个漏洞,我觉得要彻底搞清楚这个POC的原理,只有从这个POC是针对哪个漏洞来利用的着手研究。
2008-11-10 09:56
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
对,只要把后来异或的那个0x92改为0x88就可以每次都成功了。我仅是从老大说的那八个字节触发后开始分析的,之前触发还真没怎么研究。不知道如何下手,请问Vxasm有什么思路或方法着手呢?
2008-11-11 09:13
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
14
在漏洞领域我也处于学习阶段,没啥心得。
不过觉得这种涉及到WROD格式的漏洞太复杂了,不适合学习,我更愿意去搞些如MS08-067之类的大众型漏洞。

希望有空多交流。
2008-11-11 17:01
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
由于文档格式的复杂性,确实增大了漏洞分析的复杂性。
我也因为做这方面的毕设,刚刚开始着手,希望可以多交流。
我的QQ:24115536.
2008-11-11 20:32
0
雪    币: 267
活跃值: (24)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
16
分析得很深入,确实应该写写调试笔记!
2010-1-7 13:25
0
游客
登录 | 注册 方可回帖
返回
//