首页
社区
课程
招聘
[原创]利用StrongOD漏洞反调试
发表于: 2014-6-19 12:51 48843

[原创]利用StrongOD漏洞反调试

2014-6-19 12:51
48843
/**************************************
/* 作者:半斤八兩
/* 博客:http://cnblogs.com/bjblcracked
/* 日期:2014-06-18 21:01
/**************************************


只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

AntiArp_木马病毒程序.7z  解压密码: pediy
(不确定这个是不是木马程序,大家最好在虚拟机下调试.)

环境:我只测试了 xp x86 win7 x64 其它平台未测试.
插件:Strongod 0.4.5 (感谢海风前辈写了一个这么优秀的免费插件.)

今天 J 师傅又发来一个好玩的东西了.只要用 OD 加载,就会报错.



一看到这个提示,我第一反映是这个 PE 损坏的? 不能运行? 但是我双击是可以运行的,只是没有 GUI.

双击是可以运行,我尝试 attach 上去,也是可以的.那么就可能是运行时检测调试器?我就再想会不会是 tls 在捣鬼?


004001C8    00000000    DD 00000000    ;  TLS Table address = 0

004001CC    00000000    DD 00000000    ;  TLS Table size = 0


再查看了 tls 后,全为0. 这时候我就想,可能是系统的漏洞? 要么就是 ollydbg 自身的漏洞?

首先要来排除是 ollydbg 的漏洞, 我就换了几个 ollydbg 尝试. 结果都是一样的,都会弹错误.

这时候我就开始以为是系统的 PE 相关的漏洞.因为我是在 xp 下的,我最后又拿 ntsd 调试了一下.

用 ntsd 调试,发现可以正常加载.并运行.并没有发现什么异常 :(

那么我们就能除非系统漏洞了,那么就是 ollydbg 的漏洞.

Ollydbg 加载时有错误码,我们不知道错误码的意思,可以在网上搜索一下.

C0000142 STATUS_DLL_INIT_FAILED

从字面意思上大概能猜出意思,是在 DLL 初始化时的错误.

不过我比较迟钝,当时没有反映过来.它的意思. 后面又在一个俄国人的论坛上看到了也有遇到类似情况的贴子.



就算这篇贴子是英文写的我也不一定知道意思,更何况是英文的.但是, 我就正好看到 Plugin 这个单词. 正好还认识..

然后我就想到错误码的意思,瞬间就反映过来了.

我把 ollydbg 的插件目录改名,然后再加载,就可以正常运行了. 那么这样就知道也不是 ollydbg 的漏洞,而是 ollydbg 的某个插件有问题.

剩下的就是排除了.我运气比较好,试了第二下,就找到是 strongod 的问题.

知道是 strongod 的问题后,就要确定是哪个功能有问题. 剩下的就是一个个排除. 这个漏洞,程序并没有得到执行.就产生了. 自然就会想到应该是 PE 相关的漏洞. 而 strongod 上面,和 PE 相关的,好像就一个 !*Kill BadPE Bug. 于是我把这个勾去掉. 再重新加载. 果然就没有异常了.



现在程序可以正常执行了.

现在我们已经知道漏洞根源了.现在我们要搞清楚,漏洞是如何产生的.

Strongod 是做为 ollydbg 的模块运行起来的. 也就是被调试的父进程. 我们想要分析它的话,只能双开 ollydbg.

调试 Ollydbg 我们简称 父 od. 被调试 Ollydbg 我们简称 子 od.

运行子 od. 用子 od 加载那个病毒体.(记得勾上 !*Kill BadPe Bug 选项.) 刚加载,就报错.那就是正常的了.

因为我们要分析的是 Strongod , 而 Strongod 是做为插件运行的,所以调用的地方相对来说比较少. 所以我们可以尝试直接在代码段下断点.

多断几次.我们可以来到 .004AEFBE 这个地址.


004AEFA6    jmp dword ptr ds:[<&ADVAPI32.RegOpenKeyA>]    ; ADVAPI32.RegOpenKeyA

004AEFAC    jmp dword ptr ds:[<&ADVAPI32.RegQueryValueExA>]    ; ADVAPI32.RegQueryValueExA

004AEFB2    jmp dword ptr ds:[<&ADVAPI32.RegSetValueExA>]    ; ADVAPI32.RegSetValueExA

004AEFB8    jmp dword ptr ds:[<&KERNEL32.CloseHandle>]    ; KERNEL32.CloseHandle

004AEFBE    jmp dword ptr ds:[<&KERNEL32.ContinueDebugEvent>]    ; StrongOD.7084EE50

004AEFC4    jmp dword ptr ds:[<&KERNEL32.CreateDirectoryA>]    ; KERNEL32.CreateDirectoryA 

004AEFCA    jmp dword ptr ds:[<&KERNEL32.CreateFileA>]    ; KERNEL32.CreateFileA

004AEFD0    jmp dword ptr ds:[<&KERNEL32.CreateProcessA>]    ; StrongOD.70844340

004AEFD6    jmp dword ptr ds:[<&KERNEL32.DebugActiveProcess>]    ; StrongOD.7084B250


不难看出这里是一片 IAT ,其中 004AEFBE 处被 Strongod hook 了. 而被 HOOK 的函数,正是 Kernel32.ContinueDebugEvent.

       
写过调试器的,或者对调试程序熟悉的童鞋应该都知道这个函数的意思.

ContinueDebugEvent


The ContinueDebugEvent function enables a debugger to continue a thread that previously reported a debugging event.

BOOL ContinueDebugEvent(
 
DWORD dwProcessId,  // process to continue

DWORD dwThreadId,  // thread to continue

DWORD dwContinueStatus  // continuation status

);


我们回车跟进 Strongod 代码. 跟进去后可以发现里面已经加入类似虚拟机东西. 我们就没有必要继续分析了.

到此,我们该知道的,差不多都知道了.

下面我们来构造一个这样的”畸形 PE”. 我们就拿 xp 系统自带的计算器来做一个吧.

因为没有分析漏洞产生的代码.所以也只能”猜测”. 我猜测是因为开启 Strongod 的 !*Kill BadPe Bug 功能后,会对 PE 头做一些 ”保护”.

而这个”保护”做的并不是很细腻. 就有点像我前段时间写的 win7 漏洞一样.

而那个”病毒程序” 正好他的 AddressOfEntryPoint 是0.

01000118    00000000    DD 00000000     ; AddressOfEntryPoint = 0


Oep 为0 那也就是可以理解成oep 为 imagebase. 也就是可以理解成. “病毒” 的第一行代码是从 PE 的 “MZ” 开始的.

代码如下:
00400000    4D    dec edp

00400001    5A    pop edx

00400002    52    push edx

00400003 - FF25 1A004000    jmp dword ptr ds:[40001A]    ; AntiArp.00404F47

00400009    90    nop

0040000A    0000    add byte ptr ds:[eax],al

0040000C    FFFF    ???    ;未知命令

0040000E    0000    add byte ptr ds[eax],al

00400010    B8 00000000    mov eax,0

00400015    0000    add byte ptr ds:[eax],al

00400017    004000    add byte ptr ds:[eax],al

0040001A   47    inc edi

0040001B    4F    dec edi

0040001C    40    inc    eax

0040001D    0000    add byte ptr ds:[eax],al



第一行就是 ”M” 对应的 机器码 0x4d 对应的汇编代码 dec ebp ,

第二行就是 “Z” 对应的机器码 0x5a 对应的汇编代码 pop edx.

第三行 机器码是 0x52 对应的汇编代码 push edx

第三行可能是为了堆栈平衡, 也可能是为了代码对齐什么的, 我们就不要在意这些细节了.

第四行就开始跳到原来的 EIP 了. 就是这简单的4行. 让程序无法调试了.

这也有可能不是 Strongod 程序的漏洞, 也可能是我”猜”错了. 因为毕竟没有看代码实现细节.

但是有一点可以肯定的是绝对是因为 Strongod 导致出错了 :)

最后感谢 J 师傅发的 bin. 要不然也不会有此发现.

注:本帖由看雪论坛志愿者PEstone 重新将文档整理排版,若和原文有出入,以原作者附件为准

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (29)
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发我来
2014-6-19 12:52
0
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
3
占个小板凳...
2014-6-19 12:53
0
雪    币: 1234
活跃值: (282)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好东西,sod作者看了应该会修复
2014-6-19 13:19
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
顶个~!
2014-6-19 13:23
0
雪    币: 74
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
AddressOfEntryPoint = 0

<<windows anti-debugger reference>> 有讲过

(3) EntryPoint RVA set to 0(入口点RVA偏移量设置为0)
一些加壳的文件把入口点RVA设置为0, 这意味着它们将会开始执行 'MZ...' 对应于'dec ebx / pop edx ...'.
这本身并不是一个反调试技术, 但是如果使用软件断点中断在入口点就会变得让人苦恼.
如果创建一个挂起的进程, 然后设置 INT3 于 RVA 0, 将会擦除 MZ 值('M'). 这个魔术标志在进程创建时被检查, 但是当进程恢复(希望到达入口点)时它会再次在ntdll 中被检查. 哪样的话, 一个 INVALID_IMAGE_FORMAT 异常将会产生.
如果你创建自己的跟踪或者调试工具, 可以使用硬件断点避免这个问题.
2014-6-19 13:24
0
雪    币: 223
活跃值: (516)
能力值: ( LV13,RANK:520 )
在线值:
发帖
回帖
粉丝
7
感谢,学习了.
2014-6-19 13:40
0
雪    币: 1905
活跃值: (1542)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8


学习了。
2014-6-19 15:47
0
雪    币: 5041
活跃值: (3439)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
9
学习了,多谢分享。我在xp32位下记事本改了下PE头和oep,没能测试成,修改后程序不能运行了。
2014-6-19 16:13
0
雪    币: 223
活跃值: (516)
能力值: ( LV13,RANK:520 )
在线值:
发帖
回帖
粉丝
10
你可以把你修改的,发上来,看一下.
2014-6-19 18:09
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
11
八两头像越来越妖娆了
2014-6-19 18:19
0
雪    币: 7309
活跃值: (3778)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
12
Ollydbg,无法在RVA=0的地方下CC断点
AddressOfEntryPoint =0这个问题,基本上很难处理
不过,对于PE里面AddressOfEntryPoint = 0,这个配置,实在太特殊了,反过来说,也很好解决啊

另外,如果DLL的AddressOfEntryPoint = 0,DllMain无法执行
所以感觉关系不大,就没去处理这个

处理方法也有,不过感觉没啥意义,就是在RVA=0的地方下硬件执行断点,就可以断下来了
2014-6-19 19:37
0
雪    币: 10
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好吧,风月献身说法...嘿嘿
2014-6-19 19:41
0
雪    币: 10
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
,你貌似对八两的头像很感兴趣...嘿嘿
2014-6-19 19:42
0
雪    币: 341
活跃值: (85)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
15
经过测试对console的无效,有界面的C0000142失败。
貌似没有sod的od也有这个问题。
2014-6-19 21:38
0
雪    币: 5041
活跃值: (3439)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
16
发上来了,帮忙看下哪里不对啊,多谢了。
上传的附件:
2014-6-20 10:03
0
雪    币: 223
活跃值: (516)
能力值: ( LV13,RANK:520 )
在线值:
发帖
回帖
粉丝
17
我这边测试了,是没有问题的.



你测试的时候,需要把strongod 的 badpe 勾起来才行的.~

上传的附件:
2014-6-20 10:41
0
雪    币: 5041
活跃值: (3439)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
18
我这里程序根本不能运行啊,我没有用OD加载,楼主那里可以运行吗?
2014-6-20 11:07
0
雪    币: 223
活跃值: (516)
能力值: ( LV13,RANK:520 )
在线值:
发帖
回帖
粉丝
19
原来你是说运行啊.
运行确实不能运行.
那是因数你jump oep的代码写的是错误的.
你是 jmp [oep]
你跳到OEP不应该有 "[]"
要么直接 jmp oep
要么jmp [mem]  mem指向OEP也行.

你可以参考一下我发的那个计算器的 demo.

错误写法:
01000000    4D              dec ebp
01000001    5A              pop edx
01000002    52              push edx
01000003  - FF25 9D730001   jmp dword ptr ds:[100739D]
01000009    0000            add byte ptr ds:[eax],al
0100000B    00FF            add bh,bh
0100000D    FF00            inc dword ptr ds:[eax]
0100000F    00B8 00000000   add byte ptr ds:[eax],bh
01000015    0000            add byte ptr ds:[eax],al


正确写法:
01000000    4D              dec ebp
01000001    5A              pop edx
01000002    52              push edx
01000003  - FF25 1A000001   jmp dword ptr ds:[100001A]               ; 复件_NOT.0100739D
01000009    0000            add byte ptr ds:[eax],al
0100000B    00FF            add bh,bh
0100000D    FF00            inc dword ptr ds:[eax]
0100000F    00B8 00000000   add byte ptr ds:[eax],bh
01000015    0000            add byte ptr ds:[eax],al
01000017    0040 00         add byte ptr ds:[eax],al
0100001A    9D              popfd
0100001B    73 00           jnb short 复件_NOT.0100001D
0100001D    0100            add dword ptr ds:[eax],eax
0100001F    0000            add byte ptr ds:[eax],al
01000021    0000            add byte ptr ds:[eax],al


希望能帮到你.
2014-6-20 11:54
0
雪    币: 5041
活跃值: (3439)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
20
多谢,多谢了
2014-6-20 12:56
0
雪    币: 170
活跃值: (187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
新技能get√
2014-6-20 18:00
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
22
这个很久之前的技术了了,不过还是很感谢LZ分享自己的成果~~~~
2014-6-24 09:35
0
雪    币: 175
活跃值: (2331)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
楼主的精品,收藏一个。
2014-6-29 17:06
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
好有技术的文章,致敬
2014-7-1 23:30
0
雪    币: 16161
活跃值: (1345)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
又见大牛出来活动……
2014-7-5 17:28
0
游客
登录 | 注册 方可回帖
返回
//