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

0x1 前言

啊,开学了!确实不想返校,毕竟家里面太舒服了。这周数据库的实验快要截止了,所以前几天就先解决了一下这个大麻烦,而且这周可能是因为要返校的原因,也没啥动力,导致自己这周消极怠工。本身这周打算割掉了,但是由于行李太多的原因,这个键盘肯定是带不走了,所以在用它干点啥吧。这次是crackme的练习2,这周还去上了鼎网杯的赛前集训,上课的老师说一个合格的二进制手crackme160起码要刷够100道,才可以熟练掌握汇编语言。emmmmm任重而道远。


0x2 题目分析

拿到题目,虽然知道是一道OD的练习题目,但是我们还是要分析一下程序有没有壳,然后运行一下程序。

发现是一道无壳的程序,然后我们开始分析一下整个程序的流程。首先我们先快速定位一下关键的函数。我们还是使用智能中文搜索的功能,由于这道题不像之前那种用一个函数生成字符串的题目,所以我们很快就找到了关键的函数判断。

由于crackme题目的规则就是对不同的用户名生成规定的注册码。并且这道题目还可以(比看雪crakme大赛上的题目简单多了),所以我们可以在栈内直接看见注册码。

0x3 关键算法探究

每一道逆向与破解都是一门艺术,我们要有足够的耐心,这道题相比第一道题目就稍微的复杂了一点点。首先我们找到整个主函数的入口(push),之后我们开始紧紧的盯住整个函数的每一个细节。首先我们看见了几个API函数,在旁边其实它的功能也已经写得十分的清楚了。一个是测量了姓名输入的长度,另一个是提取了第一个字符,并且将其转换为十六进制存入寄存器。

我们就不必步入两个API函数了,我们继续向下步过,观察最早出现注册码的代码。找到后我们下一个断点,重新运行程序,在调用处步入。连续经过三次的套娃之后,我们找到了一个循环。对于一个字符串的处理,循环应该是首选的方法。所以我们分析一下这个循环,首先我们看见了程序向寄存器内压入了一个0xA(10),然后开始做除法,余数保存在EXA中。下一次循环,再将EXA作为被除数继续除法,直至EXA变为0。我们难想到,这就是一个从十六进制转换为十进制的算法。转换出来的数字即为我们注册码的数字位。

好的,我们这时候的目标就发生了改变。我们现在应该搞清楚这个需要进行转化的十六进制数是从什么地方来的。我们打上断点,从头运行函数,发现在提取首位name后,这个十六进制数就出现了。我们在这里打上断点,发现这个十六进制数为edi+首位注册名的ASCii(hex)。我们继续向上看,发现edi则是字符串长度*0x17CFB(常数)。这里我们就已经完全分析完算法了。


0x5 总结

crackme的第二道练习显然就比第一个要复杂一些,主要是有很多的函数多层的call,让人很是摸不到头脑,只能一点一点的去跟函数。练习二简单的地方应该是我们可以通过栈内的地址与ASCii码直观的看出很多我们需要的信息,后面的题目应该会有更多的惊喜。

发表评论

email
web

全部评论 (共 2 条评论)

    2020-04-20 15:04
    这个系列是新坑吗,160道题感觉任务好重啊,哈哈~
      2020-04-20 21:12
      @iyzyi是呀,自己动态调试太菜了。抽空好好练练 ヾ(≧∇≦*)ゝ。慢慢刷嘛