| 
TA的每日心情|  | 开心 2015-8-23 23:49
 | 
|---|
 签到天数: 27 天 [LV.4]偶尔看看III | 
 
| 一个软件调试的确定与不确定的心得 首先声明下,文章有点长,且内容中有猜测部分且目前我自己无法验证,如果因观看本帖引起的头疼脑热、感冒发烧可不关我事~{:soso_e120:}
 
 
 
 望着眼前不知道来自何时何方的软件,心念一动之间,将其扔进了虚拟机里。
 
 
 好吧,找断点我花了一点时间。(知道我习惯的兄弟都知道我基本上不查字符串的。字符串确实高效,但养成依赖性可不好。)
 
 
 废话不多说,我们来看:
 
 
 一  我要找到你,不管南北东西 
 复制代码004BDDCA    8B45 FC       mov eax,dword ptr ss:[ebp-0x4]         ; 输入的注册码(ASCII "12345-67890-abcdef-97531")
004BDDCD    E8 4E2C0100   call AtomicAl.004D0A20                 ; 去除注册码中的“-”
004BDDD2    8B55 F8       mov edx,dword ptr ss:[ebp-0x8]         ; (ASCII "1234567890abcdef97531")
(省略部分代码...)
004BDDED    E8 F6280100   call AtomicAl.004D06E8                 ; 经典标志位比较语句
004BDDF2    84C0          test al,al                             ; 经典标志位比较语句
004BDDF4    74 24         je short AtomicAl.004BDE1A             ; 是不跳呢还是不跳呢?
004BDDF6    6A 40         push 0x40
004BDDF8    68 60DE4B00   push AtomicAl.004BDE60
004BDDFD    A1 1CA44D00   mov eax,dword ptr ds:[0x4DA41C]
004BDE02    E8 4D68F4FF   call AtomicAl.00404654
004BDE07    50            push eax
004BDE08    8BC3          mov eax,ebx
004BDE0A    E8 4D97FAFF   call AtomicAl.0046755C
004BDE0F    50            push eax
004BDE10    E8 5F92F4FF   call <jmp.&user32.MessageBoxA>         ; 成功的喜悦~
004BDE15    E8 8A2B0100   call AtomicAl.004D09A4
004BDE1A    33C0          xor eax,eax
004BDE1C    5A            pop edx
004BDE1D    59            pop ecx
004BDE1E    59            pop ecx
   
 F7进入004BDDCD   call AtomicAl.004D0A20 :
 
 这个循环的作用是检测并去除注册码中的“-”。大家跟踪下就能明白了,这里不再多说。复制代码004D0A5C    8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
004D0A5F    807C18 FF 2D  cmp byte ptr ds:[eax+ebx-0x1],0x2D     ; 检测输入的注册码是否有“-”存在
004D0A64    74 19         je short AtomicAl.004D0A7F
004D0A66    8D45 F8       lea eax,dword ptr ss:[ebp-0x8]
004D0A69    8B55 FC       mov edx,dword ptr ss:[ebp-0x4]
004D0A6C    8A541A FF     mov dl,byte ptr ds:[edx+ebx-0x1]
004D0A70    E8 EB38F3FF   call AtomicAl.00404360
004D0A75    8B55 F8       mov edx,dword ptr ss:[ebp-0x8]
004D0A78    8BC7          mov eax,edi
004D0A7A    E8 DD39F3FF   call AtomicAl.0040445C
004D0A7F    43            inc ebx
004D0A80    4E            dec esi
004D0A81  ^ 75 D9         jnz short AtomicAl.004D0A5C
004D0A83    33C0          xor eax,eax
 
 复制代码004BDDD2    8B55 F8       mov edx,dword ptr ss:[ebp-0x8]     
004BDDD5    8D45 FC       lea eax,dword ptr ss:[ebp-0x4]
004BDDD8    E8 3364F4FF   call AtomicAl.00404210
004BDDDD    8D45 FC       lea eax,dword ptr ss:[ebp-0x4]
004BDDE0    BA 14000000   mov edx,0x14                       ; 记住它,注册码长度的校验值
004BDDE5    E8 F669F4FF   call AtomicAl.004047E0
004BDDEA    8B45 FC       mov eax,dword ptr ss:[ebp-0x4]     ; 去除了“-”的注册码(ASCII "1234567890abcde97531")
004BDDED    E8 F6280100   call AtomicAl.004D06E8             ; 经典啊
004BDDF2    84C0          test al,al
004BDDF4    74 24         je short AtomicAl.004BDE1A         ; 我该何去何从?
004BDDF6    6A 40         push 0x40
004BDDF8    68 60DE4B00   push AtomicAl.004BDE60
F7进入:
 
 复制代码004D0703    64:8920       mov dword ptr fs:[eax],esp
004D0706    33DB          xor ebx,ebx
004D0708    8B45 FC       mov eax,dword ptr ss:[ebp-0x4]     ; 去除了“-”的注册码(ASCII "1234567890abcde97531")
004D070B    E8 AC41FDFF   call AtomicAl.004A48BC             ; 再向虎山行!
004D0710    84C0          test al,al
004D0712    74 40         je short AtomicAl.004D0754         ; 经典,又见经典!
004D0714    B2 01         mov dl,0x1                         
004D0716    A1 F0954300   mov eax,dword ptr ds:[0x4395F0]
004D071B    E8 D08FF6FF   call AtomicAl.004396F0
004D0720    8BD8          mov ebx,eax
004D0722    BA 01000080   mov edx,0x80000001
004D0727    8BC3          mov eax,ebx
004D0729    E8 6290F6FF   call AtomicAl.00439790
004D072E    B1 01         mov cl,0x1
004D0730    BA 80074D00   mov edx,AtomicAl.004D0780
004D0735    8BC3          mov eax,ebx
004D0737    E8 9891F6FF   call AtomicAl.004398D4
004D073C    8B4D FC       mov ecx,dword ptr ss:[ebp-0x4]
004D073F    BA A0074D00   mov edx,AtomicAl.004D07A0
004D0744    8BC3          mov eax,ebx
004D0746    E8 A597F6FF   call AtomicAl.00439EF0
004D074B    8BC3          mov eax,ebx
004D074D    E8 962CF3FF   call AtomicAl.004033E8
004D0752    B3 01         mov bl,0x1                         ; 问世间什么最美丽?为1绝对是个奇迹
004D0754    33C0          xor eax,eax
004D0756    5A            pop edx
004D0757    59            pop ecx
004D0758    59            pop ecx
004D0759    64:8910       mov dword ptr fs:[eax],edx
004D075C    68 71074D00   push AtomicAl.004D0771
004D0761    8D45 FC       lea eax,dword ptr ss:[ebp-0x4]
004D0764    E8 0F3AF3FF   call AtomicAl.00404178
004D0769    C3            retn
004D076A  ^ E9 0D34F3FF   jmp AtomicAl.00403B7C
004D076F  ^ EB F0         jmp short AtomicAl.004D0761
004D0771    8BC3          mov eax,ebx
004D0773    5B            pop ebx
004D0774    59            pop ecx
004D0775    5D            pop ebp
004D0776    C3            retn
F7再进入004D070B处的call AtomicAl.004A48BC :
 
 复制代码004A48BC    55            push ebp
004A48BD    8BEC          mov ebp,esp
004A48BF    83C4 EC       add esp,-0x14
004A48C2    53            push ebx
004A48C3    56            push esi
004A48C4    57            push edi
004A48C5    33D2          xor edx,edx
004A48C7    8955 F0       mov dword ptr ss:[ebp-0x10],edx
004A48CA    8955 EC       mov dword ptr ss:[ebp-0x14],edx
004A48CD    8945 FC       mov dword ptr ss:[ebp-0x4],eax
004A48D0    8B45 FC       mov eax,dword ptr ss:[ebp-0x4]         ; (ASCII "1234567890abcde97531")
004A48D3    E8 6CFDF5FF   call AtomicAl.00404644
004A48D8    33C0          xor eax,eax
004A48DA    55            push ebp
004A48DB    68 77494A00   push AtomicAl.004A4977
004A48E0    64:FF30       push dword ptr fs:[eax]
004A48E3    64:8920       mov dword ptr fs:[eax],esp
004A48E6    B2 01         mov dl,0x1
004A48E8    A1 80934100   mov eax,dword ptr ds:[0x419380]
004A48ED    E8 C6EAF5FF   call AtomicAl.004033B8
004A48F2    8BF0          mov esi,eax
004A48F4    BA 90494A00   mov edx,AtomicAl.004A4990          ; 内置字符串组,ASCII "19FA8FC1E0C33494BB63AF7A26C23B\rBB2AF5AF38DC318E36B70A4C0D8E2\rDE1BEECA9714D51C6056817FFCBD68C\r9AC9D23"
004A48F9    8BC6          mov eax,esi
004A48FB    8B08          mov ecx,dword ptr ds:[eax]
004A48FD    FF51 2C       call dword ptr ds:[ecx+0x2C]
004A4900    C645 FB 00    mov byte ptr ss:[ebp-0x5],0x0      ; 四两拨千斤,弃暗投明!
004A4904    8BC6          mov eax,esi
004A4906    8B10          mov edx,dword ptr ds:[eax]
004A4908    FF52 14       call dword ptr ds:[edx+0x14]
004A490B    48            dec eax
004A490C    8BD8          mov ebx,eax
004A490E    85DB          test ebx,ebx
004A4910    7C 3B         jl short AtomicAl.004A494D
004A4912    43            inc ebx
004A4913    C745 F4 00000>mov dword ptr ss:[ebp-0xC],0x0
004A491A    8D55 F0       lea edx,dword ptr ss:[ebp-0x10]
004A491D    8B45 FC       mov eax,dword ptr ss:[ebp-0x4]     ; 输入的注册码(ASCII "1234567890abcde97531")
004A4920    E8 ABFEFFFF   call AtomicAl.004A47D0
004A4925    8B45 F0       mov eax,dword ptr ss:[ebp-0x10]    ; 输入的注册码的MD5结果(ASCII "9EE86B3EDE3A79FBB14CC9C77C992CD")
004A4928    50            push eax
004A4929    8D4D EC       lea ecx,dword ptr ss:[ebp-0x14]
004A492C    8B55 F4       mov edx,dword ptr ss:[ebp-0xC]
004A492F    8BC6          mov eax,esi
004A4931    8B38          mov edi,dword ptr ds:[eax]
004A4933    FF57 0C       call dword ptr ds:[edi+0xC]
004A4936    8B55 EC       mov edx,dword ptr ss:[ebp-0x14]    ; 内置的字符串每一组 ,例如"19FA8FC1E0C33494BB63AF7A26C23B"
004A4939    58            pop eax                            ; 输入的注册码去除“-”的MD5结果(ASCII "9EE86B3EDE3A79FBB14CC9C77C992CD")
004A493A    E8 61FCF5FF   call AtomicAl.004045A0
004A493F    75 06         jnz short AtomicAl.004A4947        ; 成功与失败,在于跳与不跳之间!
004A4941    C645 FB 01    mov byte ptr ss:[ebp-0x5],0x1      
004A4945    EB 06         jmp short AtomicAl.004A494D
004A4947    FF45 F4       inc dword ptr ss:[ebp-0xC]
004A494A    4B            dec ebx                            ; 96H组内置字符串校验完毕了吗 ?
004A494B  ^ 75 CD         jnz short AtomicAl.004A491A
004A494D    8BC6          mov eax,esi
004A494F    E8 94EAF5FF   call AtomicAl.004033E8
004A4954    33C0          xor eax,eax
004A4956    5A            pop edx
004A4957    59            pop ecx
004A4958    59            pop ecx
004A4959    64:8910       mov dword ptr fs:[eax],edx
004A495C    68 7E494A00   push AtomicAl.004A497E
004A4961    8D45 EC       lea eax,dword ptr ss:[ebp-0x14]
004A4964    BA 02000000   mov edx,0x2
004A4969    E8 2EF8F5FF   call AtomicAl.0040419C
004A496E    8D45 FC       lea eax,dword ptr ss:[ebp-0x4]
004A4971    E8 02F8F5FF   call AtomicAl.00404178
004A4976    C3            retn
004A4977  ^ E9 00F2F5FF   jmp AtomicAl.00403B7C
004A497C  ^ EB E3         jmp short AtomicAl.004A4961
004A497E    8A45 FB       mov al,byte ptr ss:[ebp-0x5]       ; 透过开满鲜花的月亮,依稀看到你的模样!
004A4981    5F            pop edi
004A4982    5E            pop esi
004A4983    5B            pop ebx
004A4984    8BE5          mov esp,ebp
004A4986    5D            pop ebp
004A4987    C3            retn
嗯,MD5结果?意思是说有MD5?证据呢?
 稍安勿躁,请阅兵:
 
 如果还不信,呃,可以私下有请论坛的 “密码学综合工具”来验证,这里就略过了~~。复制代码004A3DCA    50            push eax
