萌新写的一个很简单的 crack me 无壳
本帖最后由 Paryi 于 2023-3-4 11:49 编辑(或许这个 CrackMe 的 UI 设计还可以哈哈哈)
萌新第一次尝试写 CrackMe,刚刚开始玩逆向写的,啥都不是很懂希望各位大佬见谅... 若有啥错误的地方请麻烦指出我好改正... 本帖最后由 成熟的美羊羊 于 2023-3-5 19:01 编辑
CheatEngine附加程序,搜索输入的mInput下,遍历几次就可以锁定唯一的数据了,对其下上硬件访问断点。
最终,我们会定位到这个函数。
```cpp
140001350int64_t sub_140001350(int16_t* arg1, char* arg2)
```
控制流代码很简单,直接修改 “关键跳3”程序出现“Good,Job”。
```cpp
140001790 if (mSuccessLength == SuccessLength)
14000178d {
140001799 mIsFailFlag = memcmp(mInput, &mSuccess, mSuccessLength);
1400017a0 if (mIsFailFlag == 0)// 关键跳2
14000179e {
1400017a2 mIsFailFlag2 = 0;// 如果为0,则走1400026c7
1400017a2 }
14000178d }
1400017a0 // 关键跳2
1400017a0 if ((mSuccessLength != SuccessLength || (mSuccessLength == SuccessLength && mIsFailFlag != 0)))
14000179e {
1400017a7 mIsFailFlag2 = 1;// 如果为1,则跳过1400026c7
1400017a7 }
140001813 int128_t zmm1_11;// 关键跳3
140001813 int128_t zmm0_11;
140001813 if (mIsFailFlag2 == 0)
140001810 {
1400026c7 int64_t var_14a0 = 0x413c0458d70ea426;
1400026d6 int64_t var_1498_1 = -0x6d6d5a1eee442c04;
1400026f4 int64_t var_b28_1 = -0x6d6d5a1eee442c04;
14000270b var_14a0 = (var_14a0 ^ 0x413c0428d77ea447);
140002716 int128_t var_13f8 = 0;
140002739 do
140002739 {
140002730 r8_3 = ((char*)r8_3 + 1);
140002730 } while (*(int16_t*)(&var_14a0 + (r8_3 << 1)) != 0);
140002749 ......
```
我们到“关键跳2”中调用memcmp函数的地址140001799下断点,可以获取的信息:mSuccess字符串:“SQAgAFcASQBMAEwAIABMAE8A”与要对比的字符串长度:0x18。
很明显的base64编码,如果不知道,可以在论坛搜索base64,base58,basexx。
我们在百度上搜索这一字符串,看到了与该字符串非常相似的内容。
(https://tieba.baidu.com/p/8100877449)
```cpp
看看是不是base64编码
这东西没法子说,像aes 又像base64
```
到base64在线解码的网站上解码,看样子是有不错的信息。
(https://base64.us/)
```cpp
I WILL LO
```
奇怪?似乎该字符串只有9的长度,但是要求我们输入字符串长度为24。
现在,我们要做的就是对**数据流**进行分析,可以直接将"I WILL LO"字符串扩展到24字符串的格式,不过我的习惯是先通过00,11进行测试。
对该地址下断点,点击btn,进行登录操作。
```cpp
140001490f30f6f1410 movdquxmm2, xmmword
```
对rax+rdx地址进行数据填充00,对该地址进行下断点,F8步过该地址后,数据变化如下,此时我们进行单步分析。
```cpp
1400014ebf30f7f09 movdquxmmword , xmm1
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
```
很长的一段汇编,实际上只是对字符串进行解码操作。猜测楼主使用了编译时保护技术,如果是简单的嵌入汇编,只能佩服楼主的耐心与汇编能力了,竟然用到了SSE,MMX指令集。
```cpp
14000163348b814f53fb06942…mov rax, 0x5f4269b03ff514
14000163d48894500 mov qword , rax{0x5f4269b03ff514}
140001641488b4500 mov rax, qword {0x5f4269b03ff514}
14000164548898560030000 mov qword , rax{0x5f4269b03ff514}
14000164c48b8af82f95ca0e0…mov rax, 0xd3e5e0a05cf982af
14000165648894500 mov qword , rax{0xd3e5e0a05cf982af}
14000165a488b4500 mov rax, qword {0xd3e5e0a05cf982af}
14000165e48898568030000 mov qword , rax{0xd3e5e0a05cf982af}
14000166548b868a9b34ac7a7…mov rax, 0x1beea7c74ab3a968
14000166f48894500 mov qword , rax{0x1beea7c74ab3a968}
140001673488b4500 mov rax, qword {0x1beea7c74ab3a968}
14000167748898570030000 mov qword , rax{0x1beea7c74ab3a968}
14000167e48b9a6b046eca711…mov rcx, 0xe2da11a7ec46b0a6
14000168848894d00 mov qword , rcx{0xe2da11a7ec46b0a6}
14000168c488b4500 mov rax, qword {0xe2da11a7ec46b0a6}
14000169048898578030000 mov qword , rax{0xe2da11a7ec46b0a6}
14000169749bd47a47ed72804…mov r13, 0x413c0428d77ea447
1400016a14c896d00 mov qword , r13{0x413c0428d77ea447}
1400016a5488b4500 mov rax, qword {0x413c0428d77ea447}
1400016a9488985a00b0000 mov qword , rax{0x413c0428d77ea447}
1400016b049bffcd3bb11e1a5…mov r15, 0x9292a5e111bbd3fc
1400016ba4c897d00 mov qword , r15{0x9292a5e111bbd3fc}
1400016be488b4500 mov rax, qword {0x9292a5e111bbd3fc}
1400016c2488985a80b0000 mov qword , rax{0x9292a5e111bbd3fc}
1400016c948b821e8f10786e2…mov rax, 0x5ad6e28607f1e821
1400016d348894500 mov qword , rax{0x5ad6e28607f1e821}
1400016d7488b4500 mov rax, qword {0x5ad6e28607f1e821}
1400016db488985b00b0000 mov qword , rax{0x5ad6e28607f1e821}
1400016e248894d00 mov qword , rcx{0xe2da11a7ec46b0a6}
1400016e6488b4500 mov rax, qword {0xe2da11a7ec46b0a6}
1400016ea488985b80b0000 mov qword , rax{0xe2da11a7ec46b0a6}
1400016f1c5fe6f8560030000 vmovdqu ymm0, ymmword
1400016f9c5fdef8da00b0000 vpxor ymm1, ymm0, ymmword
140001701c5fd7f8d60030000 vmovdqa ymmword , ymm1
140001709c5f857c0 vxorpsxmm0, xmm0, xmm0
14000170dc5f8118520010000 vmovups xmmword , xmm0
140001715c5f057c9 vxorpsxmm1, xmm1, xmm1
140001719c5fa7f8d30010000 vmovdqu xmmword , xmm1
140001721488d85c00c0000 lea rax,
14000172848c7c6ffffffff mov rsi, 0xffffffffffffffff
14000172f4c8bc6 mov r8, rsi{0xffffffffffffffff}
140001732c5f877 vzeroupper
最终解码出0000000140001782| rcx:"SQAgAFcASQBMAEwAIABMAE8A"
```
继续单步分析,步过了这个Call。wow,似乎rdx的字符串长度刚好是0x9了。注意到了吗,在日志里,还没进CALL ,rdx指向的字符串长度就已经是9了,这说明咱们找错了,哈哈。
不过我们知道了程序是如何定位到的字符串,0xcc0是关键,我们找到了对字符串进行赋值的地址。
```cpp
14000173f488d95c00c0000 lea rdx, rdx:"AAAAAAAAA"
140001746488d8d20010000 lea rcx, rcx是存储新字符串的地址
14000174de8ced20000 call sub_14000ea20
140001752488d8d60030000 lea rcx,
rdx:41 41 41 41 41 41 41 41 41 00 41 41 41 41 41 41
往上翻翻,我们找到了赋值为0的地址了。
1400015ccc68405c00c000000 mov byte , 0x0
```
接下来,我们重复一下上面的操作,这次覆盖的数值如下,后面的数值依旧没有变化,这能证明楼主写的base64有问题,如果我们输入的是“1234567812345678”,base64解码后。
```cpp
01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
---->
41 51 41 43 41 41 4D 41 42 41 41 46 41 41 59 41 42 77 41 49 41 41 6B 41 00 41 41 41 41 41 41 41
“1234567812345678”
---->
“123456781234”
```
既然程序给了一个非常有用的字符串,我们试试猜答案,“I WILL LO”+15个任意字符便是正确flag。
楼主心中的flag是什么呢?也许是“将喜欢逆向一千万年”、“我将丢掉腐败的习惯”?
```cpp
I WILL LOVE 逆向10000000年。
I WILL LOSE CORRUPT ALL。
```
楼主的编辑框控件在复制粘贴时是有漏洞的,小声。:) 很有创意,感谢分享 嘿嘿 支持下 顶帖顶帖,支持 支持下,感谢分享! 感谢分享! 想知道这是什么语言写的界面,看起来好炫酷 阿政0506 发表于 2023-3-10 15:25
想知道这是什么语言写的界面,看起来好炫酷
C++ 写的,用的是我自己写的 DirectUI 界面库 Paryi 发表于 2023-3-10 22:01
C++ 写的,用的是我自己写的 DirectUI 界面库
老哥,能否分享下{:1_899:}
页:
[1]
2