诺莫14
开始:
放入Exeinfo:
ELF文件
放入IDA:
sub_96A(&v8, (__int64)&v9);
将输入的字符串中的每个字符的ascii码转成两位16进制,存储到v9字符串中
,所以也就知道了为什么后文要使用函数将字符串转成16进制的数据
有两个函数不懂
__gmpz_init_set_str
__gmpz_powm
查阅了相关资料如下:
__gmpz_init_set_str
int mpz_init_set_str (mpz_t rop, const char *str, int base) [Function]
Initialize rop and set its value like mpz_set_str
int mpz_set_str (mpz_t rop, const char *str, int base) [Function]
Set the value of rop from str, a null-terminated C string in base base. White space is allowed
in the string, and is simply ignored.
两个函数都一样,大概就是str以base进制的形式写入rop,简而言之,字符串转相应进制的数
void mpz_powm (mpz_t rop, const mpz_t base, const mpz_t exp, const mpz_t mod) [Function]
Set rop to base^exp mod mod.
就是RAS加密
这里介绍几个工具
1.python库:gmpy2
行为invert可以计算D
行为powmod可以计算明文
使用方法:
gmpy2.invert(e,(q-1)*(p-1))
gmpy2.powmod(c,d,n)
2.分解N的网站:
http://www.factordb.com/index.php?query=103461035900816914121390101299049044413950405173712170434161686539878160984549
3.分解N的软件
https://sourceforge.net/projects/yafu/
双击yafu-x64.exe
控制台输入:
factor(103461035900816914121390101299049044413950405173712170434161686539878160984549)
等待
4.ASR工具箱子(可以计算D,分解N很jizhu)
使用方法:https://blog.csdn.net/qq_42777804/article/details/99578263
5.binascii
见后文
解密:
利用工具计算出q,p使用python写出脚本:
import gmpy2
import binascii
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n = 103461035900816914121390101299049044413950405173712170434161686539878160984549
e = 65537
q = 282164587459512124844245113950593348271
p = 366669102002966856876605669837014229419
d = gmpy2.invert(e,(q-1)*(p-1))#invert倒转
x = gmpy2.powmod(c,d,n)
print("%x"%x)
print(binascii.unhexlify(hex(x)[2:])) #unhexlify可以将16进制目标转换为字符串
当然,如果不用binascii也行,将输出的数据两个两个组合,转换为一个字符然后链接,但实际操作有一定的坑:eval不能识别没有0x的16进制等