004A3DCB    E8 B0FFFFFF   call AtomicAl.004A3D80
004A3DD0    59            pop ecx
004A3DD1    8B45 08       mov eax,dword ptr ss:[ebp+0x8]
004A3DD4    C740 B0 01234>mov dword ptr ds:[eax-0x50],0x67452301
004A3DDB    8B45 08       mov eax,dword ptr ss:[ebp+0x8]
004A3DDE    C740 B4 89ABC>mov dword ptr ds:[eax-0x4C],0xEFCDAB89
004A3DE5    8B45 08       mov eax,dword ptr ss:[ebp+0x8]
004A3DE8    C740 B8 FEDCB>mov dword ptr ds:[eax-0x48],0x98BADCFE
004A3DEF    8B45 08       mov eax,dword ptr ss:[ebp+0x8]
004A3DF2    C740 BC 76543>mov dword ptr ds:[eax-0x44],0x10325476
004A3DF9    5D            pop ebp
004A3DFA    C3            retn
 我们接着看下这里:
 
 OK,我们将视线移到寄存器窗口,看下:复制代码004A4936    8B55 EC       mov edx,dword ptr ss:[ebp-0x14]    ; 内置的字符串每一组 ,例如"19FA8FC1E0C33494BB63AF7A26C23B"
004A4939    58            pop eax                            ; 输入的注册码去除“-”的MD5结果(ASCII "9EE86B3EDE3A79FBB14CC9C77C992CD")
004A493A    E8 61FCF5FF   call AtomicAl.004045A0
004A493F    75 06         jnz short AtomicAl.004A4947        ; 成功与失败,在于跳与不跳之间!
 复制代码EAX 00F94BC0 ASCII "9EE86B3EDE3A79FBB14CC9C77C992CD"
ECX 00000002
EDX 00F89F8C ASCII "19FA8FC1E0C33494BB63AF7A26C23B"
爱要怎么说出口?
 很明显,输入的注册码去除“-”的MD5结果(大写)与内置的固定字符串每一组 ,例如"19FA8FC1E0C33494BB63AF7A26C23B"来比较是否相同。
 嗯,看起来是个简单任务啊。
 
 
 
 
 二、我猜、我猜、我猜猜猜 PS:以下这部分内容,可能会引起头昏脑涨,慎入~~~
 
 
 慢着,STOP,停一下!OD啊,等一等你的主人先!
 如果你对自己的眼睛视力满怀信心的话,你会仔细的再去数一数寄存器窗口里的EAX和EDX的字符串的位数!
 算了,你不用数了,我告诉你,你没看错,答案是:
 确实是31和30位!
 What?
 不是说MD5的结果跟这个字符串进行比较吗?比较的结果一样才是注册成功!长度都不一样,比个毛线啊?
 这既不科学,也没道理啊?
 好吧,咱分析一下:
 1.注册码不是MD5运算的结果?
 很显然,别说你了,这个结论连我自己都不信!
 2.内置字符串不是MD5算法的结果?
 初一看,有一点点可能。但问题在于注册码是通过MD5运算后的结果与内置字符串比较,不管怎么看,这些内置的字符串都应该是MD5后的结果。
 根据前面的注册验证流程来看,软件不是明码比较,而是对注册码的MD5结果来匹配这些内置字符串来验证的。
 所以说,这种可能性也不存在!
 3.内置字符串是MD5算法的结果?
 应该是啊。可如果我不是在做梦,EAX里的字符串跟MD5计算器得到的结果如此相像?31位的结果为什么和这个长度只有30位的内置的字符串进行比较?
 骗子!大骗子!不是说好了的吗,标准MD5的输出长度全球统一零售价不是32(或16)吗?为什么EAX里只有31位?
 可是根据上面的第2点,内置的字符串应该就是MD5的结果啊!
 那么问题来了?30位的内置字符串到底是怎么回事?31位字符串与MD5的结果又有何不同?
 I~m Sorry!我在这里无法给出确定的答案,但是可以给出我的推测,而且是我个人认为的真 - 相。
 
 推测1.
 
 Ladies and gentlemen,look it carefully!
 
 长度28位,看来位数长短变化不是关键。重点关注下0所在的位置。字符串中的2个0在第20位、24位;复制代码B2AF5AF38DC318E36B70A4C0D8E2
初步得出个结论:奇数位上的0不存在。
 且慢,你又自相矛盾了!
 当你把表中的这一组字符串D15BFA84631010F9992C3F0FA7E8637砸到我头上的时候,你肯定很生气!第23位上不是个0吗?睁眼说瞎话也不害臊?
 假如生活欺骗了你,不要悲伤,不要心急~因为你还没有听完我老G说的道理:
 
 同理,注册码的MD5运算的结果也一定是按照这种要求来过滤的,这样才能保证匹配成功。       让我们把目光对准EAX,看到了什么?
 ,即9EE86B3EDE3A79FBB14CC9C77C992CD,复制代码(ASCII "9EE86B3EDE3A79FBB14CC9C77C992CD")
再请出PYG的密码学工具,计算一下, 得到:9EE86B3EDE3A79FBB14CC9C707C992CD
 看出什么来了吗?对,问题出在这里:
 
   左边第一行来自OD里的EAX,下面的是MD5计算的结果。这样看起来就很清楚了~~~再次验证了我的推测!
 
 嗯,看晕了吧?
 所以我在前面说,看帖需谨慎,本文部分内容容易引起头昏脑涨的不适感~~其一切后果老G我可不承担~
 推测部分暂且告一段落。。
 
 What~s the Next?咱回到上文那进行MD5字符串比对的地方:
 
 两颗心要承受多少痛苦的煎熬,才能够彼此完全明了?
 答案在这里:
 
 复制代码004A494A    4B            dec ebx                            ; 96H组内置字符串校验完毕了吗 ?
好吧,老G,你敢确定?
 是的,你可以数一下我后面的附表~如果我错了,我向毛 主席保证我会鄙视下我自己没有认真去数的马虎习惯。
 
 
 
 
  三、 确定与无法确定 看完上面的章节,头大了吧?
 
 不足32位的字符串里,怎么去确定省略掉的数字0在哪一位?就算你把0还原到正确的字符串里,你能由结果逆推出MD5的对象吗?
 
 裘海正的歌里是怎么唱的?“我不忍我不能,别再认真忘了我的人。”  不管你能不能,我反正是不能~。
 
 什么,MD5在线解密?嗯,主意不错,不过目前我试验了几组32位的,还没有“碰撞”出爱的火花。。。(我在此强调,查询不到结果与我RP无关,O(∩_∩)O~)
 
 
   
 
 累了,困了,也没有红牛喝,省略掉一些不重要的吧。关键点的修改这里就不演示了。
 
 
 确定:复制代码004A4941    C645 FB 01    mov byte ptr ss:[ebp-0x5],0x1      ; 这只爱情鸟,何时才会来到?
004A4945    EB 06         jmp short AtomicAl.004A494D
004A4947    FF45 F4       inc dword ptr ss:[ebp-0xC]
004A494A    4B            dec ebx                            ; 96H组内置字符串校验完毕了吗 ?
004A494B  ^ 75 CD         jnz short AtomicAl.004A491A
(省略部分代码)
004A497C  ^ EB E3         jmp short AtomicAl.004A4961
004A497E    8A45 FB       mov al,byte ptr ss:[ebp-0x5]       ; 透过开满鲜花的月亮,依稀看到你的模样!
核心和谐点:004A4941处的[ebp-0x5]的赋值为1则为注册成功。
 
   不确定:
 内置字符串的位数与MD5运算后0的位置有关。详情参见第二部分。
 
 希望大家能提供正确的注册码来验证我的推测~~~
 
 看完前面的内容,说下我对该软件的调试心得:
 不要因为采用了不可逆的密码学就直接用明文比较,弱点太明显。
 对于标准算法的结果,可以再次加工变形(比如本例中剔除奇数位上的0),至少在算法上可以大大加强软件的注册安全强度~
 大胆猜测,小心求证~
 
 
 
 
 四、后记——原来你也在这里! 快写完了才发现,怎么有些眼熟的感觉?在哪里,在哪里见过你?你的笑容这样熟悉,我一时想不起~
 随手点了下关于里面的网址,看到弹出的页面中,我才想起来在论坛中的这个帖子:菜鸟破解练习(一):爆破 Atomic Alarm Clock https://www.chinapyg.com/thread-72986-1-1.html
 
 
 悲催的!这又不是拍电视剧,能不能不要这么狗血啊?{:soso_e109:}
 
 
 
 
 
 
 
 
 附表:
 固定字符串96H组?
 
 哇,你不会真的在数有多少组吧?
 
 
 
 
 | 
 评分
查看全部评分
 |