re学习笔记(36)BUUCTF-re-[SUCTF2019]SignIn RSA算法

新手一枚,如有错误(不足)请指正,谢谢!!
个人博客:点击进入
题目链接:BUUCTF-re-[SUCTF2019]SignIn
题目下载:点击下载

IDA64位载入
re学习笔记(36)BUUCTF-re-[SUCTF2019]SignIn RSA算法_第1张图片

int mpz_init_set_str (mpz_t rop, char *str, int base)
mpz_t rop:多精度整数变量
char *str: 字符串
int base: 进制
将str按照base进制转换为rop
void mpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod) [Function]
函数功能: rop = base^exp取余mod
int mpz_cmp (const mpz t op1, const mpz t op2) [Function]
比较是否相等,若相等返回0

re学习笔记(36)BUUCTF-re-[SUCTF2019]SignIn RSA算法_第2张图片
得到数据

密文:ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
N(十进制):103461035900816914121390101299049044413950405173712170434161686539878160984549
E:65537

用yafu分解N得到p,q

p = 366669102002966856876605669837014229419
q = 282164587459512124844245113950593348271

re学习笔记(36)BUUCTF-re-[SUCTF2019]SignIn RSA算法_第3张图片
写脚本

import gmpy2
N = 103461035900816914121390101299049044413950405173712170434161686539878160984549
E = 65537
p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
L = (p-1)*(q-1)
D = int(gmpy2.invert(E, L)) 
'''
gmpy2.invert()返回值类型为
invert(x,y)  计算 x 关于1模 y 的乘法逆元
'''
enstr = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
destr = gmpy2.powmod(enstr, D, N)
'''
gmpy2.powmod()返回值类型为
gmpy2.powmod(x,y,z),计算x^y mod z 的值并返回
'''
flag0 = hex(destr)[2:]     # flag0类型为str,存的是十六进制表示的字符串
flag1 = bytes.fromhex(flag0)  # 将其从十六进制转换为byte类型(此时已解释成字符)
flag = str(flag1, 'utf-8')  # 将byte类型转换为str类型
print(flag)

re学习笔记(36)BUUCTF-re-[SUCTF2019]SignIn RSA算法_第4张图片
运行得到flag
flag为suctf{Pwn_@_hundred_years}

你可能感兴趣的:(ctf小白成长ing,#,reverse)