程序流程比较清晰,输入的name先进行位数判断,再进行主要判断sub_401380函数:
if ( v4 - 1 < 3 || v4 - 1 > 20 ) // name判断 { sub_411A90(aBadName); result = -1; } else { sub_411A90(aEnterYourSn); scanf(aS, &input_ser); if ( strlen(&input_ser) == 64 ) { sub_401380(&input_name, v4 - 1, &input_ser, 64); result = 0; } else { sub_411A90(aBadSn); result = -1; } } return result; }
findcrypt可以找出一些加密函数:
加密算法整个 先进行base16 ,就是按照16进制保存(可以动态调试看到),然后经过AES算法第一轮加密, 加密结果在进行RSA加密,记为v8
if ( base16(a3, 64, &v9) != 32 // 就是转换成16进制保存 丫的
|| (AES(&v9, 32, &v10, &unk_4190D0, 128, 0), RSA(&v10, 32, &v5), v5)
|| v6 != 2
|| v7 )
{
sub_41
用tea算法,用户名加密得到v4,比较v4和v8。
开始解密:
首先动态调试得到KCTF tea算法得到的v4:
14 AF 58 AD 4D 76 D5 9D 8D 21 71 FF B4 CA 22 31 也就是v8的值。
RSA的 e=65537
动态分析给出的一队原密文就可以得到N:
0x69823028577465AB3991DF045146F91D556DEE8870845D8EE1CD3CF77E4A0C39
然后分解 N 得到 p和 q:
201 522792 635114 097998 567775 554303 915819 × 236 811285 547763 449711 675622 888914 229291
可以解出 d值:25800220689750035710081482091841722516499776007453536839839657556744187750333
import gmpy2 from Crypto.Cipher import AES n = 0x69823028577465AB3991DF045146F91D556DEE8870845D8EE1CD3CF77E4A0C39 q = 201522792635114097998567775554303915819 p = 236811285547763449711675622888914229291 e = 0x10001 c = 0x2888888888888888888888888880014AF58AD4D76D59D8D2171FFB4CA2231 phi_n= (p - 1) * (q - 1) d = gmpy2.invert(e, phi_n) print(hex(pow(c,d,n))) s='2d5f4c9d567c43399312b8898d6c7f2ec799c64bde4fe39eb01771be1e7f4795'.decode('hex') key = '480B62C3ACD6C8A36B18D9E906CD90D2'.decode('hex') cipher = AES.new(key, AES.MODE_ECB) encrypted = cipher.encrypt(s).encode('hex') print("name = KCTF") print("sn = "+encrypted)
6ED8BC1F04D0C360567FB579398265FEEC8B48DC4B804904FEB1AB538C823270