标签:02 6A 00 21 0x0 abex 68 2021 push
abex’ crackme #1
用OD打开,发现这个小程序相比于之前的hello world而言简单了不少。这是因为abex’ crackme #1是由汇编语言直接编译写出来的,而是用vc++等开发工具编写出来的程序除了自己编写的代码,还有一部分启动代码。观察下面代码可以发现,main()直接出现在了EP。
调用MessageBoxA()函数
00401000 >/$ 6A 00 push 0x0 ; /Style = MB_OK|MB_APPLMODAL
00401002 |. 68 00204000 push abex'_cr.00402000 ; |Title = "abex' 1st crackme"
00401007 |. 68 12204000 push abex'_cr.00402012 ; |Text = "Make me think your HD is a CD-Rom."
0040100C |. 6A 00 push 0x0 ; |hOwner = NULL
0040100E |. E8 4E000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
调用GetDriveTypeA()函数
00401013 |. 68 94204000 push abex'_cr.00402094 ; /RootPathName = "c:\"
00401018 |. E8 38000000 call <jmp.&KERNEL32.GetDriveTypeA> ; \GetDriveTypeA
0040101D |. 46 inc esi ; abex'_cr.<ModuleEntryPoint>
0040101E |. 48 dec eax
0040101F |. EB 00 jmp short abex'_cr.00401021
00401021 |> 46 inc esi ; abex'_cr.<ModuleEntryPoint>
00401022 |. 46 inc esi ; abex'_cr.<ModuleEntryPoint>
00401023 |. 48 dec eax
条件分支(00401028)/(0040103D)
失败则进入(00401028)
成功则跳转至(0040103D)
00401024 |. 3BC6 cmp eax,esi ; abex'_cr.<ModuleEntryPoint>
00401026 74 15 je short abex'_cr.0040103D
00401028 6A 00 push 0x0
0040102A |. 68 35204000 push abex'_cr.00402035 ; |Title = "Error"
0040102F |. 68 3B204000 push abex'_cr.0040203B ; |Text = "Nah... This is not a CD-ROM Drive!"
00401034 |. 6A 00 push 0x0 ; |hOwner = NULL
00401036 |. E8 26000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
0040103B |. EB 13 jmp short abex'_cr.00401050
0040103D |> 6A 00 push 0x0 ; |/Style = MB_OK|MB_APPLMODAL
0040103F |. 68 5E204000 push abex'_cr.0040205E ; ||Title = "YEAH!"
00401044 |. 68 64204000 push abex'_cr.00402064 ; ||Text = "Ok, I really think that your HD is a CD-ROM! :p"
00401049 |. 6A 00 push 0x0 ; ||hOwner = NULL
0040104B |. E8 11000000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA
这个程序的意思应该是修改条件使得判断成功,执行另一条语句。
只需要将00401026 处的JE判断跳转改为JMP直接跳转
在OD中使用Copy to executable生成新的文件。
在地址00401000到0040100E处的四个PUSH命令,是将函数需要的参数逆序压入栈中,这是因为栈的结构是先进后出的。只有按逆序压入参数,函数才可以正确的接收到这些参数。
书中提到将00401024处修改DEC的指令改为NOP,这样EAX与ESI的值就是相同的,使原先的条件判断成功。
不过修改之后的程序,也如书上所言,破解失败。原因在于不同版本的操作系统中,结果值是不同的,不同OD也是不一样的。应该从受外部影响最小的条件分支语句入手。
标签:02,6A,00,21,0x0,abex,68,2021,push 来源: https://blog.csdn.net/keilaien/article/details/113924957
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。