首页
社区
课程
招聘
[求助]利用软件的输入漏洞“破解”UltraCompare
发表于: 2009-7-29 19:42 6450

[求助]利用软件的输入漏洞“破解”UltraCompare

2009-7-29 19:42
6450
自从拜读了0day安全,对软件的输入非常敏感,很多软件都会存在这样的漏洞。
这几天我的UltraCompare pro版的到期了,也想给他破解,破解,不过似乎
有点麻烦。找了好久都不知道怎么破解。不过我想了一个“阴招”,其实也不算
什么阴招,就是想测一下有没有什么缓冲区的漏洞没有。我输入了几个超长的
的用户名和密码,知道text框不能接受字符为止。
比如输入
用户名
CODEcccccccccccccccccccccccccccccccccccccccccccccccCODEccccc
密码
CODEcccccccccccccccccccccccccccccccccccccccccccccccCODEccccccccccccccccccccccccc
居然出现了未知的软件异常!!!还说出了地址!这个地址好啊!
0x0078d7fa,不妨在这个地方下个断点看看。跟进来才看到这是一个函数,虽然不知道是干什么的,但跟下去就知道了。OllyDbg加载UltraCompare pro在这个函数头下断点。一路F9,毕竟是输入了用户名和密码之后才出现的异常。通过调试,得知:
0078D7CE  /$  8BFF          mov     edi, edi//无效语句
0078D7D0  |.  55            push    ebp
0078D7D1  |.  8BEC          mov     ebp, esp//ebp指向栈帧底部
0078D7D3  |.  8B45 08       mov     eax, dword ptr [ebp+8]取出参数二
0078D7D6  |.  53            push    ebx    //保护ebx
0078D7D7  |.  33DB          xor     ebx, ebx //ebx清零
0078D7D9  |.  56            push    esi      //用户名和密码入栈保存变量
0078D7DA  |.  57            push    edi
0078D7DB  |.  3BC3          cmp     eax, ebx  //判断参数二是不是0
0078D7DD  |.  74 07         je      short 0078D7E6  //如果是0则跳走
0078D7DF  |.  8B7D 0C       mov     edi, dword ptr [ebp+C] 取出第三个参数到edi
0078D7E2  |.  3BFB          cmp     edi, ebx               判断第三个参数是不是大于0此时取出的是0x100
0078D7E4  |.  77 1B         ja      short 0078D801
0078D7E6  |>  E8 7F660000   call    00793E6A
0078D7EB  |.  6A 16         push    16
0078D7ED  |.  5E            pop     esi
0078D7EE  |.  8930          mov     dword ptr [eax], esi
0078D7F0  |>  53            push    ebx
0078D7F1  |.  53            push    ebx
0078D7F2  |.  53            push    ebx
0078D7F3  |.  53            push    ebx
0078D7F4  |.  53            push    ebx
0078D7F5  |.  E8 33E1FFFF   call    0078B92D
0078D7FA  |.  83C4 14       add     esp, 14
0078D7FD  |.  8BC6          mov     eax, esi
0078D7FF  |.  EB 3C         jmp     short 0078D83D
0078D801  |>  8B75 10       mov     esi, dword ptr [ebp+10]
                    如果第三个参数大于0则检查第四个参数是不是等于0,此时esi指向字符串“blarg”
0078D804  |.  3BF3          cmp     esi, ebx               
0078D806  |.  75 04         jnz     short 0078D80C        
0078D808  |>  8818          mov     byte ptr [eax], bl
0078D80A  |.^ EB DA         jmp     short 0078D7E6
0078D80C  |>  8BD0          mov     edx, eax         如果第四个个参数等于0,则将第二个参数赋值给edx,此时edi是0x100
0078D80E  |>  381A          /cmp     byte ptr [edx], bl
0078D810  |.  74 04         |je      short 0078D816
0078D812  |.  42            |inc     edx
0078D813  |.  4F            |dec     edi
0078D814  |.^ 75 F8         \jnz     short 0078D80E
0078D816  |>  3BFB          cmp     edi, ebx        计算密码长度是不是等于0x100,其实是移动指针到密码的末尾
0078D818  |.^ 74 EE         je      short 0078D808
0078D81A  |>  8A0E          /mov     cl, byte ptr [esi]
0078D81C  |.  880A          |mov     byte ptr [edx], cl
0078D81E  |.  42            |inc     edx
0078D81F  |.  46            |inc     esi
0078D820  |.  3ACB          |cmp     cl, bl
0078D822  |.  74 03         |je      short 0078D827
0078D824  |.  4F            |dec     edi
0078D825  |.^ 75 F3         \jnz     short 0078D81A    将esi指向的blarg添加到密码末尾
0078D827  |>  3BFB          cmp     edi, ebx           添加之后判断是不是0也就是说加上blarg几个字符之后是不是0x100那么长
0078D829  |.  75 10         jnz     short 0078D83B
如果edi是0则出现了异常!
就执行以下代码抛出异常对话框
0078D82B  |.  8818          mov     byte ptr [eax], bl
0078D82D  |.  E8 38660000   call    00793E6A
0078D832  |.  6A 22         push    22
0078D834  |.  59            pop     ecx
0078D835  |.  8908          mov     dword ptr [eax], ecx
0078D837  |.  8BF1          mov     esi, ecx
0078D839  |.^ EB B5         jmp     short 0078D7F0
0078D83B  |>  33C0          xor     eax, eax
0078D83D  |>  5F            pop     edi
0078D83E  |.  5E            pop     esi
0078D83F  |.  5B            pop     ebx
0078D840  |.  5D            pop     ebp
0078D841  \.  C3            retn

虽然有很多调用上面函数的地方,但发现
下面是紧接着附近调用这个函数的call
0047F212   .  68 B08B8000   push    00808BB0                         ;  ASCII "blarg"
0047F217   .  8D8C24 0C0A00>lea     ecx, dword ptr [esp+A0C]
0047F21E   .  68 00010000   push    100
0047F223   .  51            push    ecx
0047F224   .  E8 A5E53000   call    0078D7CE     将密码加上字符"blarg"
此时密码是"CODEcccccccccccccccccccccccccccccccccccccccccccccccblarg"
0047F229   .  56            push    esi
0047F22A   .  8D9424 180A00>lea     edx, dword ptr [esp+A18]
此时edx是加上了blarg之后的字符串
0047F231   .  68 00010000   push    100
0047F236   .  52            push    edx
0047F237   .  E8 92E53000   call    0078D7CE
将用户名添加到字符串末尾
0047F23C   .  68 A88B8000   push    00808BA8                         ;  ASCII "gleep"
0047F241   .  8D8424 240A00>lea     eax, dword ptr [esp+A24]  此时eax指向添加用户名之后的密码
0047F248   .  68 00010000   push    100
0047F24D   .  50            push    eax
0047F24E   .  E8 7BE53000   call    0078D7CE  将gleep添加到字符串末尾

0047F253   .  57            push    edi
0047F254   .  8D8C24 300A00>lea     ecx, dword ptr [esp+A30]
0047F25B   .  68 00010000   push    100
0047F260   .  51            push    ecx
0047F261   .  E8 68E53000   call    0078D7CE
此时密码是"CODEcccccccccccccccccccccccccccccccccccccccccccccccblargwohenkeaigleep
           CODEccccccccccccccccccccccccccccccccccccccccccccccc"

0047F266   .  56            push    esi
0047F267   .  8D9424 3C0A00>lea     edx, dword ptr [esp+A3C]
0047F26E   .  68 00010000   push    100
0047F273   .  52            push    edx
0047F274   .  E8 55E53000   call    0078D7CE  再次将用户名连接到字符串末尾
此时密码是"CODEcccccccccccccccccccccccccccccccccccccccccccccccblargwohenkeaigleep
           CODEcccccccccccccccccccccccccccccccccccccccccccccccwohenkeai"
总结上述连续的的四次函数调用发现四次调用,只不过是将“密码+blarg+用户名+gleep+密码+用户名”连起来而已,而且以其异常的地方是第四次调用
0078D827  |>  3BFB          cmp     edi, ebx   
添加之后判断是不是0,正常情况下edi不会是0可是如果代码过长则edi=0下面的跳转不会实现
0078D829  |.  75 10         jnz     short 0078D83B
此处代码不跳的话,会抛出一个未知的异常!!!可是如果输入一个超长的用户名和密码在第四次进入这个函数的时候,将jnz强制更改成jmp将会发生有趣的事情!!!
关闭OD,重新启动这个程序,居然试用期又是30天了!虽然并没有破解吧,可是能用了啊,是不!这样的话,也算破解了吧。你可能会说,“我还不如重装呢”。确实和重装差不多,不过,如果去深究为什么会这样的话,也许可以破解。既然是edi=0影响了程序的流程,那就可以从edi入手真正破解程序了啊。这还需要时间

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发直接拿掉!
2009-7-31 06:43
0
雪    币: 457
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
别老说沙发了,OK?
感谢楼主的破文,也算是一种思想
2009-8-4 01:36
0
游客
登录 | 注册 方可回帖
返回
//