KCTF2020 子鼠开天 wp

程序流程比较清晰,输入的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

 

 

 

 

 

 

posted @ 2020-04-21 13:04  jentle  阅读(364)  评论(0编辑  收藏  举报