t00t00 发表于 2020-9-14 20:07

【已解出】新手自制低难度 KeygenMe,24小时内第1个完成者奖50元人民币

本帖最后由 t00t00 于 2020-9-15 11:16 编辑

# 新手自制低难度 KeygenMe,24 小时内第 1 个完成者奖 50 元人民币

## 信息
支持平台:Linux、MAC、Win32、Win64
加壳信息:UPX 压缩壳,直接可以脱,单纯压缩用。
类型:用户名 + 注册码





提供两组用户名和注册码

用户名1:username
注册码1:961588245s8d6

用户名2:test
注册码2:99ssd20

## 声明:
1. 干净环境中,10秒内出提示且不能虚假提示;
2. KeyGen算法不能基于“未在CrackMe中公开的秘密信息”。如果需要穷举,则穷举时间必须小于5分钟;
3. 不能依赖网络、不能依赖硬件;
4. 不使用第三方保护工具、禁止恶意破坏机器;
5. 不超过10M;
6. 同一用户名不应有多个序列号;
7. 注册码字符集限定为['0','9'],['a','z'],['A','Z'];
8. 绿色安全,不含木马或 rootkit,没有任何危险或恶意程序,不能对系统进行破坏,可以正常结束,结束后不会给系统留下垃圾(比如临时文件或驱动),不会使系统重启。
9. 除 UPX 外,没有使用额外的软件加花/加壳/混淆。编译参数会与原代码一起公布。
10. 无反反编译技术,纯算法。
11. 因为忘记改静态优化范围,所以很快就可以解。。。

## 奖励
24 小时内第一个写出 KeyGen ***或***第一个获得用户名“wuaipojie”的注册码奖励 50 元。本项目 24 小时后开源。(截至 2020 年 9 月 16 日 00:00:00)
***注:50 元并不代表难度大,就是想看看大佬破解的过程。***

