borismilner提供的几个crackme归档在"1-very_easy_for_newbies"下:

level0-level3还算简单,是名副其实的"crackme for newbies",但是相比起来level-4.exe可能超过"newbie"的能力,因为作者在CRM中用了简单的SMC(self-modify code)。且不论它是不是真的"very easy",看我在此献个丑把这题解了。

先查壳,这个exe倒是不带壳(不要以为这个级别的CRM不带壳,那真是太小看作者了!),运行程序,随便输入一串字符,程序对此返回"NOT A GOOD JOB":

以此为切入口,在IDA中"Strings"窗口中搜索该字符串,然而,并没有任何收获:

那就换"Password"试试运气,输入密码的地方应该离打印"Password"不远:

对Password引用的代码片的附近又调用了scanf,之后又对输入的字符串与字符串"Mario"进行了逐一比对。嗯,第一反应觉得"Mario"就是应该就是password,重新运行一次程序,输入"Mario"试试,依旧提示失败:

看来需要好好分析一下程序,先调试一下程序,看看输入"Mario"后,是什么原因导致程序输出"NOT A GOOD JOB"。

.text:0040140C cmp     ds:inputStr, 'M'
.text:00401413 jz      short loc_40148B
.text:00401415 cmp     ds:inputStr+1, 'a'
.text:0040141C jz      short loc_40148B
.text:0040141E cmp     ds:inputStr+2, 'r'
.text:00401425 jz      short loc_40148B
.text:00401427 cmp     ds:inputStr+3, 'i'
.text:0040142E jz      short loc_40148B
.text:00401430 cmp     ds:inputStr+4, 'o'
.text:00401437 jz      short loc_40148B

在0x40140C处下断点,即程序输入字符串后首次进行比较的位置。输入"Mario"后,程序会跳转到0x0040148B处,这段代码片好像会往屏幕上输出一段火星文,先运行看下结果:

.text:0040148B mov     eax, offset aIhsF@hhcMhe        ; "\rIHS'F'@HHC'MHE'&\r"
.text:00401490 mov     ecx, 10h
.text:00401495
.text:00401495 loc_401495:                             ; CODE XREF: sub_4013E0+B9j
.text:00401495                                         ; sub_4013E0+CCj
.text:00401495 xor     byte ptr [eax+ecx], 7
.text:00401499 loop    loc_401495
.text:0040149B xor     byte ptr [eax+ecx], 7
.text:0040149F push    eax                             ; Format
.text:004014A0 call    printf
.text:004014A5 add     esp, 4

当程序执行完printf,屏幕上输出的并不是什么火星文,取而代之的依然是熟悉而又不和谐的"NOT A GOOD JOB"字样!再回过去看下IDA中0x0040148B处引用的火星文,已经变成了"NOT A GOOD JOB",如图:

这种变化源自0x00401495-0x00401499之间的xor循环,这段xor循环将数据段的字符串进行异或解码,解码前:

.data:0040902A 00000013 C \rIHS'F'@HHC'MHE'&\r

解码后:

.data:0040902A aIhsF@hhcMhe db 0Dh,'NOT A GOOD JOB !',0Dh,0 ; DATA XREF: sub_4013E0+A4o
.data:0040902A                                         ; sub_4013E0:loc_40148Bo

嗯,看来密码不能是"Mario",作者误导我呐!换一个密码,避开所有坑,继续往下调试必然会进入这个代码片:

.text:0040144C loc_40144C:                             ; CODE XREF: sub_4013E0+6Aj
.text:0040144C mov     eax, offset loc_409000          ; smc
.text:00401451 mov     ebx, offset loc_40145B
.text:00401456 jmp     loc_409000

jmp指令使程序跳转到数据段执行(请注意下面代码片的段前缀.data,我调试了很久才注意到这是数据段):

.data:00409000 xor     byte ptr [eax+4], 0F7h
.data:00409004 jl      short near ptr Format+15h ;<-注意这条指令,执行完后面的xor ;byte ptr [eax+4],7后会变为mov ecx,[esp+arg_0]
.data:00409006 and     al, 4
.data:00409008 xor     byte ptr [eax+4], 7
.data:0040900C or      ecx, 0F0F0h
.data:00409012 jmp     ebx

此时,eax指向0x00409000,所以指令xor byte ptr [eax+4],0F7h其实就是修改0x409004处的数据,同时这处还是一条指令,最终0x00409004被修改为一条mov指令,如下图:

至于[esp+arg_0]中,按照调试的结果,存储的是程序的参数数量,即int argc。

int main(int argc,char* argv[]);

最后,程序指令jmp ebx跳转到代码段0x0040145B:

这段代码相对比较容易,它将ecx中存储的参数的数量通过循环移位,移动到eax的最高位,然后使eax同0x10000000相加。如果相加的结果造成符号位溢出,则会使0x401474处的jno指令不发生跳转,然后再做一次SMC解码,得到正确的显示结果:"GOOD JOB"

参考:《Solution-borismilner-4N006135-level4》

后记:有部分调试器在执行0x401460和0x401476两处指令的时候:

.text:00401460 mov     byte ptr loc_409000, 10h
...
.text:00401476 sub     byte ptr loc_409000, 7

没有及时把数值写入到.data段中,导致无法获得"GOOD JOB",遇到这种情况只能手动修改ecx的值,暂时不知道怎么解决~

