RGO_小柒 发表于 2021-2-21 12:26

160Crackme--02 Afkayas 爆破算法分析

本帖最后由 RGO_小柒 于 2021-2-21 12:24 编辑

我是刚入门不到一个月,最近刚开始刷160Crackme,第二个是我自己做出来的,包括爆破和算法分析,所以很开心.就想写下来,记录自己的逆向过程和思路.
1.爆破
打开软件,输入假码,点击ok

出现错误提示窗口

我们使用F12暂停法:
   不点击确定,直接F12,然后程序暂停,使用alt+k进入"调用堆栈"窗口
发现有一处调用是来自程序领空,我们右键,选择,显示调用,来到程序领空

之后,我们向上一翻,发现有一处跳转,跳向了一处错误提示:

我们来到这里,选中该行,在提示窗口发现,这个跳转来自0040258B,右键"转到来自":

我们发现此处跳过了正确提示:

那我们试着将这个跳转直接nop掉

F9运行,点击确定,关闭刚才提示的错误窗口,再次输入假码,直接提示" You Get it",我们爆破成功!

2.算法分析
(以下算法分析都是我的个人片面见解,如有错误,敬请指正!)写在前面:在这之前我没有接触过VB的程序,所以分析的时候就有点憨,把一个简单的东西,复杂化了
我们撤销刚才的nop,并在这个关键条下断点,在堆栈窗口并没有发现类似真码的东西.
索性从段首下断,运行程序
一直运行,观察堆栈,发现可疑数据:

我们猜测,AKA-是前缀,585235是后缀,拼接字符串得"AKA-585235",验证,果然123456得密码就是AKA-585235
我们查看程序,能够发现"AKA"

但是却不知道585235是从哪来,我们寻找这串数字最先出现的地方.
断点还是位于段首,运行程序,点击"OK",程序暂停在段首,我们F8单步运行,仔细查看堆栈,看没有有与585235相似的数据产生.
我们发现,当程序运行完这个call之后,eax出现了585235,eax一般做为程序返回值的寄存器

我们再从这个call网上看,发现运行这个call之前,程序将edi入栈,那么edi中的数据应该就是这个函数的参数,使用堆栈的方法进行传参.
那我们开始分析,edi中的数据是什么东西,向上一翻,我们发现赋值edi的核心代码:

我们可以看出edi=账号长度*0x17CFB+账号的第一位数据的ascii码=8EE13
找到参数来源之后,我们走进关键call,去看看他用我们edi中的数据做了什么:
我们用同样的方法,找到使得堆栈中出现585235的关键call

我们跟进分析
进入call之后呢我们发现ecx=8EE13,就是我们的edi,我们看他用ecx中的数据来做什么

走完这个循环之后,我们发现:

结果是:35==>堆栈 33==>堆栈 32==>堆栈 35==>堆栈 38==>堆栈 35==>堆栈
然后从后面算法分析得,他又逆着把数据从堆栈中取了出来
这时我突然发现,35 38 35 32 33 35 这正是585235的ascii码
得出他们的过程也就是8EE13不断的除以10(十进制),得出的余数
这不正是十进制转换!!
我用计算器验证了一下
8EE13的十进制:

然后我就顿悟了,在程序领空的时候,我进入的关键call,是16进制转10进制的函数,这个vb函数我记住他了:

总结一下,真码的计算方法:
"AKA-"+"(账号长度*0x17CFB+账号的第一位数据的ascii码)的十进制"
为了验证是否正确,我们先算一下账号12345的真码

所以真码应该是"AKA-487704"
算法逆向成功:

RGO_小柒 发表于 2021-2-21 16:20

aゞ烛火 发表于 2021-2-21 15:32
我用字符串

方法自然是有很多啦

aゞ烛火 发表于 2021-2-21 15:32

{:5_184:}我用字符串

拿着雪糕 发表于 2022-1-28 12:11

十分感谢大佬

OkPFH82 发表于 2022-2-28 10:00

不可多得,支持楼主

不苦小和尚 发表于 2022-2-28 10:01


[快捷回复]-感谢楼主热心分享!

iytwfx01 发表于 2022-2-28 10:01

谢谢分享

mSYxEdBpL 发表于 2022-2-28 10:12

大佬无敌

jESuY 发表于 2022-3-1 01:14

谢谢分享

jESuY 发表于 2022-3-25 16:05

楼主好强啊!学习了!
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 160Crackme--02 Afkayas 爆破算法分析