crackme002-abexcm5

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了crackme002-abexcm5相关的知识,希望对你有一定的参考价值。

今天开始学习160个crackme

拖入exeinfo查看,发现是用汇编写的代码
拖入OD,查看字符串

可以看见有两个报错和一个输入正确的标志,这两个报错都是输入不正确之后的结果,我们跟进看看

可以看到这里调用了一个MassageBoxA弹窗函数,title是"error",text是"The serial you entered is not correct!",往上找找,就可以看见一个判断跳转指令

这个判断跳转指令跳过了整个弹窗函数,所以这个我们就可以判断这里可以进行爆破
爆破方式:把je改成jne或者jmp就可以了

小tips:
1、je指令和jz指令是一个意思,都是判断ZF标志位是否为0。若为0,则跳转。
2、MassageBoxA弹窗函数
int MessageBoxA(
[in, optional] HWND hWnd, //句柄,调用这个来调用api
[in, optional] LPCSTR lpText, //要显示的消息
[in, optional] LPCSTR lpCaption, //对话框标题
[in] UINT uType //对话框的内容和行为
);

在往上找程序入口
看见函数入口跳转到了一个函数调用的地方,也就是0040106c


这个函数调用名字叫GetDIgItemTextA,主要用于检索与对话框中的控件关联的标题或文本(人话:就是获得你输入在框里面的字符串)

UINT GetDlgItemTextA(
[in] HWND hDlg, //包含控件的对话框的句柄
[in] int nIDDlgItem, //要检索其标题或文本的控件的标识符
[out] LPSTR lpString, //要接收标题或文本的缓冲区
[in] int cchMax //要复制到 lpString 指向的缓冲区的最大长度(以字符为单位)
);
这个时候就可以在这里下断点了,下完断点后f8步过(注意别f7步进,会很难过),然后弹窗出来之后随便输一个数

点击check,继续步过,到了这个函数

GetVolumeInformationA函数:获取磁盘驱动卷标名称(获取你将这个程序放置的盘上面的名称,如本人把程序放在了d盘,那这个函数就会获得本人d盘的名称data)
BOOL GetVolumeInformationA(
[in, optional] LPCSTR lpRootPathName,
//指向包含要描述的卷根目录的字符串的指针
[out, optional] LPSTR lpVolumeNameBuffer,
//指向接收指定卷名称的缓冲区的指针
[in] DWORD nVolumeNameSize,
//卷名称缓冲区的长度(如果未提供卷名称缓冲区,则忽略此参数)
[out, optional] LPDWORD lpVolumeSerialNumber,
//指向接收卷序列号的变量的指针(如果不需要序列号,此参数可以为 NULL)
[out, optional] LPDWORD lpMaximumComponentLength,
//指向接收指定文件系统支持的文件名组件的最大长度(以 TCHAR 为单位)的变量的指针
[out, optional] LPDWORD lpFileSystemFlags,
指向接收与指定文件系统关联的标志的变量的指针。
[out, optional] LPSTR lpFileSystemNameBuffer,
//指向接收文件系统名称的缓冲区的指针
[in] DWORD nFileSystemNameSize
//文件系统名称缓冲区的长度(以 TCHAR 为单位)
);
往下继续走,可以看见已经捕获到了本人的磁盘名称,而且把名称和一个字符串4562-ABEX放在一起了(strcat函数不过多介绍,就是把字符拼接在一起)

再往下走就是一个很普通的循环

它把我们在栈上的磁盘名称的ascall码按字节进行了加1操作(别看见dword就是双字节,每个相邻指令的地址只变了1),而且循环了两次

于是我们跑完之后栈里面的盘名也变成了FCUC,然后又经历了一次拼接,就变成了"L2C-5781FCVC4562-ABEX"

这里程序加载了一个strcmp函数,而且把我们输入的和它生成的一串字符串当作函数参数放进了栈里,这个肯定可以看得出来在比较,比较过后的结果放进eax里面,如果不相同就是0,相同就是1
最后就到了我们刚才爆破的地方,cmp相同标志位ZF为1,不同为0(其实是对两个操作数进行相减,但是不对操作数进行改变,只是改变了标志位而已)。最后再用je(即jz)对地址进行跳转
那结果就显而易见了,我们需要输入的密钥就是L2C-5781FCVC4562-ABEX(此处根据每个人将程序放在哪个盘上而定,盘名不尽相同,大家自行而定)

赢!

以上是关于crackme002-abexcm5的主要内容,如果未能解决你的问题,请参考以下文章

[CrackMe]160个CrackMe之19

[CrackMe]160个CrackMe之19

[CrackMe]160个CrackMe之40

[CrackMe]160个CrackMe之40

[CrackMe]一个关于读取文件并进行运算判断的CrackMe

IOLI-crackme0x06-0x09 writeup