Paryi 发表于 2023-3-4 01:49

萌新写的一个很简单的 crack me 无壳

本帖最后由 Paryi 于 2023-3-4 11:49 编辑

(或许这个 CrackMe 的 UI 设计还可以哈哈哈)



萌新第一次尝试写 CrackMe,刚刚开始玩逆向写的,啥都不是很懂希望各位大佬见谅... 若有啥错误的地方请麻烦指出我好改正...

成熟的美羊羊 发表于 2023-3-5 18:26

本帖最后由 成熟的美羊羊 于 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。
```
楼主的编辑框控件在复制粘贴时是有漏洞的,小声。:)

dmhyvip 发表于 2023-3-5 08:28

很有创意,感谢分享

55879021 发表于 2023-3-5 14:10

嘿嘿 支持下

debug_cat 发表于 2023-3-6 09:25

顶帖顶帖,支持

hahhahah 发表于 2023-3-6 09:59

支持下,感谢分享!

huduke 发表于 2023-3-6 17:19

感谢分享!

阿政0506 发表于 2023-3-10 15:25

想知道这是什么语言写的界面,看起来好炫酷

Paryi 发表于 2023-3-10 22:01

阿政0506 发表于 2023-3-10 15:25
想知道这是什么语言写的界面,看起来好炫酷

C++ 写的,用的是我自己写的 DirectUI 界面库

阿政0506 发表于 2023-3-13 17:22

Paryi 发表于 2023-3-10 22:01
C++ 写的,用的是我自己写的 DirectUI 界面库

老哥,能否分享下{:1_899:}
页: [1] 2
查看完整版本: 萌新写的一个很简单的 crack me 无壳