首先定位主要函数
FindEncrypt插件扫描一下看下大概有哪些密码学特征
分析可得函数sub_4010F0作用是将输入的sn进行AES解密 使用ECB模式 ZeroPading填充
秘钥:
48 0B 62 C3 AC D6 C8 A3 6B 18 D9 E9 06 CD 90 D2
函数sub_401210将AES解密得到的数据进行RSA 256加密
得到
N:69823028577465AB3991DF045146F91D556DEE8870845D8EE1CD3CF77E4A0C39
E:0x10001
跟进函数401190
继续跟进4010b0
函数sub_4019C0是sha516算法 获取输入name的hash
函数sub_401570是md5 算法 计算sha516 hash的md5
函数4010b0被调用了两轮
key1:
Key2:
最后将函数sub_401190计算出的32字节hash和前面RSA加密生成的64字节值的高32字节进行比较
逆推思路:
1.先动态调试程序,输入题目提供的sn,获取RSA算法加密生成的数据前32字节
00028888888888888888888888888800=>A
2.计算sub_401190(“KCTF”)=>B
3.A+B拼接为64字节加密数据C,RSA解密C 得到明文M
4.RSA解密算法必须分解N,根据e^d mod(p-1)*(q-1)==1 求得RSA私钥d
5.分解N
得p*q=0x979be0c9eece7426c9fd28c2d6e7772b*0xb22831d15714eb91cd83340b4837182b
使用gmpy2计算d值解密数据
n = gmpy2.mpz(0x69823028577465AB3991DF045146F91D556DEE8870845D8EE1CD3CF77E4A0C39) p = gmpy2.mpz(0x979be0c9eece7426c9fd28c2d6e7772b) q = gmpy2.mpz(0xb22831d15714eb91cd83340b4837182b) e = gmpy2.mpz(0x10001) c = gmpy2.mpz(0x0002888888888888888888888888880014AF58AD4D76D59D8D2171FFB4CA2231) d = gmpy2.invert(e, (p - 1) * (q - 1)) m = gmpy2.powmod(c, d, n)
对RSA解密得到的明文进行AES解密取前32字节就是所求sn
sn:0C5CE379F2102313D7420EC4883E25D07B935F98E2B0D9819275450CFDA7086E
因为时间关系就没有那么详细了
最后于 1天前 被三猫编辑 ,原因: