看雪CTF 国庆赛 落幕,是谁slay全场?
看雪2018国庆CTF团队攻击赛 已于今日中午12点正式结束,感谢大家的参与!
本次国庆热身赛 共有136个团队参赛,其中有12个团队夺旗成功!
恭喜!
根据比赛规则,获奖的前三名队伍为:
金奖:tekkens
银奖:炮灰大队
铜奖:AceHub
他们将获得以下奖品:
金奖:排名第 1 的团队,每位成员奖品:《加密与解密》(第四版)1本
银奖:排名第 2 的团队,每位成员奖品:看雪纪念T-shirt 1 件
铜奖:排名第 3 的团队,每位成员奖品:二合一MF认证的数据线
接下来让我们一起来看看这道题目:
01
看雪版主&评委 netwind 点评
本题采用代码混淆技术来扰乱破解者的逆向分析,破解者需要分析代码混淆规则并编写优化器来解除混淆,当然也可以带混淆分析算法。算法上依据输入的数字作为下标从指定数组取出若干个32位无符号整型并求和,然后以"2xue"作为底数,以和作为指数,以0xFFA1CF8F作为模数求模幂,判断结果是否是"4kan",可以根据算法逆推也可以采用暴力枚举来求解。
02
出题团队简介
有的人 越过节越寂寞 就等着你来挑战 有的人 越过节越寂寞 在家里摆好拳皇 有的人 越过节越寂寞 因为他想找对手
03
『叹息之墙』 设计思路
作者:
解题分为4个阶段:逆向、分析、求解、编程。
逆向:
代码有混淆,逆向可知,输入的数字进入了3个流程。
1)判断顺序 判断是否越界(351)。
2)依据这些数作为下标 从指定数组(命名为elist)取出若干个32位无符号整型 并求和(可能超过32位)。
3)以和作为指数 以"2xue"作为底数 以0xFFA1CF8F作为模数 求模幂 判断结果是否是"4kan",如果是 则显示输入正确。
分析:
1)有用信息有2个数:数组长度351和 模数0xFFA1CF8F,其它信息均与解题方法无直接关系。
2)已知模数后 可求解阶 可分解阶。
3)分解阶后 会发现 有9个素因子 且全是小素因子(随机情况下 不会全是小素因子 所以可以断定 这是出题者有意为之)。
4)而且所有素因子之和正好是 360=351+9。
因此可以猜想,对数组访问的下标,是模幂运算的指数对9个素因子分别的余数(或者余数的一一映射)且针对每个余数去掉了1个数。
去掉的是哪一个数呢?暂且伏笔。
求解:
根据底数和模幂结果,求解最小指数解,是容易的(时间小于5秒)。
但只要从elist中挑出的所有数字之和,与最小指数解对阶同余,就算解题正确。
由于从elist中挑出的每个数会针对阶的某一个素因子,因此,这个数一定要保证与其它素因子所构成的基底正交,否则此题将难解。
也就是说,这个数必须不会影响模幂结果在以其它素因子为阶的子群上的计算结果,必须在其它素因子所对应的乘法子群上表现为1。
编程:
对elist里的每个数进行搜索 找到其针对的素因子和对应余数(时间小于1秒)。
其结果正好能遍历所有可能的余数,只是少了余数为0的那个。这也回答了前面搁置的那个“少了哪一个数“的问题。
剩下的工作就简单了:
根据最小指数解对每个小素因子的余数 一共从elist中挑出9个数 排序 按照格式构造出输入序列号即可。
最终正确解只有1个:17x27x60x97x133x161x243x292x309X,
如果不采用上述思路快速求解 也可以直接对这9个数进行穷举,
穷举空间大约为10^17。
分析输入
通过简单的尝试可知,输入除了描述中的要求外,前一个数必须比后一个数小。
分析程序
这道题的大概经过了控制流扁平化、增加花指令等操作使题目变得难以看懂,不过通过 OD 进行动态调试不难得知 sub_409FF0
和 sub_401020
为关键函数。
通过调试(反向追踪跳转、搜索常数)可以得知 :
sub_401020("2xue",x)=="4kan"
时输入正确。
接下来ida的F5终于把 sub_409FF0
分析好了,在伪 C 代码中继续跟踪上文 x
的来源,找到如下内容:
*(_QWORD *)v10285 += (unsigned int)dword_49F000[dword_49FE40[(_DWORD)*v10287]];
其中 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 位乘法相组合)和取模操作,可猜测并通过修改该函数输入输出验证可得知它是一个“快速幂”(也称反复平方法):
typedef unsigned long long ll;
const ll mod=0xFFA1CF8Fll;
ll modPow(ll a,ll b){
ll r=1;
while(b>0){
if(b&1)r=r*a%mod;
a=a*a%mod;
b>>=1;
}
return r;
}
求解问题
于是我们就要求以下方程的X:
modPow(0x65757832/*2xue*/,X)==0x6E616B34/*4kan*/
这个方程可由 BSGS 算法快速解得,BSGS 算法的实现可在网上的随便找一个模板,例如:
using namespace std;
ll p;
ll pow(ll a, ll b, ll p) {
ll ans = 1;
while(b) {
if(b & 1) ans = ans * a % p;
b >>= 1;
a = a * a % p;
}
return ans;
}
map<ll, ll> mp;
ll BSGS(ll A, ll B, ll C) {
mp.clear();
if(A % C == 0) return -2;
ll m = ceil(sqrt(C));
ll ans;
for(int i = 0; i <= m; i++) {
if(i == 0) {
ans = B % C;
mp[ans] = i;
continue;
}
ans = (ans * A) % C;
mp[ans] = i;
}
ll t = pow(A, m, C);
ans = t;
for(int i = 1; i <= m; i++) {
if(i != 1)ans = ans * t % C;
if(mp.count(ans)) {
int ret = i * m % C - mp[ans] % C;
return (ret % C + C)%C;
}
}
return -2;
}
int main() {
ll A,B;
A=0x65757832;B=0x6E616B34;p=0xFFA1CF8Fll;
ll ans = BSGS(A, B, p);
printf("%llx\n", ans);
return 0;
}
于是我们得到了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
相等。
这可以编写简单程序:
#include <cstdio>
#include <bitset>
#include <ctime>
#include <algorithm>
#include <vector>
#include <tuple>
using namespace std;
typedef unsigned long long ll;
ll pows[]={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};
const ll Mod=0xFFA1CF8F-1;
const ll oriVal=0x55121C15ll;
int a[]={2, 3, 5, 7, 11, 13, 17, 31, 271};
int main(){
int t=0;
for(int i=0;i<351;i++){
for(int j=0;j<9;j++)if(pows[i]%a[j]==oriVal%a[j])printf("%d%c",i,++t==9?'X':'x');
}
return 0;
}
开工第一天,给自己充充电
往期热门资讯:
扫描二维码,获得更多新鲜资讯!