AES + RSA
限定sn长度为64
sub_411A90(aEnterYourSn);
scanf(aS, &v10);
if ( strlen(&v10) == 64 )
关键check
关于sn的加密函数有两个,一个是AES_128,一个是RSA
void __cdecl sub_401380(int a1, unsigned int a2, int a3, int a4)
{
if ( a2 >= 3 && a2 <= 0x14 && a4 == 64 )
{
if ( bytes_to_long((_WORD *)a3, 64, (int)&v9) != 32
|| (aes128_enc((int)&v9, 32, (int)&v10, (int)&unk_4190D0, 128, 0), rsa((int)&v10, 32, (int)&v5), v5)
|| v6 != 2
|| v7 )
{
sub_411A90(aBadSn);
}
else
{
user_e((const void *)a1, a2, (int)&v4);
if ( !memcmp(&v4, &v8, 0x10u) )
sub_411A90(aCongratulation);
}
}
}
先将sn decode('hex') 然后对其 AES128_decrypt_ECB,key已知,
key 为 b'\x48\x0B\x62\xC3\xAC\xD6\xC8\xA3\x6B\x18\xD9\xE9\x06\xCD\x90\xD2'
之后将所得明文进行RSA加密,n只有256bits,易分解。
p = 201522792635114097998567775554303915819
q = 236811285547763449711675622888914229291
user_e((const void *)a1, a2, (int)&v4);这个函数就是一个hash算法,懒得看了(断个点就可以拿到结果
最后将RSA加密后的结果的低128位与username的hash值对比,解题方法就是直接dump出用户名KCTF的hash值然后RSA解密、AES加密最后encode('hex')即可
很明显,多解出现了!!!sn是256bits的,最后只比对了128bits,所以会造成多解,根据题目所给的 {name:sn}猜出RSA密文如下
b'\x00\x02\x5D\x34\x3C\xED\x2E\x5A\x3C\xD5\xFE\x94\xCE\xA1\x57\x00\x14\xAF\x58\xAD\x4D\x76\xD5\x9D\x8D\x21\x71\xFF\xB4\xCA\x22\x31'
最后得到作者预设的sn为
6ed8bc1f04d0c360567fb579398265feec8b48dc4b804904feb1ab538c823270
解非常多,随便改一下高128bit就有了,例如:
8456462fbe01f4dcbd734c7343c08adcf8b21a38607eb004bb5c56cf7f7db3ac
27872226ca9bf30e9e94a75ff6c8c3c20ef288532d8ee1a6a238df0868542114
最后是exp
from Crypto.Cipher import AES
from Crypto.Util.number import bytes_to_long, long_to_bytes
from binascii import hexlify
import gmpy2
user_enc = b'\x00\x02\x5D\x34\x3C\xED\x2E\x5A\x3C\xD5\xFE\x94\xCE\xA1\x57\x00\x14\xAF\x58\xAD\x4D\x76\xD5\x9D\x8D\x21\x71\xFF\xB4\xCA\x22\x31'
c = bytes_to_long(user_enc)
p = 201522792635114097998567775554303915819
q = 236811285547763449711675622888914229291
n = p * q
e = 65537
phi = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi)
m = gmpy2.powmod(c, d, n)
key = b'\x48\x0B\x62\xC3\xAC\xD6\xC8\xA3\x6B\x18\xD9\xE9\x06\xCD\x90\xD2'
aes = AES.new(key, AES.MODE_ECB)
sn = aes.encrypt(long_to_bytes(m))
print(hexlify(sn).decode())
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-4-17 12:58
被丿feng编辑
,原因: