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
复制代码 如果还不信,呃,可以私下有请论坛的 “密码学综合工具”来验证,这里就略过了~~。
我们接着看下这里:
- 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 ; 成功与失败,在于跳与不跳之间!
复制代码 OK,我们将视线移到寄存器窗口,看下:
- 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!
- B2AF5AF38DC318E36B70A4C0D8E2
复制代码 长度28位,看来位数长短变化不是关键。重点关注下0所在的位置。字符串中的2个0在第20位、24位;
初步得出个结论:奇数位上的0不存在。
且慢,你又自相矛盾了!
当你把表中的这一组字符串D15BFA84631010F9992C3F0FA7E8637砸到我头上的时候,你肯定很生气!第23位上不是个0吗?睁眼说瞎话也不害臊?
假如生活欺骗了你,不要悲伤,不要心急~因为你还没有听完我老G说的道理:
同理,注册码的MD5运算的结果也一定是按照这种要求来过滤的,这样才能保证匹配成功。 让我们把目光对准EAX,看到了什么?- (ASCII "9EE86B3EDE3A79FBB14CC9C77C992CD")
复制代码 ,即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组?
哇,你不会真的在数有多少组吧?
|
评分
-
查看全部评分
|