menu 牢记自己是菜
动态调试CrackMe160 练习3
1089 浏览 | 2020-04-21 | 阅读时间: 约 3 分钟 | 分类: crackme160 | 标签:
请注意,本文编写于 1458 天前,最后修改于 1458 天前,其中某些信息可能已经过时。

0x1 前言

这是回来第一篇博客(第二遍写,上一次没保存)。周日参加了网鼎杯的比赛,有一说一要是没有子洋师傅我们可能就被干碎了,我嘛,我又是0pt划水,但是还是学到了点东西(指的是python)。今天发现子洋师傅才是真正的观察者,我顶多算是一个粉丝 ∠( ᐛ 」∠)_ 。有一说一,我已经迫不及待想要与我们队里的师傅们团建聚餐了,到时候就可以近距离与子洋师傅交流感情了(指的是中国的未来,与印度是个大国)。还有就是crackme是一个很深得深坑,我会给自己加油的,争取每周都有所进展。


0x2 题目算法

来我们先来看一下这道题目,打开程序,发现有一个短暂的延迟弹窗后,我们进入到了与上一个一模一样的crack界面。由于我们注重算法,所以我们放弃第一个修复垃圾延迟的操作直接从算法分析开始。我们还是老方法定位到关键跳转,然后顺着函数段向上摸索,找到我们算法的起始位置。观察第一部分,遇上一个crack很像,先取输入名字的长度,然后与0x15B38相乘,再加上第一个字符的ASCII码值。之后就进入了一个函数,与crack2一样,将刚刚得到的数字进行十进制的转化。值得注意的是这里多了一小点点,就是给最终的字符串加上了2。

这里插一句题外话,逆向虽然是百分之七十靠猜,百分之三十靠读,但是有些时候千万不能自信满满。鼎网杯的python就是一个例子,将第二个当作判断输入是否满足flag{}基本格式的进本判断,最终将5这个字符漏掉。这里也是,要是不认真看,一定会以为以上部分代码是一样的,从而漏掉这个+2。
由于一开始我没有搞清楚,程序是如何判断输入注册码相同的,所以我们只能继续向下摸索,观察临时窗口的变化,发现我们的用户名(1234567)经历了如下过程1234567->622265->622267->1866801->1866799->1866814。我们试一试最后的这串数字,发现这个就是注册码。

(由于在尝试非数字注册码时,无法命中关键跳转函数断点,所以整个程序是由输入合法性判断的)。那问题就简单了我们只需紧盯这些关键变化就可以了。



这里依次对之前的数字进行了*3,-2.-(-15)的操作。都在主体函数中,所以只需要认真找就可以发现。
于是整个算法应该是这样的:

  1. 提取name字符串长度*0x15B38,然后加上name第一个字符的ASCII码
  2. 将16进制数字转化为10进制,然后加2
  3. 将所的数字乘3,然后减2
  4. 最终减去负15

0x3 题目补充

首先是补充一下比较的实现过程。由于这里没有使用cmp,那么一定有其他的方法,我们找到了一个除法,假若两个字符串相同的话就会在ax里面商1,然后就可以直接判断ax然后完成字符串对比。

还有就是那个我标注的不知道什么鬼的call,我在步入的时候发现里面啥都有,有循环,有算法。最后才发现,整个call就实现了整数转换浮点数的功能。其实要是调试的多的话应该可以一下从寄存器中发现。


0x4 后记

有一说一本身应给没有0x4的,但是我实在忍不住想吐槽一下啊。我的电脑死机了,我第一遍的博文没有保存,本身应该可以在九点多的时候就结束这道题目。但是被我硬生生的拖到了一点,我好气。以后一定要养成随手保存的习惯,不然到时候又炸了 (´இ皿இ`) 。

发表评论

email
web

全部评论 (暂无评论)

info 还没有任何评论,你来说两句呐!