normal14

分析加密

change函数是将输入转存为十六进制数

这里的gmpz似乎调用的是某个库内的函数,检索一下

__gmpz_init_set_str((mpz_ptr, const char *, int) const char是需要转存的字符串,int是转存的数据进制,mpz_ptr 是目标空间。

简单来讲就是将字符串转化成对应进制存入新位置

1
2
v7_raw = "ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35"
print(str(int(v7_raw,16)))

78510953323073667749065685964447569045476327122134491251061064910992472210485

这是转换的结果

关于__gmpz_powm函数,在这里引入一个文档,学习一下

gmp_lib.mpz_powm Method (machinecognitis.github.io)

十六进制数输入进行pown的运算之后和comparedata比较

该运算详解为

(输入^65537)%1034610359008169141213901012990490444139

50405173712170434161686539878160984549==比较数据

和rsa加密的算法一样

那也可以采用rsa的解密算法

密钥得出方式E * D % φ(N) = 1

其中N是由两个质数做因子相乘得出的,而φ(N) = (P-1)(Q-1)需要得出这两个因子

为了解出因子,借用一下工具https://nchc.dl.sourceforge.net/project/yafu/1.34/yafu-1.34.zip

指令factor()分解

得出两个因子

进行运算的时候需要用到gmpy2 高精度算数运算库
编写脚本

1
2
3
4
5
6
7
8
9
10
import gmpy2
import binascii
p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
n=103461035900816914121390101299049044413950405173712170434161686539878160984549
c=78510953323073667749065685964447569045476327122134491251061064910992472210485
e=65537
d= gmpy2.invert(e, (p - 1) * (q - 1))
m = gmpy2.powmod(c,d,n)
print(binascii.unhexlify(hex(m)[2:]))

suctf{Pwn_@_hundred_years}

其中binascii是用于返回二进制表示的字符串的函数库

unhexlify是返回hex书的二进制字符串捏