-
-
[原创]看雪2018国庆题分析(qwertyaa)
-
发表于: 2018-9-30 06:13 3222
-
通过简单的尝试可知,输入除了描述中的要求外,前一个数必须比后一个数小。
这道题的大概经过了控制流扁平化、增加花指令等操作使题目变得难以看懂,不过通过 OD 进行动态调试不难得知 sub_409FF0
和 sub_401020
为关键函数。
通过调试(反向追踪跳转、搜索常数)可以得知 sub_401020("2xue",x)=="4kan"
时输入正确。
接下来ida的F5终于把 sub_409FF0
分析好了,在伪 C 代码中继续跟踪上文 x
的来源,找到如下内容:
其中 dword_49FE40
是输入的数字数组,dword_49F000
是一个大小为 351 的常量数组,内容如下:
{0xB42B31EEllu, 0x8B9B7068llu, 0x5F45C09Allu, 0x0D077AD0Allu, 0x0B0F9DE76llu, 0x77CC4D6Ellu, 0x0D2854184llu, 0x0E80CBE4Cllu, 0x0DCBAF374llu, 0x0EDB5A3B8llu, 0x301B9E16llu, 0x1D3DF6AEllu, 0x0C37BBCD6llu, 0x0C43466Allu, 0x0B51CAD8llu, 0x6128B7BEllu, 0x0C6175DC4llu, 0x0AA6BDFB4llu, 0x44DC3CA2llu, 0x0B9EA0B50llu, 0x0A14D8A86llu, 0x47B0AF58llu, 0x83F06B20llu, 0x0BE8B8134llu, 0x0F45004B6llu, 0x840F93D8llu, 0x29813D18llu, 0x45CDB834llu, 0x4A373C42llu, 0x7C83B748llu, 0x6D8E7D86llu, 0x0AF73C814llu, 0x48A22AEAllu, 0x83F06B2llu, 0x78BDC90llu, 0x0B7F12036llu, 0x0E6E4BB78llu, 0x0BD9A05A2llu, 0x0A604F46llu, 0x99C1ADF6llu, 0x6B33570Allu, 0x55D6ECE6llu, 0x6C7A8296llu, 0x5C714DE4llu, 0x0DDAC6F06llu, 0x527642F4llu, 0x0A604F460llu, 0x0DAD7FC50llu, 0x78BDC900llu, 0x0DEA5B4C6llu, 0x0CCB1BEC2llu, 0x46BF33C6llu, 0x93274CF8llu, 0x0DF8F662Allu, 0x0CE94B5E6llu, 0x0EF23C22Allu, 0x100934B2llu, 0x9418C88Allu, 0x0C8EBD07Allu, 0x0DB1CFB0Cllu, 0x33205CB6llu, 0x1A6983F8llu, 0x0BCA88A10llu, 0x599CDB2Ellu, 0x74F7DAB8llu, 0x0D8F5052Cllu, 0x0E080E1BCllu, 0x58AB5F9Cllu, 0x9D4FE230llu, 0x6942A0C2llu, 0x2C55AFCEllu, 0x2D472B6llu, 0x8049A590llu, 0x57B9E40Allu, 0x0C15FF3EAllu, 0x0B06543A6llu, 0x0A6F66FF2llu, 0x2484D482llu, 0x87D5822llu, 0x0AD90D0F0llu, 0x3B6D68EEllu, 0x95FBBFAEllu, 0x7F5829FEllu, 0x1F20EDD2llu, 0x621A3350llu, 0x2D1C8E0Allu, 0x8C8CEBFAllu, 0x42F9457Ellu, 0x68B4944Ellu, 0x19780866llu, 0x0BDA999FEllu, 0x0EBD2AC94llu, 0x0B51CAD80llu, 0x3C5EE48llu, 0x0AC9F555Ellu, 0x0E629C728llu, 0x65E02198llu, 0x5CF505A8llu, 0x3898F638llu, 0x86E4068Ellu, 0x0F632FBDAllu, 0x54E57154llu, 0x5B7FD252llu, 0x74065F26llu, 0x8E6FE31Ellu, 0x99611622llu, 0x9235D166llu, 0x0C342EB0Ellu, 0x0E18EC632llu, 0x0A568B37Allu, 0x784C2570llu, 0x13CF22FAllu, 0x6A978B72llu, 0x20126964llu, 0x89A5E5EAllu, 0x0FDBED86Allu, 0x34D307F0llu, 0x72236802llu, 0x0C7FA54E8llu, 0x8C2F71D2llu, 0x9C9620ACllu, 0x173D416Allu, 0x0A2ACC9E6llu, 0x0A8D96716llu, 0x0A51378CEllu, 0x0AE824C82llu, 0x0DBC977E2llu, 0x813B2122llu, 0x3D506012llu, 0x2A72B8AAllu, 0x18868CD4llu, 0x0BBB70E7Ellu, 0x5A8E56Cllu, 0x7FD0E7C7llu, 0x0F17B9200llu, 0x950A441Cllu, 0x75FBE9A4llu, 0x6D6BFE28llu, 0x0F0984AEllu, 0x87D58220llu, 0x6B890704llu, 0x9F6A9362llu, 0x25BB4ED0llu, 0x0FBDBE146llu, 0x14C09E8Cllu, 0x4A85220Ellu, 0x0E8FE39DEllu, 0x3E41DBA4llu, 0x0CF863178llu, 0x0F815F2FEllu, 0x0E71B42BAllu, 0x946E7884llu, 0x62F45058llu, 0x60373C2Cllu, 0x0F9076E90llu, 0x0ABADD9CCllu, 0x0A05C0EF4llu, 0x0D1274CBAllu, 0x4207C9ECllu, 0x2F2A2284llu, 0x85F28AFCllu, 0x92135208llu, 0x0C43466A0llu, 0x0E263D8E0llu, 0x56C86878llu, 0x22E6DC1Allu, 0x0BAC592ECllu, 0x5AB549A6llu, 0x53F3F5C2llu, 0x5D62C976llu, 0x4B769DA0llu, 0x1B5AFF8Allu, 0x0E263D8Ellu, 0x9D879C3Ellu, 0x0BF7CFCC6llu, 0x3AFDF4D2llu, 0x5A8E56C0llu, 0x8755AA1Ellu, 0x0CC8172D8llu, 0x3C2612B8llu, 0x63FD2A74llu, 0x0B156BF38llu, 0x0CBC04330llu, 0x37A77AA6llu, 0x35C48382llu, 0x9E7917D0llu, 0x21F56088llu, 0x3C5EE480llu, 0x0D169289Cllu, 0x1E2F7240llu, 0x17951142llu, 0x0B698268Allu, 0x3F335736llu, 0x0C9DD4C0Cllu, 0x79AF4492llu, 0x39B92EDEllu, 0x13A9FC46llu, 0x9CAD7F36llu, 0x4E4B1056llu, 0x0A23F0618llu, 0x36B5FF14llu, 0x0AD2B8C9Allu, 0x0D34C1FC0llu, 0x0B339B65Cllu, 0x0D25AA42Ellu, 0x1C4C7B1Cllu, 0x97DEB6D2llu, 0x4F3C8BE8llu, 0x2753F88Cllu, 0x0B56A934Cllu, 0x6251ED5Ellu, 0x4909A904llu, 0x704070DEllu, 0x0CE27A762llu, 0x2B64343Cllu, 0x0F26D0D92llu, 0x5E544508llu, 0x0A7E7EB84llu, 0x32F010CCllu, 0x4D5994C4llu, 0x2E7A82D4llu, 0x0F762C8DCllu, 0x98D03264llu, 0x0F5418048llu, 0x7D7532DAllu, 0x0E3555472llu, 0x18BD1416llu, 0x88C6FDB2llu, 0x45B7C43Ellu, 0x9052DA42llu, 0x12DDA768llu, 0x9AB32988llu, 0x0D7120E08llu, 0x41F83590llu, 0x0F0984AE0llu, 0x0EF989ADCllu, 0x96ED3B40llu, 0x0A4EC85E8llu, 0x0D9E680BEllu, 0x69A60FEllu, 0x0E9EFB570llu, 0x822C9CB4llu, 0x8D7E678Cllu, 0x20FC1AC8llu, 0x75E9564Allu, 0x8F615EB0llu, 0x0FAEA65B4llu, 0x0B2483ACAllu, 0x914455D4llu, 0x43EAC110llu, 0x10FAB044llu, 0x0C2516F7Cllu, 0x2D472B60llu, 0x7AA0C024llu, 0x0FCCD5CD8llu, 0x0C4A3DABCllu, 0x0B60E2912llu, 0x1E2F724llu, 0x6640B96Cllu, 0x0D52F16E4llu, 0x31FE953Allu, 0x0F9F8EA22llu, 0x288FC186llu, 0x317A282Cllu, 0x965F2ECCllu, 0x0D84DD702llu, 0x6F4EF54Cllu, 0x53027A30llu, 0x4024D2C8llu, 0x1E13095Cllu, 0x4EA7F118llu, 0x4B2F9766llu, 0x0D43D9B52llu, 0x8AA9F4D6llu, 0x33E18C5Ellu, 0x0B8E29BC8llu, 0x279E45F4llu, 0x398A71CAllu, 0x0EEA71F4Allu, 0x0F17B920llu, 0x23D857ACllu, 0x26ACCA62llu, 0x0E446D004llu, 0x0C708D956llu, 0x0D34C1FCllu, 0x0E8648E24llu, 0x85010F6Allu, 0x0C5E8A0B0llu, 0x89B87944llu, 0x107E0D64llu, 0x69A60FE0llu, 0x67C318BCllu, 0x0B4723828llu, 0x293B217Allu, 0x66D19D2Allu, 0x0F17B92llu, 0x11EC2BD6llu, 0x7BB1646Ellu, 0x0F08A166Ellu, 0x0DE9DEA98llu, 0x310D19A8llu, 0x7B923BB6llu, 0x831E1846llu, 0x0EAE13102llu, 0x630BAEE2llu, 0x0A9CAE2A8llu, 0x7314E394llu, 0x0D666AE14llu, 0x0CACEC79Ellu, 0x0EBF7D348llu, 0x0E5384B96llu, 0x3A7BED5Cllu, 0x24C9D33Ellu, 0x2E38A6F2llu, 0x4B769DAllu, 0x96ED3B4llu, 0x0A33081AAllu, 0x0C525E232llu, 0x0D803899Allu, 0x73725DBCllu, 0x15B21A1Ellu, 0x4C681932llu, 0x64EEA606llu, 0x0FEB053FCllu, 0x5535EFDAllu, 0x0B9D4175Allu, 0x0C06E7858llu, 0x0F35E8924llu, 0x5210FE9Ellu, 0x76DAD1DCllu, 0x0CDA33A54llu, 0x16A395B0llu, 0x0F724776Cllu, 0x7E66AE6Cllu, 0x8B6F887Cllu, 0x511F830Cllu, 0x41164E5Allu, 0x4993A67Cllu, 0x0ECC42826llu, 0x9BA4A51Allu, 0x0D6209276llu, 0x0A421FD3Cllu, 0x0AABC5E3Allu, 0x5A391C14llu, 0x0E1725D4Ellu, 0x74324712llu, 0x0B6FFA4A4llu, 0x2103E4F6llu, 0x7131EC70llu, 0x6E5D79BAllu, 0x502E077Allu}
而分析F5下的 sub_401020
可以观察到 64 位乘法(3 次32 位乘法相组合)和取模操作,可猜测并通过修改该函数输入输出验证可得知它是一个“快速幂”(也称反复平方法):
于是我们就要求以下方程的X:
这个方程可由 BSGS 算法快速解得,BSGS 算法的实现可在网上的随便找一个模板,例如:
于是我们得到了 X = 0x55121C15ll + (0xFFA1CF8F-1)k (k为整数)
其中 0xFFA1CF8F-1 = phi(0xFFA1CF8F)
。
接下来我们要在 351 个数字中选取 9 个数字使它们的和满足上式。
这个背包问题直接做的话相当困难,尤其是加了要求选取 9 个数字这个条件后。
我们将这 351 个数字转换成 10 进值可发现几乎所有的数字都被 10 整除。
同时我们发现 10|0xFFA1CF8F-1
。
于是我们可以猜测 0xFFA1CF8F-1
中有很多因子都广泛存在与这 351 个数字当中。
于是我们分解这个数字,得到: 4288794510<10> = 2 · 3 · 5 · 7 · 11 · 13 · 17 · 31 · 271
这里恰好 9 个不同因子,而且 351 = 各因子和 - 9。
观察可知,不被 y 整除的数字恰好 y-1 个,且除 y 后余数各不相同。
至此,我们可以得出一种显然的组合方法,即对于 0xFFA1CF8F-1
的每一个因子 y 我们将 351 个数字中 对 y 取模的结果 与 0x55121C15
对 y 取模的结果相同的数字加入选择。由于我们选取的其他数字对 y 取模的结果为 0,这样可以保证这些数字和对 y 取模的结果与 0x55121C15
对 y 取模的结果相同。由中国剩余定理(CRT)可知,这些数字和在 模 0xFFA1CF8F-1
意义下 与 我们需要的 0x55121C15
相等。
这可以编写简单程序:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!