-
-
[原创] 2018国庆题叹息之墙WP
-
2018-10-2 22:38 3254
-
本题开始就会发现一个(让人)很方的函数sub_409FF0,不要怕,其实就是 循环+if分支.
字符串找到成功提示00044F13D,他由
0040A57A sub eax, 0AD1C95B5h //if [esi+3010h]==0AD1C95B5 触发
硬断跟踪发现他多处被写入不同的常量,再输入注册码后第一次循环就被写入了是常量,
那么这里肯定就是类似余 hash迭代 (链式查表) 再判断分支.hash多次运算,只有正确hash才能进入正确分支.
先找输入影响的位置
通过run跟踪对比,硬件断点,发现位置0044C19D,0044D170,其实是把所有输入的查表再求和
修改 0044D193 call funCalc_401020 函数返回值=6E616B34注册成功说明方法正确
现在只要暴力出输入就行了, 9个[0,FFFFFFFFF]的和范围在 9000000000 之间,只要暴力出来就行了
我直接在OD里修改代码跑
几小时后发现跑太慢了,然后自己把函数funCalc_401020简化,自己写代码去跑
inline unsigned __int64 funCalc_401020(__int64 in) { unsigned __int64 k = in; unsigned __int64 yu = 1; unsigned __int64 yu2 = 0x65757832; unsigned __int64 ji,fang; while(k) { if(k & 1) { ji = yu * yu2; yu = ji % 0xFFA1CF8F; } fang = yu2 * yu2; yu2 = fang % 0xFFA1CF8F; k = k >> 1; //printf("%08X %08X %08X %08X\n",yu,yu2); } return yu; }
/////////////////////
开始没加unsigned 符号,白跑了一晚上,悲催..............................
跑的结果是
00000000:55121C15 00000000
00000001:54B3EBA3 00000001
00000002:5455BB31 00000002
00000003:53F78ABF 00000003
00000004:53995A4D 00000004
00000005:533B29DB 00000005
00000006:52DCF969 00000006
00000007:527EC8F7 00000007
剩下问题是
从数据350组数据中取9个以下来求和,其和=55121C15,154B3EBA3,25455BB31,353F78ABF,453995A4D,5533B29DB,652DCF969,7527EC8F7...
开始想到什么好算法可以快速求解
发现数据好像有规律,这问题就好解决了(只要有规律,就有捷径可走,那问题就是找出这条捷径)
我先排序,看差值大多是00F17B92,所以我先直接 %00F17B92 求解,这种可以凑出一些特殊数据
但发现这个值还是很大,然后我直接分解因数,发现他们几乎都有通用的 2 3 5 7 11 13 17 这些素数,每次1个
依次% 2, % 3, % 5, % 7, % 11, %13, % 17 非0得到如下结果
n = (2,3,5...) 记录下 table[x]%n 非0结果
% table[x] table[x]%n 5121C15,154B3EBA3,25455BB31... %n
2 7FD0E7C7 00000001
1 1 1 1 1 1 1 1 (10进制)
3 AA6BDFB4 00000002
5535EFDA 00000001
2 2 2 2 2 2 2 2
5 CC8172D8 00000003
99611622 00000001
6640B96C 00000004
33205CB6 00000002
2 2 2 2 2 2 2 2
7 DB1CFB0C 00000003
B698268A 00000006
92135208 00000002
6D8E7D86 00000005
4909A904 00000001
2484D482 00000004
2 2 2 2 2 2 2 2
11 E8648E24 00000003
D1274CBA 00000006
B9EA0B50 00000009
A2ACC9E6 00000001
8B6F887C 00000004
74324712 00000007
5CF505A8 0000000A
45B7C43E 00000002
2E7A82D4 00000005
173D416A 00000008
10 10 10 10 10 10 10 10
13 EBF7D348 00000009
D84DD702 00000005
C4A3DABC 00000001
B0F9DE76 0000000A
9D4FE230 00000006
89A5E5EA 00000002
75FBE9A4 0000000B
6251ED5E 00000007
4EA7F118 00000003
3AFDF4D2 0000000C
2753F88C 00000008
13A9FC46 00000004
9 9 9 9 9 9 9 9
17 F0984AE0 0000000A
E18EC632 00000003
D2854184 0000000D
C37BBCD6 00000006
B4723828 00000010
A568B37A 00000009
965F2ECC 00000002
8755AA1E 0000000C
784C2570 00000005
6942A0C2 0000000F
5A391C14 00000008
4B2F9766 00000001
3C2612B8 0000000B
2D1C8E0A 00000004
1E13095C 0000000E
0F0984AE 00000007
16 16 16 16 16 16 16 16 (10进制)
原理就是 (A % C + B % C) % C = (A + B) % C
这里
(2)7FD0E7C7,(3)AA6BDFB4,(5)33205CB6,(7)92135208 必选的,因为余1,余2只能1个组合
11,13,17 有可能会有不同组合,如余3=1+2
(11)余10,9,16更有多种组合,当然这里他还有个条件就是和为55121C15,154B3EBA3,25455BB31,353F78ABF,453995A4D,5533B29DB,652DCF969,7527EC8F7...
我们就直接选余数一样的
先7个数求和 7FD0E7C7,AA6BDFB4,33205CB6,92135208,5CF505A8,EBF7D348,B4723828 = 3ECCF8751
00000000:55121C15 00000000 太小
00000001:54B3EBA3 00000001 太小
00000002:5455BB31 00000002 太小
00000003:53F78ABF 00000003 太小
00000004:53995A4D 00000004
00000005:533B29DB 00000005
00000006:52DCF969 00000006 太大
00000007:527EC8F7 00000007 太大
//计算差值s-s1剩下两个值的和在=66C9D2FC 或1666BA28A
暴力循环秒出结果,剩下两个值为 45CDB834,20FC1AC8 //1个数是没有直接查询对应到这两个值的
一共9个数分别为
7FD0E7C7,AA6BDFB4,33205CB6,92135208,5CF505A8,EBF7D348,B4723828,45CDB834,20FC1AC8
在table中找到对应位置,排序后打印出来为
17,27,60,97,133,161,243,292,309
所以结果为
17x27x60x97x133x161x243x292x309X
//注1:假如选不到合适的,就要考虑其他组合了
//注2: 耒阳凌晨的四点的太阳在睡觉 orz
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课