首页
社区
课程
招聘
[原创] 2018国庆题叹息之墙WP
2018-10-2 22:38 3254

[原创] 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剩下两个值的和在=66C9D2FC1666BA28A
暴力循环秒出结果,剩下两个值为 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直播授课

收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回