-
-
[原创]第二题 子鼠开天
-
发表于:
2020-4-17 12:56
4210
-
AES + RSA
限定sn长度为64
1 2 3 | sub_411A90(aEnterYourSn);
scanf(aS, &v10);
if ( strlen(&v10) = = 64 )
|
关键check
关于sn的加密函数有两个,一个是AES_128,一个是RSA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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,易分解。
1 2 | 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密文如下
1 | 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就有了,例如:
1 2 | 8456462fbe01f4dcbd734c7343c08adcf8b21a38607eb004bb5c56cf7f7db3ac
27872226ca9bf30e9e94a75ff6c8c3c20ef288532d8ee1a6a238df0868542114
|
最后是exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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编辑
,原因: