自从拜读了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期)