本帖最后由 Teak 于 2019-3-30 20:38 编辑
160Crackme之002 Afkayas.1
1. F9 运行,然后输入账户和密码11111 12345 ,如下图所示
2. F12暂停,点击k,寻找这个弹窗的函数,如下图所示:
Crakme 001已经说过了,77地址开头的不用看,这个应该不是c++写的,弹窗函数叫rtcMsgBox(应该和MessageBox一样弹窗吧,百度即可验证),
然后右键显示调用,在反汇编窗口中跟随,鼠标往上滚,如下图所示
3.在图示地址rtcMsgBox中下断,途中两个的字符You Get Wrong和Try again是rtcMsgBox所需的参数,
why?因为弹窗的时候有这些字符,肯定传给rtcMsgBox了;从图中向下的红色箭头指向004025E5,
说明经过红色箭头起始地方的判断才跳转到4025e5,往上查看,判断的地方下断,如下图所示:
4.接下来,鼠标继续往上走,找一个像call之后入栈的地方,如 push ebp,该push ebp上面有nop或是retn的很可能就是我们要找的。
往上翻滚许久,终于发现了我们想要的。
5.接下来F8大法,找找哪里传入11111或12345;
首先在push ebp处下断,然后继续运行,等程序再弹一遍,我们再点击一遍 确定,然后再点ok,程序会在push ebp处停下来,如下图所示:
6. F8大法,开始找输入11111或12345,找到有2处,时间可能有点长,但能加深印象,我可是从头跟到尾的,
如下图所示,单步F8的时候,找到一个比较有趣的数字和一个有趣的字符AKA- 487704,猜想可能就是我们想要的,
可以单独运行程序去验证想法
如下图所示,在402523这个地方的call,由于运行到该call的下一条指令了,call的函数已经变了,
该call的作用是将AKA-与487704连接在一起。
7. 再跑一遍程序,看看哪个地方生成487704,单步F8,如下图所示:
里面的注释是我F8时写上去的,反复验证,其中的步骤你得去单步体会
由上图可以发现,487704是由地址为40243f的系统call生成的,既然是系统的函数肯定就是实现某个功能,
它传递了一个参数edi,edi=77118,然后生成的487704,吃过了CrackMe 001的亏,我没跟了,先直接换算看看,
结果发现0x77118=487704(10进制),验证了猜想。
算法的核心代码如下:
[Asm] 纯文本查看 复制代码
00402412 . 50 push eax ; /eax=164c6c [eax]=11111 输入的字符串
00402413 . 8B1A mov ebx,dword ptr ds:[edx] ; |ebx=9e4950
00402415 . FF15 E4404000 call dword ptr ds:[<&MSVBVM50.__vbaLenBstr>] ; \eax=5..计算字符串长度
0040241B . 8BF8 mov edi,eax ; edi=5
0040241D . 8B4D E8 mov ecx,dword ptr ss:[ebp-0x18] ; ecx=[12f4c8]=11111
00402420 . 69FF FB7C0100 imul edi,edi,0x17CFB ; edi=edi(5)*17cfb=770e7
00402426 . 51 push ecx ; /String = "?"
00402427 . 0F80 91020000 jo Afkayas_.004026BE ; |
0040242D . FF15 F8404000 call dword ptr ds:[<&MSVBVM50.#rtcAnsiValueBstr_516>] ; \返回字符串的第一个字符,eax=31,edx=163dee,[edx]=1111
00402433 . 0FBFD0 movsx edx,ax ; edx=31
00402436 . 03FA add edi,edx ; edi=770e7+31=77118
00402438 . 0F80 80020000 jo Afkayas_.004026BE
0040243E . 57 push edi
0040243F . FF15 E0404000 call dword ptr ds:[<&MSVBVM50.__vbaStrI4>] ; msvbvm50.__vbaStrI4
00402445 . 8BD0 mov edx,eax ; /eax=15e68c,[eax]="487704" edx=487704
00402447 . 8D4D E0 lea ecx,dword ptr ss:[ebp-0x20] ; ecx=12f4c0
0040244A . FF15 70414000 call dword ptr ds:[<&MSVBVM50.__vbaStrMove>] ; msvbvm50.__vbaStrMove
00402450 . 8BBD 50FFFFFF mov edi,dword ptr ss:[ebp-0xB0] ; edi=[12f430]=91b524
简单来说,就是取你输入“11111”的字符串长度,然后乘以0x17cb,然后加上第一个字符串的ascii码0x31,即5*17cfb+31=77118 0x77118=(10进制)487704.
Python3:
str=input("请随便输入一个账户,如11111:")
print("生成的密码为:"+"AKA-"+"%d"%(len(str)*0x17cfb+ord(str[0])))
上述若有不到之处,请望指正
|