用IDA打开
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
char v4; // [rsp+0h] [rbp-4A0h]
char v5; // [rsp+10h] [rbp-490h]
char v6; // [rsp+20h] [rbp-480h]
char v7; // [rsp+30h] [rbp-470h]
char v8; // [rsp+40h] [rbp-460h]
char v9; // [rsp+B0h] [rbp-3F0h]
unsigned __int64 v10; // [rsp+498h] [rbp-8h]
v10 = __readfsqword(0x28u);
puts("[sign in]");
printf("[input your flag]: ", a2);
__isoc99_scanf("%99s", &v8);
sub_96A(&v8, &v9);
__gmpz_init_set_str((__int64)&v7, (__int64)"ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35", 16LL);
__gmpz_init_set_str((__int64)&v6, (__int64)&v9, 16LL);
__gmpz_init_set_str(
(__int64)&v4,
(__int64)"103461035900816914121390101299049044413950405173712170434161686539878160984549",
10LL);
__gmpz_init_set_str((__int64)&v5, (__int64)"65537", 10LL);
__gmpz_powm((__int64)&v6, (__int64)&v6, (__int64)&v5, (__int64)&v4);
if ( (unsigned int)__gmpz_cmp(&v6, &v7) )
puts("GG!");
else
puts("TTTTTTTTTTql!");
return 0LL;
}
其中的大整数分解,可以利用这个网站帮助分解:http://www.factordb.com/
可以看出来这里是个RSA加密,特别是e = 65537
这个敏感词
其中__gmpz_init_set_str的原型是:__gmpz_init_set_str (mpz_t rop, char *str, int base),这三个参数分别是多精度整数变量,字符串,进制。
__gmpz_init_set_str((__int64)&v5, (__int64)"65537", 10LL);
等价于===》
v5 = 65537 // 10进制表示
__gmpz_init_set_str((__int64)&v7, (__int64)"ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35", 16LL);
等价于===》
v7 = ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35 // 16进制表示
__gmpz_powm($ base,$ exp,$ mod)参数:该函数接受三个必需参数$ base,$ exp和$ mod
$ base - 这是基数。
$ exp - 这是提升到基础。
$ mod - 它返回除法后的余数 $ mod
__gmpz_powm((__int64)&v6, (__int64)&v6, (__int64)&v5, (__int64)&v4);
等价于===》
v6 = pow(v6,v5) % v4
Python3代码:
import libnum
import gmpy2
C = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
N = 103461035900816914121390101299049044413950405173712170434161686539878160984549
e = 65537
# N = p * q, 这里我用的是:https://www.factordb.com/ 这个网站在线分解
p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
alter = (p-1) * (q-1)
d = gmpy2.invert(e,alter)
M = pow(C,d,N)
print(libnum.n2s(int(M)))