BUUCTF之[SUCTF2019]SignIn(RE)

题目链接:https://buuoj.cn/challenges#[SUCTF2019]SignIn

 下载后是一个elf文件,先查壳,无壳

上IDA,进入main函数里面,f5

 

先看sub_96A,猜测一下,应该是转换这样的操作,这里我看了一下大佬们的解答,是十六进制转ascll,

 

 

继续往下看,程序调用了 __gmpz_init_set_str 函数,经过 Google 之后得知这其实是一个 GNU 高精度算法库(GNU Multiple Precision Arithmetic Library)。

我想这应该是程序中比较之前 mpz_powm 运算的结果与程序中硬编码的值是否相等,如果相等则输出 tql。看到这里应该可以基本确定这是一道已知密文求解RSA明文的题目。

根据RSA的实现过程,首先来计算密钥。第一步是获得大整数 N ,根据程序可

N = 10346103590081691412139010129904904441395040517371217043416168653987816098454

注意:这里的N是十进制表示的

然后对N进行大整数的因数分解,这里我用的是yafu工具

得到p和q

p = 366669102002966856876605669837014229419

q = 282164587459512124844245113950593348271

e = 65537(程序已给出)

接下来主要求出私钥d,并通过d得到明文m,在转换位ascll码即可

这是公式,图中的C是密文,M是明文,D是私钥(私钥由这个公式计算得出E * D % φ(N) = 1),N是公共模数(质数 P 、Q相乘得到N),MOD就是模运算

 

接下来就可以写脚本了

 

 

import gmpy2
import binascii

p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n = 103461035900816914121390101299049044413950405173712170434161686539878160984549
e = 65537
d = gmpy2.invert(e,(p-1)*(q-1))
m = gmpy2.powmod(c,d,n)
print(binascii.unhexlify(hex(m)[2:]).decode(encoding="utf-8"))

 

注意:这里gmpy2模块是要下载安装的,可以自行在网上下载(我是下载的)

最后得出flag

suctf{Pwn_@_hundred_years}

 

posted @ 2022-02-17 10:56  Eip的浪漫  阅读(284)  评论(0编辑  收藏  举报