首页
社区
课程
招聘
[旧帖] [分享]ollydbg的BUG之二 0.00雪花
发表于: 2011-1-17 11:07 1924

[旧帖] [分享]ollydbg的BUG之二 0.00雪花

2011-1-17 11:07
1924

最近又发现ollydbg在winproc的bug,
当利用OD开启dll的时候(为什么是dll? 小弟目前只有侦测到dll有winproc)
然后直接执行,案ollydbg上方的W按钮,也就是大家很少用到的消息窗口

如果完全没有补过bug的OD的话,可能按了W就挂点了 (悲剧阿!!)
不过幸好小弟有一版是按了不会当机了
不过按了之后,winproc有些会变成FFFFXXXX (再次悲剧!!)

小弟只好来跟踪了
然后藉由跟踪,发现

/*497AA8*/  push ebx
/*497AA9*/  call <jmp.&USER32.GetParent>
/*497AAE*/  mov [local.147], eax
/*497AB4*/  push ebx
/*497AB5*/  call 004977E0
/*497ABA*/  pop ecx
/*497ABB*/  mov [local.146], eax
/*497AC1*/  mov [local.145], esi
/*497AC7*/  push -14
/*497AC9*/  push ebx
/*497ACA*/  call <jmp.&USER32.GetWindowLongA>
/*497ACF*/  mov [local.144], eax
/*497AD5*/  push -10
/*497AD7*/  push ebx
/*497AD8*/  call <jmp.&USER32.GetWindowLongA>
/*497ADD*/  mov [local.143], eax
/*497AE3*/  push -0C
/*497AE5*/  push ebx
/*497AE6*/  call <jmp.&USER32.GetWindowLongA>
/*497AEB*/  mov [local.142], eax
/*497AF1*/  lea eax, [local.136]
/*497AF7*/  push 100
/*497AFC*/  push eax
/*497AFD*/  push ebx
/*497AFE*/  call <jmp.&USER32.GetWindowTextA>
/*497B03*/  mov byte ptr ss:[ebp-121], 0
/*497B0A*/  push 100
/*497B0F*/  lea edx, [local.72]
/*497B15*/  push edx
/*497B16*/  push ebx
/*497B17*/  call <jmp.&USER32.GetClassNameA>
/*497B1C*/  mov byte ptr ss:[ebp-21], 0
/*497B20*/  push -18
/*497B22*/  push ebx
/*497B23*/  call <jmp.&USER32.GetClassLongA>

又臭又长的代码阿   不过我还是有耐心的一个个去追踪
最后我发现在这里
/*497AB4*/  push ebx
/*497AB5*/  call 004977E0
这个call里面已修改到winproc
于是跟进去

我发现这个
/*4977F0*/  push -4
/*4977F2*/  push ebx
/*4977F3*/  call <jmp.&USER32.GetWindowLongA>
有调用到winproc
不过修改她似乎已没有用,他的返回值都是0,于是我就只好再继续跟踪下去

/*49781C*/  push 0
/*49781E*/  mov edx, dword ptr ds:[4F55C4]
/*497824*/  push edx
/*497825*/  push ebx
/*497826*/  push 4
/*497828*/  lea ecx, [local.1]
/*49782B*/  push ecx
/*49782C*/  push 004961C9
/*497831*/  mov eax, dword ptr ds:[4D5A74]
/*497836*/  push eax
/*497837*/  call _Injectcode
在这段代码执行过之后,发现winproc的值出现在[local.1] 这个里面
所以我就打算跟进去看看
结果跟进去之后,发现是跑到非程序领空去了 

后来我就想到另一个方法,利用打补钉的方法去补起来,于是我就修改了
/*497837*/  call _Injectcode 这个代码 (长度刚好跟jmp相符 )

于是我写了这么一段代码
/*57C02E*/  mov dword ptr ds:[57CFFC], ebx  //保存函式的arg5
/*57C034*/  mov dword ptr ds:[57CFF8], ecx  //保存函式的arg3
/*57C03A*/  call _Injectcode
/*57C03F*/  mov ecx, dword ptr ds:[57CFF8]
/*57C045*/  cmp byte ptr ds:[ecx+3], 80
/*57C049*/  js short 0057C077
/*57C04B*/  add esp, 1C
/*57C04E*/  push 0
/*57C050*/  mov edx, dword ptr ds:[<&USER32.GetWindowLongW>]
/*57C056*/  push edx
/*57C057*/  mov ebx, dword ptr ds:[57CFFC]
/*57C05D*/  push ebx
/*57C05E*/  push 4
/*57C060*/  mov ecx, dword ptr ds:[57CFF8]
/*57C066*/  push ecx
/*57C067*/  push 004961C9
/*57C06C*/  mov eax, dword ptr ds:[4D5A74]
/*57C071*/  push eax
/*57C072*/  call _Injectcode
/*57C077*/  jmp 0049783C

其实跟原本的代码类似,只不过为一个改变就是
/*57C050*/  mov edx, dword ptr ds:[<&USER32.GetWindowLongW>]
他从GetWindowLongA变成GetWindowLongW

测试之后过了 
希望这段文章对于补ollydbg的漏洞有用

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我的OD还用不熟悉,
2011-1-17 11:48
0
雪    币: 93
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
努力学习。。。
2011-1-17 13:23
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可怜的哇啊,加油吧
2011-1-17 13:33
0
雪    币: 6528
活跃值: (3444)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
长见识了
2011-3-15 17:19
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
能不能给个己经打好补丁的?
2011-3-28 18:09
0
游客
登录 | 注册 方可回帖
返回
//