适合新手的160个CrackMe第一个程序尝试逆向
这个小程序共有两种模式,一种为输入用户名+串码方式,另一种为只输入串码方式。
直接开始逆向。
使用OD调试该程序,先尝试用户名+串码。
在该页面随便输入用户名+串码后(当然串码不知道,肯定是错误的),点击check it baby按钮,会弹出弹窗提示串码错误。
此时不要忙着点击确定按钮,回到OD界面暂停,查看此时调用情况。按下alt+k打开调用堆栈窗口,可以看到有这些地方调用了此处。
在主程序中调用的,应是堆栈较小的几处,即004xxxxxx的调用,找到0042A1A9双击可以跳转到相应的汇编位置,向上看只有几个call,并无跳转。选中最上方一行,可以在信息窗口处看到有几处调用。
在信息窗口右键,选择跳转到call 004xxxxx,依次查看调用弹窗的前段是什么,可以在注释中看到,在0042FB32和0042FB18处之前的调用中,分别为成功和失败。基本可以猜测到在此之前对输入的用户名+串码进行了比对,如果串码输入正确,那么会弹出成功窗口,如果串码输入错误,则会弹出失败窗口。
在成功与失败之前有一个行代码如下:JNZ short Acid_bur.0042FB1F
即如果Z标志位不为零,则跳转到0042FB1F出,否则继续向下执行,若代码跳转,则会跳转到失败弹窗,否则就执行成功弹窗。那么我们直接爆破,鼠标指向这一行代码,右键,选择二进制-用nop填充,在此运行,可以看到即使输入错误的串码也会成功。
但是如果我们将用户名缩短,缩短到2位,在此尝试会发现依然失败。
那么肯定还有一个地方会判断用户名长度,长度必须大于一定长度才可以,不然则会弹出失败的窗口。继续查看调用弹窗的位置,有一个地方很可疑。
在此处有一个对比,
CMP EAX,0x4
如果EAX里面数据大于等于4的话,就会跳转,否则顺序执行,看注释可以看到顺序执行下去会弹出失败的弹窗,那么我们将这边0x4修改为0再试试看。
至此用户名+串码方式爆破完成。
未完待续…