本次re主要考察了关于RSA加密的识别
先alt+f12看看字符串
点进input your flag处按x查看引用的函数
看到其实就是主函数
这个主函数比较简略
输入flag在sub_96A中对flag进行处理
这里a2+I=byte_202010[a1[v3]>>4]之中,>>右移运算符其实就是除法,也就是a1[v3]除以16后剩余的整数部分,而在(a2 + i + 1LL) = byte_202010[a1[v3++] & 0xF]中的a1[v3++]& 0xF,就是a1[v3++]mod16,所以这个函数的工作就是把输入的字符变成两个分开的十六进制存储,也就是说如果输入“0”,转换成ascll值就是48,除以16就是3,取模为0,在byte_202010,中对应就是3和0,而3和0组成的30就是“0”的ascll值的十六进制,所以这个函数就是转化成十六进制并转化成字符串,也就是说这个函数不用管。
回到主函数中出现多个__gmpz_init_set_str函数
查询得知,该函数引用了GNU 高精度算法库
__gmpz_init_set_str的作用就是把第二个参数指定的字符串按第三个参数设定的进制解读成数值并放入第一个参数所指定的内存中;
__gmpz_powm的作用是计算第二个参数的第三个参数的次方然后对第四个参数取模,放入第一个参数中
__gmpz_cmp就是个比较函数
这里最主要的就是__gmpz_powm,类似于RSA加密,需要利用RSA解密的方法求解flag
RSA算法如图
其中e就是v5,C是v7,n是v4
此时我们需要求出p,q,可以利用大数分解网站
这里可以得出p,q
然后编写解密脚本
即可得出答案