进来搜索字符串,然后找到:

image-20231019225300144

看到sub_96A(input, (__int64)v9);对输入的字符串进行了操作

sub_96A

image-20231019225348549

我们知道input[v3] >> 4 这个是取出高四位

input[v3++] & 0xF是取出第四位

image-20231019230518563

去看一眼byte_202010可知道:这个就是将输入的字符串转化成16进制的样子。

最后放在v9里面。

_gmpz_powm

我们来百度一下,这个函数的作用

mpz_powm(result, a, b, m);

resule = a^b mod m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <gmp.h>

int main() {
mpz_t a, b, m, result;

// 初始化大整数
mpz_init(a);
mpz_init(b);
mpz_init(m);
mpz_init(result);

// 设置大整数的值
mpz_set_str(a, "123456789", 10); // a = 123456789
mpz_set_str(b, "5", 10); // b = 5
mpz_set_str(m, "1000000", 10); // m = 1000000

// 计算 a 的 b 次方然后取模 m
mpz_powm(result, a, b, m);

// 打印结果
gmp_printf("Result: %Zd\n", result);

// 清理内存
mpz_clear(a);
mpz_clear(b);
mpz_clear(m);
mpz_clear(result);

return 0;
}

上述代码使用 GMP 库中的 _gmpz_powm 函数计算了 123456789^5 mod 1000000 的结果,最后打印出结果。这是一个非常简单的示例,用于说明 _gmpz_powm 函数的基本用法。


到这里我们就知道了这个很有可能是一个RSA的题目。

我们知道:N = 103461035900816914121390101299049044413950405173712170434161686539878160984549

然后用工具:Yafu

image-20231019231806820

得到

P39 = 282164587459512124844245113950593348271
P39 = 366669102002966856876605669837014229419

然后e = 65537

写python来解开:

1
2
3
4
5
6
7
8
9
10
11
12
import gmpy2

p = 366669102002966856876605669837014229419#N分解出来的p
q = 282164587459512124844245113950593348271#N分解出来的q
N = 103461035900816914121390101299049044413950405173712170434161686539878160984549#很大的整数
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35#密文
e = 65537#这个是

d = gmpy2.invert(e,(p-1)*(q-1))
m = gmpy2.powmod(c,d,p*q)

print hex(m)[2:].decode('hex')

得到16进制。然后16进制转文本就可以了。

#suctf{Pwn_@_hundred_years}