【已解出】新手自制低难度 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)
请输入用户名:
wuaipojie
请输入注册码:
02910966929d68s
成功注册!你太牛逼了!
在 2020 年 9 月 16 日 00:00 前,私发支付宝号 + 本次注册码获取红包
算法就不逆了,也是时间问题~ 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: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;
}
solly 发表于 2020-9-15 01:43
#include
#include
#include
感谢感谢,希望能够完整讲讲这个破解过程。因为 @灰灰。第一个解出,所以就 本帖最后由 灰灰。 于 2020-9-15 10:30 编辑
t00t00 发表于 2020-9-15 08:20
感谢感谢,希望能够完整讲讲这个破解过程。因为 @灰灰。第一个解出,所以就
符号还原使用IDAGolangHelper,main函数就是符号还原后名为main_main的函数,剩下的就是看main函数里的内容了,基本都很清晰 50元美刀,这个是可以有的哦 shaunkelly 发表于 2020-9-14 20:15
50元美刀,这个是可以有的哦
难度不够大,如果加了反反编译,我会提高到50美元的:lol 相关代码已开源,https://github.com/t00t00-crypto/crackme1
希望各位大佬能够完整讲讲符号信息还原的方式和找到main函数的方式。 t00t00 发表于 2020-9-15 08:20
感谢感谢,希望能够完整讲讲这个破解过程。因为 @灰灰。第一个解出,所以就
这个是go语言编译的多线程程序,从start()入手不行,以前没弄过go语言的,先了解了一下go。
突破点从控制台输入输出API入手,就可以定位到算法代码。不逆算法很快可以定位字符比较位置,明文比较的,因此只要把输入API断下,输入完序列号,在序列号下内存硬中断,可以瞬间定位字符比较位置,其它什么都不用看了。 本帖最后由 t00t00 于 2020-9-15 08:42 编辑
solly 发表于 2020-9-15 08:38
这个是go语言编译的多线程程序,从start()入手不行,以前没弄过go语言的,先了解了一下go。
突破点从控 ...
大佬完整写一次教程吧,另送200CB:lol,CTF有用到,但是没头绪,就来吾爱破解找师傅了{:1_927:}。听说要符号信息还原,不知道怎么操作 t00t00 发表于 2020-9-15 08:24
相关代码已开源,https://github.com/t00t00-crypto/crackme1
希望各位大佬能够完整讲讲符号信息还原的 ...
楼主404了{:1_924:}
页:
[1]
2