Crackmes.de上borismilner的一个crackme相关推荐

  1. 借助Process Monitor(ProcMon.exe)逆向一个CrackMe

    一位名为Arkantos的作者,在Crackmes.cf(Crackme.de的镜像站点)站点上提交了一个Crackme,难度级别为1-very_easy_for_newbies.这种入门级别的Cra ...

  2. 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx

    PAGE / NUMPAGES 一.单选题 1.下面叙述中正确的是: (A) 在C语言程序中,main()函数必须放在程序的开始位置 (B) 在C语言程序中,要调用的函数必须在main()函数中定义 ...

  3. 我在 GitHub 上看到了一个丧心病狂的开源项目!治好了我的拖延症

    有人说,写作是少数可随时间推移而不过时的技能之一. 但实际情况是,尽管许多人在写作这条道路都做出了尝试,可最终坚持下来的只有极少部分人.在这当中,导致他们放弃或停止写作的最大一个原因就是:拖!延!症! ...

  4. 真全!GitHub上出现了一个353种语言资源的汇总

    来源:AI科技评论本文约1200字,建议阅读5分钟随着AI技术的迅猛发展,机器翻译技术的出现让拯救濒危语言成为可能. 据联合国科教文组织统计 世上现存的7000+种语言,超过四百种濒临灭绝 全世界平均 ...

  5. [WinError 10038] 在一个非套接字上尝试了一个操作

    [WinError 10038] 在一个非套接字上尝试了一个操作 socket先close再调recv就会报错. 解决方法:可以判断一下是否关闭了再操作: if not tcpCliSock._clo ...

  6. ie6多文件上传_一个好的“文件上传”功能必须要注意的这些点你都知道吗?

    检查上传文件扩展名白名单,不属于白名单内,不允许上传:[前端和后端都要做好校验] 上传文件的目录必须是http请求无法直接访问到的.如果需要访问的,必须上传到其他(和web服务器不同的)域名下,并设置 ...

  7. 川大优秀毕业生在GitHub上建了一个项目《深度学习500问》,还未完结就获赞无数

    近年来,深度学习在语音.图像.自然语言处理等领域都取得了非常不错的成果,自然而然地成为技术人员争相学习的热点. 为了帮助正在学习深度学习的伙伴们,川大的一名优秀毕业生,在GitHub上创建了一个项目: ...

  8. 我在 GitHub 上看到了一个丧心病狂的开源项目!

    有人说,写作是少数可随时间推移而不过时的技能之一. 但实际情况是,尽管许多人在写作这条道路都做出了尝试,可最终坚持下来的只有极少部分人.在这当中,导致他们放弃或停止写作的最大一个原因就是:拖!延!症! ...

  9. Java黑皮书课后题第6章:*6.39(几何:点的位置)编程练习题3.32显示如何测试一个点是否在一个有向直线的左侧、右侧或在直线上,编写一个程序,输入三个点p0p1p2,显示p2是否在直线p0p1

    6.39(几何:点的位置)编程练习题3.32显示如何测试一个点是否在一个有向直线的左侧.右侧或在直线上,编写一个程序,输入三个点p0p1p2,显示p2是否在直线p0p1 题目 题目描述 编程练习题3. ...

最新文章

  1. 关于CString的=操作符
  2. mcq 队列_MCQ | 8086微处理器中的寻址模式
  3. 5G人才平均月薪水涨船高!通信研发工程师需求最旺
  4. 小芭比linux怎么装win7_小户型再怎么装也是小?看完我闭嘴了
  5. 002649:springboot下mybatis运行原理
  6. oppo k10 Pro和iqooneo6se哪个性能更强 哪个值得买呢
  7. 传智播客-刘意-java深入浅出精华版学习笔记Day01
  8. 短视频APP系统源码 直播系统源码
  9. EXCEL之绝对引用、相对引用和混合引用
  10. 计算机没有管理无线网络,电脑连接无线网络时,提示你没有首选无线网络怎么办...
  11. 哥谭第一季/全集Gotham迅雷下载
  12. rtl语言_21个最佳RTL WordPress主题(从右到左语言)
  13. zzuli 2126 tmk买礼物 思维题
  14. 数学建模PPT(三)
  15. 统计学基于matlab,MATPLOT:一款基于MATLAB的地球化学数据分析成图软件
  16. hyper扩展linux硬盘,Hyper-V 虚拟机扩展磁盘
  17. 【动态规划】—— 背包问题
  18. MySQL-第七章-xtrabackup(XBK)工具使用
  19. 前端笔记之微信小程序(二){{}}插值和MVVM模式数据双向绑定指令API
  20. 2022年钒电池行业研究报告

热门文章

  1. K.田园的饭可好吃了
  2. 你可能还没听过DNA存储技术,但微软已经打算三年内将其商用了
  3. 用Ubuntu编写第一个C程序并预处理、编译、汇编、链接
  4. 三、python爬虫学习--动态下载网站漫画
  5. Mac 修改maven 配置
  6. Milvus 社区周报- Week 12, 2020
  7. laravel中seed
  8. 莫比乌斯函数的两种求法(基于欧拉筛、埃氏筛)
  9. 装机防忽悠征文]对付不良商家,攒机知识。
  10. DCDC开关电源电磁兼容(五)EMI滤波器的设计步骤(内有每一步如何设计详解)