## 下载链接:
[文叔叔(2天有效)](https://ws28.cn/f/3i14jet53fs)
[蓝奏云(永久有效)](https://wws.lanzouj.com/ifhrxgmeuif)

灰灰。 发表于 2020-9-15 00:05

请输入用户名:
wuaipojie
请输入注册码:
02910966929d68s
成功注册!你太牛逼了!
在 2020 年 9 月 16 日 00:00 前,私发支付宝号 + 本次注册码获取红包

算法就不逆了,也是时间问题~

solly 发表于 2020-9-15 11:03

t00t00 发表于 2020-9-15 08:39
大佬完整写一次教程吧,另送200CB,CTF有用到,但是没头绪,就来吾爱破解找师傅了。听说要 ...

符号还原没弄过,我都是直接上 OD。

逆向的大概过程如下:
1、先查看文件信息,upx 压缩。先去壳: upx -d win32.exe 就可以了。
2、用IDA打开,看导入表,没有看到控制台输入相关API函数,但有一个输出相关API,WriteConsoleW() ,直接下断 bp WriteConsoleW。
3、F9 运行程序,程序会中断在WriteConsoleW 中,F2取消中断,按 Ctrl+F9,再 F8 返回,再Ctrl+F9,F8,这样循环按,一直到 Ctrl+F9不再定位到 ret 指令,这时就是定位到了算法代码位置了,这个时候会要输入用户名才可继续了。
4、从刚才F8返回的位置往下看的第1个call就是输入用户名调用,在这个call的后面下F2断点,再去输入用户就可以继续断下来,一路F8,后面再输入序列号就是跟踪算法了。
相关代码如下:
0049A470   > \8D05 C0C74A00         lea eax,dword ptr ds:
0049A476   .890424                mov dword ptr ss:,eax
0049A479   .E8 F2FFF6FF         call win32.0040A470
0049A47E   .8B4424 04             mov eax,dword ptr ss:
0049A482   .898424 98000000       mov dword ptr ss:,eax
0049A489   .C78424 B4000000 00000>mov dword ptr ss:,0x0
0049A494   .C78424 B8000000 00000>mov dword ptr ss:,0x0
0049A49F   .8D0D C0C74A00         lea ecx,dword ptr ds:
0049A4A5   .898C24 B4000000       mov dword ptr ss:,ecx
0049A4AC   .8D15 A0D04D00         lea edx,dword ptr ds:
0049A4B2   .899424 B8000000       mov dword ptr ss:,edx
0049A4B9   .8B15 B8625600         mov edx,dword ptr ds:
0049A4BF   .8D1D 50E04D00         lea ebx,dword ptr ds:
0049A4C5   .891C24                mov dword ptr ss:,ebx
0049A4C8   .895424 04             mov dword ptr ss:,edx
0049A4CC   .8D9424 B4000000       lea edx,dword ptr ss:
0049A4D3   .895424 08             mov dword ptr ss:,edx
0049A4D7   .C74424 0C 01000000    mov dword ptr ss:,0x1
0049A4DF   .C74424 10 01000000    mov dword ptr ss:,0x1
0049A4E7   .E8 B44BFFFF         call win32.0048F0A0                      ;print("请输入用户名:")
0049A4EC   .C78424 AC000000 00000>mov dword ptr ss:,0x0
0049A4F7   .C78424 B0000000 00000>mov dword ptr ss:,0x0
0049A502   .8D05 A0564A00         lea eax,dword ptr ds:
0049A508   .898424 AC000000       mov dword ptr ss:,eax
0049A50F   .8B8424 98000000       mov eax,dword ptr ss:
0049A516   .898424 B0000000       mov dword ptr ss:,eax
0049A51D   .8B0D B4625600         mov ecx,dword ptr ds:
0049A523   .8D15 30E04D00         lea edx,dword ptr ds:
0049A529   .891424                mov dword ptr ss:,edx
0049A52C   .894C24 04             mov dword ptr ss:,ecx
0049A530   .8D8C24 AC000000       lea ecx,dword ptr ss:
0049A537   .894C24 08             mov dword ptr ss:,ecx
0049A53B   .C74424 0C 01000000    mov dword ptr ss:,0x1
0049A543   .C74424 10 01000000    mov dword ptr ss:,0x1
0049A54B   .E8 009FFFFF         call win32.00494450                      ;input_name
0049A550   .8D05 40724A00         lea eax,dword ptr ds:
0049A556   .890424                mov dword ptr ss:,eax
0049A559   .E8 12FFF6FF         call win32.0040A470
0049A55E   .8B4424 04             mov eax,dword ptr ss:
0049A562   .898424 94000000       mov dword ptr ss:,eax
0049A569   .C78424 A4000000 00000>mov dword ptr ss:,0x0
0049A574   .C78424 A8000000 00000>mov dword ptr ss:,0x0
0049A57F   .8D0D C0C74A00         lea ecx,dword ptr ds:
0049A585   .898C24 A4000000       mov dword ptr ss:,ecx
0049A58C   .8D15 A8D04D00         lea edx,dword ptr ds:
0049A592   .899424 A8000000       mov dword ptr ss:,edx
0049A599   .8B15 B8625600         mov edx,dword ptr ds:
0049A59F   .8D1D 50E04D00         lea ebx,dword ptr ds:
0049A5A5   .891C24                mov dword ptr ss:,ebx
0049A5A8   .895424 04             mov dword ptr ss:,edx
0049A5AC   .8D9424 A4000000       lea edx,dword ptr ss:
0049A5B3   .895424 08             mov dword ptr ss:,edx
0049A5B7   .C74424 0C 01000000    mov dword ptr ss:,0x1
0049A5BF   .C74424 10 01000000    mov dword ptr ss:,0x1
0049A5C7   .E8 D44AFFFF         call win32.0048F0A0                      ;print("请输入注册码:")
0049A5CC   .C78424 9C000000 00000>mov dword ptr ss:,0x0
0049A5D7   .C78424 A0000000 00000>mov dword ptr ss:,0x0
0049A5E2   .8D05 202E4A00         lea eax,dword ptr ds:
0049A5E8   .898424 9C000000       mov dword ptr ss:,eax
0049A5EF   .8B8424 94000000       mov eax,dword ptr ss:
0049A5F6   .898424 A0000000       mov dword ptr ss:,eax
0049A5FD   .8B0D B4625600         mov ecx,dword ptr ds:
0049A603   .8D15 30E04D00         lea edx,dword ptr ds:
0049A609   .891424                mov dword ptr ss:,edx
0049A60C   .894C24 04             mov dword ptr ss:,ecx
0049A610   .8D8C24 9C000000       lea ecx,dword ptr ss:
0049A617   .894C24 08             mov dword ptr ss:,ecx
0049A61B   .C74424 0C 01000000    mov dword ptr ss:,0x1
0049A623   .C74424 10 01000000    mov dword ptr ss:,0x1
0049A62B   .E8 209EFFFF         call win32.00494450                      ;input(sn)
0049A630   .8B8424 98000000       mov eax,dword ptr ss:
0049A637   .8B08                  mov ecx,dword ptr ds:               ;ecx ==> name
0049A639   .898C24 90000000       mov dword ptr ss:,ecx
0049A640   .8B50 04               mov edx,dword ptr ds:         ;edx = len(name)
0049A643   .895424 44             mov dword ptr ss:,edx
0049A647   .31DB                  xor ebx,ebx
0049A649   .31ED                  xor ebp,ebp
0049A64B   .31F6                  xor esi,esi
0049A64D   .E9 89000000         jmp win32.0049A6DB
0049A652   >895C24 30             mov dword ptr ss:,ebx          ;i, ebx
0049A656   .0FB6040B            movzx eax,byte ptr ds:          ;name
0049A65A   .8D5424 52             lea edx,dword ptr ss:
0049A65E   .891424                mov dword ptr ss:,edx               ;edx ==> "12s45d6890ABCbER3HTJKLMNOPQFSmUyWaYZXDc7efghijklInopqrGtuvwxVz"
0049A661   .C74424 04 3E000000    mov dword ptr ss:,0x3E          ;62
0049A669   .C74424 08 3E000000    mov dword ptr ss:,0x3E          ;62
0049A671   .884424 0C             mov byte ptr ss:,al             ;name
0049A675   .E8 C67DF6FF         call win32.00402440                      ;int idx = edx->indexOf(name)
0049A67A   .8B4424 10             mov eax,dword ptr ss:
0049A67E   .f20f2ac0            cvtsi2sd xmm0,eax
0049A682   .f20f110424            movsd qword ptr ss:,xmm0
0049A687   .8B4424 30             mov eax,dword ptr ss:
0049A68B   .40                  inc eax                                  ;i+1
0049A68C   .894424 40             mov dword ptr ss:,eax
0049A690   .f20f2ac0            cvtsi2sd xmm0,eax
0049A694   .f20f114424 08         movsd qword ptr ss:,xmm0
0049A69A   .E8 718BFCFF         call win32.00463210                      ;pow(idx, i+1)
0049A69F   .f20f104424 10         movsd xmm0,qword ptr ss:
0049A6A5   .f20f110424            movsd qword ptr ss:,xmm0
0049A6AA   .E8 913DFBFF         call win32.0044E440                      ;Double2Int64
0049A6AF   .8B4424 08             mov eax,dword ptr ss:
0049A6B3   .8B4C24 24             mov ecx,dword ptr ss:
0049A6B7   .01C1                  add ecx,eax                              ;chk_sum_lo
0049A6B9   .8B6C24 0C             mov ebp,dword ptr ss:
0049A6BD   .8B4424 28             mov eax,dword ptr ss:
0049A6C1   .11C5                  adc ebp,eax                              ;chk_sum_hi
0049A6C3   .8B8424 98000000       mov eax,dword ptr ss:
0049A6CA   .8B5424 44             mov edx,dword ptr ss:
0049A6CE   .8B5C24 40             mov ebx,dword ptr ss:
0049A6D2   .89CE                  mov esi,ecx
0049A6D4   .8B8C24 90000000       mov ecx,dword ptr ss:
0049A6DB   >896C24 28             mov dword ptr ss:,ebp
0049A6DF   .897424 24             mov dword ptr ss:,esi
0049A6E3   .39D3                  cmp ebx,edx
0049A6E5   .^ 0F8C 67FFFFFF         jl win32.0049A652                        ;loop
0049A6EB   .8B8424 94000000       mov eax,dword ptr ss:          ; ===> sn
0049A6F2   .8B48 04               mov ecx,dword ptr ds:         ;len_sn
0049A6F5   .894C24 44             mov dword ptr ss:,ecx
0049A6F9   .893424                mov dword ptr ss:,esi
0049A6FC   .896C24 04             mov dword ptr ss:,ebp
0049A700   .C74424 08 0A000000    mov dword ptr ss:,0xA
0049A708   .E8 8325FDFF         call win32.0046CC90                      ;int64toStr(chk_sum)
0049A70D   .8B4424 44             mov eax,dword ptr ss:
0049A711   .394424 10             cmp dword ptr ss:,eax          ;len_check_sn_str == 8
0049A715   .0F85 76020000         jnz win32.0049A991                     ;goto 显示长度错误
0049A71B   >8B4424 24             mov eax,dword ptr ss:
0049A71F   .8B4C24 28             mov ecx,dword ptr ss:
0049A723   .31D2                  xor edx,edx
0049A725   .EB 09               jmp short win32.0049A730
0049A727   >8D58 01               lea ebx,dword ptr ds:
0049A72A   .89C8                  mov eax,ecx
0049A72C   .89D1                  mov ecx,edx
0049A72E   .89DA                  mov edx,ebx
0049A730   >85C9                  test ecx,ecx
0049A732   .0F94C3                sete bl
0049A735   .87DD                  xchg ebp,ebx
0049A737   .0F97C3                seta bl
0049A73A   .87DD                  xchg ebp,ebx
0049A73C   .85C0                  test eax,eax
0049A73E   .87DE                  xchg esi,ebx
0049A740   .0F97C3                seta bl
0049A743   .87DE                  xchg esi,ebx
0049A745   .21F3                  and ebx,esi
0049A747   .09DD                  or ebp,ebx
0049A749   .95                  xchg eax,ebp
0049A74A   .84C0                  test al,al
0049A74C   .95                  xchg eax,ebp
0049A74D   .0F84 3C010000         je win32.0049A88F                        ;全部正确则跳转
0049A753   .894424 24             mov dword ptr ss:,eax
0049A757   .894C24 28             mov dword ptr ss:,ecx
0049A75B   .895424 2C             mov dword ptr ss:,edx
0049A75F   .890424                mov dword ptr ss:,eax
0049A762   .894C24 04             mov dword ptr ss:,ecx
0049A766   .E8 153EFBFF         call win32.0044E580                      ;int64toDouble(check_sum)
0049A76B   .f20f104424 08         movsd xmm0,qword ptr ss:
0049A771   .f20f110424            movsd qword ptr ss:,xmm0
0049A776   .f20f1005 40cf4d00   movsd xmm0,qword ptr ds:       ;常量Double: 10
0049A77E   .f20f114424 08         movsd qword ptr ss:,xmm0
0049A784   .E8 F789FCFF         call win32.00463180                      ;mod(check_sum, 10)
0049A789   .f20f104424 10         movsd xmm0,qword ptr ss:
0049A78F   .f20f114424 48         movsd qword ptr ss:,xmm0
0049A795   .8B4424 24             mov eax,dword ptr ss:
0049A799   .890424                mov dword ptr ss:,eax
0049A79C   .8B4424 28             mov eax,dword ptr ss:
0049A7A0   .894424 04             mov dword ptr ss:,eax
0049A7A4   .C74424 08 0A000000    mov dword ptr ss:,0xA         ;10
0049A7AC   .C74424 0C 00000000    mov dword ptr ss:,0x0
0049A7B4   .E8 573FFBFF         call win32.0044E710                      ;check_sum = (int)div(check_sum, 10)
0049A7B9   .f20f104424 48         movsd xmm0,qword ptr ss:
0049A7BF   .f20f2cc0            cvttsd2si eax,xmm0
0049A7C3   .8B4C24 10             mov ecx,dword ptr ss:
0049A7C7   .8B5424 14             mov edx,dword ptr ss:
0049A7CB   .83F8 3E               cmp eax,0x3E                           ;eax是mod()的结果。
0049A7CE   .0F83 38020000         jnb win32.0049AA0C
0049A7D4   .0FB65C04 52         movzx ebx,byte ptr ss:   ;查表
0049A7D9   .8BAC24 94000000       mov ebp,dword ptr ss:
0049A7E0   .8B75 04               mov esi,dword ptr ss:
0049A7E3   .8B7D 00               mov edi,dword ptr ss:               ;edi ==> input_sn
0049A7E6   .8B4424 2C             mov eax,dword ptr ss:
0049A7EA   .39F0                  cmp eax,esi
0049A7EC   .0F83 13020000         jnb win32.0049AA05
0049A7F2   .0FB63438            movzx esi,byte ptr ds:          ;取输入的sn
0049A7F6   .96                  xchg eax,esi
0049A7F7   .38C3                  cmp bl,al                              ;字符比较,这里可得到正确的明文字符序列号
0049A7F9   .96                  xchg eax,esi
0049A7FA   .^ 0F84 27FFFFFF         je win32.0049A727
0049A800   .894C24 3C             mov dword ptr ss:,ecx
0049A804   .895424 38             mov dword ptr ss:,edx
0049A808   .C78424 CC000000 00000>mov dword ptr ss:,0x0
0049A813   .C78424 D0000000 00000>mov dword ptr ss:,0x0
0049A81E   .8D05 C0C74A00         lea eax,dword ptr ds:
0049A824   .898424 CC000000       mov dword ptr ss:,eax
0049A82B   .8D0D B8D04D00         lea ecx,dword ptr ds:
0049A831   .898C24 D0000000       mov dword ptr ss:,ecx
0049A838   .8B15 B8625600         mov edx,dword ptr ds:
0049A83E   .8D1D 50E04D00         lea ebx,dword ptr ds:
0049A844   .891C24                mov dword ptr ss:,ebx
0049A847   .895424 04             mov dword ptr ss:,edx
0049A84B   .8D9424 CC000000       lea edx,dword ptr ss:
0049A852   .895424 08             mov dword ptr ss:,edx
0049A856   .C74424 0C 01000000    mov dword ptr ss:,0x1
0049A85E   .C74424 10 01000000    mov dword ptr ss:,0x1
0049A866   .E8 3548FFFF         call win32.0048F0A0                      ;print("认证失败!")
0049A86B   .C70424 01000000       mov dword ptr ss:,0x1
0049A872   .E8 491BFFFF         call win32.0048C3C0
0049A877   .8B4424 2C             mov eax,dword ptr ss:
0049A87B   .8B4C24 3C             mov ecx,dword ptr ss:
0049A87F   .8B5424 38             mov edx,dword ptr ss:
0049A883   .8BAC24 94000000       mov ebp,dword ptr ss:
0049A88A   .^ E9 98FEFFFF         jmp win32.0049A727
0049A88F   >C78424 C4000000 00000>mov dword ptr ss:,0x0
0049A89A   .C78424 C8000000 00000>mov dword ptr ss:,0x0
0049A8A5   .8D05 C0C74A00         lea eax,dword ptr ds:
0049A8AB   .898424 C4000000       mov dword ptr ss:,eax
0049A8B2   .8D0D C0D04D00         lea ecx,dword ptr ds:
0049A8B8   .898C24 C8000000       mov dword ptr ss:,ecx
0049A8BF   .8B0D B8625600         mov ecx,dword ptr ds:
0049A8C5   .8D15 50E04D00         lea edx,dword ptr ds:
0049A8CB   .891424                mov dword ptr ss:,edx
0049A8CE   .894C24 04             mov dword ptr ss:,ecx
0049A8D2   .8D8C24 C4000000       lea ecx,dword ptr ss:
0049A8D9   .894C24 08             mov dword ptr ss:,ecx
0049A8DD   .C74424 0C 01000000    mov dword ptr ss:,0x1
0049A8E5   .C74424 10 01000000    mov dword ptr ss:,0x1
0049A8ED   .E8 AE47FFFF         call win32.0048F0A0
0049A8F2   .8B8424 98000000       mov eax,dword ptr ss:
0049A8F9   .8B48 04               mov ecx,dword ptr ds:
0049A8FC   .8B00                  mov eax,dword ptr ds:
0049A8FE   .83F9 09               cmp ecx,0x9
0049A901   .74 07               je short win32.0049A90A
0049A903   >81C4 DC000000         add esp,0xDC
0049A909   .C3                  retn


solly 发表于 2020-9-15 01:43

本帖最后由 solly 于 2020-9-15 01:48 编辑

#include <iostream>
#include <string.h>
#include <math.h>

const char base[] = "12s45d6890ABCbER3HTJKLMNOPQFSmUyWaYZXDc7efghijklInopqrGtuvwxVz";
const long count = 62;

int main(int argc, char** argv) {
       
        //char name[] = "solly";
        char name[] = "wuaipojie";
        char pwd;
       
        int n = strlen(name);
       
        unsigned long long sum = 0;
        for(int i=0; i<n; i++) {
                int idx = -1;
                for(int j=0; j<count; j++) {
                        if(name == base) {
                                idx = j;
                                break;
                        }
                }
                printf("idx: %d\n", idx);
                sum += pow(idx, i+1);
        }
       
        printf("check sum: %llu\n", sum);
       
        int i = 0;
        while(sum>0) {
                int idx = sum % 10;
                sum = sum / 10;
                pwd = base;
        }
        pwd = '\0';
       
        printf("password: %s\n", pwd);
       
        return 0;
}

t00t00 发表于 2020-9-15 08:20

solly 发表于 2020-9-15 01:43
#include
#include
#include


感谢感谢,希望能够完整讲讲这个破解过程。因为 @灰灰。第一个解出,所以就

灰灰。 发表于 2020-9-15 10:23

本帖最后由 灰灰。 于 2020-9-15 10:30 编辑

t00t00 发表于 2020-9-15 08:20
感谢感谢,希望能够完整讲讲这个破解过程。因为 @灰灰。第一个解出,所以就
符号还原使用IDAGolangHelper,main函数就是符号还原后名为main_main的函数,剩下的就是看main函数里的内容了,基本都很清晰

shaunkelly 发表于 2020-9-14 20:15

50元美刀,这个是可以有的哦

t00t00 发表于 2020-9-14 20:16

shaunkelly 发表于 2020-9-14 20:15
50元美刀,这个是可以有的哦

难度不够大,如果加了反反编译,我会提高到50美元的:lol

t00t00 发表于 2020-9-15 08:24

相关代码已开源,https://github.com/t00t00-crypto/crackme1

希望各位大佬能够完整讲讲符号信息还原的方式和找到main函数的方式。

solly 发表于 2020-9-15 08:38

t00t00 发表于 2020-9-15 08:20
感谢感谢,希望能够完整讲讲这个破解过程。因为 @灰灰。第一个解出,所以就

这个是go语言编译的多线程程序,从start()入手不行,以前没弄过go语言的,先了解了一下go。
突破点从控制台输入输出API入手,就可以定位到算法代码。不逆算法很快可以定位字符比较位置,明文比较的,因此只要把输入API断下,输入完序列号,在序列号下内存硬中断,可以瞬间定位字符比较位置,其它什么都不用看了。

t00t00 发表于 2020-9-15 08:39

本帖最后由 t00t00 于 2020-9-15 08:42 编辑

solly 发表于 2020-9-15 08:38
这个是go语言编译的多线程程序,从start()入手不行,以前没弄过go语言的,先了解了一下go。
突破点从控 ...
大佬完整写一次教程吧,另送200CB:lol,CTF有用到,但是没头绪,就来吾爱破解找师傅了{:1_927:}。听说要符号信息还原,不知道怎么操作

居客 发表于 2020-9-15 09:28

t00t00 发表于 2020-9-15 08:24
相关代码已开源,https://github.com/t00t00-crypto/crackme1

希望各位大佬能够完整讲讲符号信息还原的 ...

楼主404了{:1_924:}
页: [1] 2
查看完整版本: 【已解出】新手自制低难度 KeygenMe,24小时内第1个完成者奖50元人民币