这个是置顶帖子 里面的一个OD学习帖子
由于课程需要 才学习汇编1个月 这个是我第一次接触的CRACKME(在附件里面 已脱壳) 对于下面的那个解释 我确实不知道是什么意思
下面看看人家的分析 :
用OD打开 然后查看字符串“ Wrong Serial,try again!” 跟着就进入到对应代码了 然后 看了看这个代码是从00440F39这个单元跳过来的 然后 就找到了如下面的代码:
00440F21 |. 8B83 C4020000 mov eax, dword ptr [ebx+2C4]
00440F27 |. E8 F4FEFDFF call 00420E20
00440F2C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 把我们输入的内容送到EAX,我这里是“CCDebuger”
00440F2F |. BA 14104400 MOV EDX,CrackMe3.00441014 ; ASCII "Registered User"
00440F34 |. E8 F32BFCFF CALL CrackMe3.00403B2C ; 关键,要用F7跟进去
00440F39 |. 75 51 JNZ SHORT CrackMe3.00440F8C ; 这里跳走就完蛋
他这里说00440F2C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
很明显 说明输入的内容在 SS:[EBP-4]里面 然后传到AX里面 我如果把断点下在 00440F21 两次F8后 AX里面的内容就是我当前输入字符串的长度 可以看出来 计算字符串长度的函数就是 call 00420E20 此时 我不去理会他是怎么算出来的 再按一路到00440F34 |. E8 F32BFCFF CALL CrackMe3.00403B2C 这个时候 用F7进入函数 :
00403B2C /$ 53 PUSH EBX
00403B2D |. 56 PUSH ESI
00403B2E |. 57 PUSH EDI
00403B2F |. 89C6 MOV ESI,EAX ; 把EAX内我们输入的用户名送到 ESI
00403B31 |. 89D7 MOV EDI,EDX ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0 CMP EAX,EDX ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000 JE CrackMe3.00403BCA ; 相同则跳
00403B3B |. 85F6 TEST ESI,ESI ; 看看ESI中是否有数据,主要是看看我们有没有输入用户名
00403B3D |. 74 68 JE SHORT CrackMe3.00403BA7 ; 用户名为空则跳
00403B3F |. 85FF TEST EDI,EDI
00403B41 |. 74 6B JE SHORT CrackMe3.00403BAE
00403B43 |. 8B46 FC MOV EAX,DWORD PTR DS:[ESI-4] ; 用户名长度送EAX
00403B46 |. 8B57 FC MOV EDX,DWORD PTR DS:[EDI-4] ; “Registered User”字串的长度送EDX
我要问的问题就在上面两行 这里的SI寄存器里面放的内容是我们输入的用户名 寄存器DI里面放的是数据Registered User的地址 为什么 他用DWORD PTR DS:[ESI-4] 就表示用户名长度 。 DWORD PTR DS:[EDI-4]就表示 “Registered User”字串的长度
前面我提到 在 call 00420E20 后 AX里面就是字符传长度了 这里他怎么调用确实没有看出为什么
我为了看清楚 在 call 00420E20时 用F7跟入了 但是 随后又必须再跟入20几个CALL后 AX里面的内容才发生变化 这个确实是我能力不及的 请问 他是怎么把这个字符串长度送进去的
另外 在问下 如果我在OD里面对程序做了相应修改 怎么把这个修改保存下来 就像其他软件样 辈分一个新的修改好了的程序
[课程]Android-CTF解题方法汇总!