首页
论坛
课程
招聘
[原创]第二题 子鼠开天
2020-4-17 12:56 1586

[原创]第二题 子鼠开天

2020-4-17 12:56
1586

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())

[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年秋季班火热招生!!

最后于 2020-4-17 12:58 被丿feng编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 2749
活跃值: 活跃值 (88)
能力值: ( LV12,RANK:214 )
在线值:
发帖
回帖
粉丝
htg 活跃值 2 2020-4-19 10:43
2
0
学了一招。
我测试AES的计算结果不对,还需要 long_to_bytes,看来需要进行大小端转换,颠倒
游客
登录 | 注册 方可回帖
返回