2021-02-21

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也是不一样的。应该从受外部影响最小的条件分支语句入手。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值