TSCTF-J [SUCTF 2019] SignIn

[SUCTF 2019] SignIn

IDA载入,主函数如下
请添加图片描述

sub_96A

请添加图片描述
看不懂只能写脚本实现一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
#include<string.h>
#define _DWORD int
int main()
{
int result;
char a1[100];
scanf("%s",a1);
char a2[100];
char byte_202010[]={0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61,0x62, 0x63, 0x64, 0x65, 0x66};
int v3; // [rsp+18h] [rbp-18h]
int i; // [rsp+1Ch] [rbp-14h]

v3 = 0;
for ( i = 0; ; i += 2 )
{
result = strlen(a1);
if ( v3 >= result )
break;
a2[i] = byte_202010[a1[v3] >> 4];
a2[i+1]= byte_202010[a1[v3++] & 0xF];
}
printf("%s",a2);
}

发现是一个把字符串转16进制的函数。后面是RSA加密

1
2
3
4
5
__gmpz_init_set_str(v7, "ad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35", 16LL);//用来与运算结果比较,应该是密文C
__gmpz_init_set_str(v6, v9, 16LL);//明文M
__gmpz_init_set_str(v4, "103461035900816914121390101299049044413950405173712170434161686539878160984549", 10LL);//公共模数N
__gmpz_init_set_str(v5, "65537", 10LL);//公钥E
__gmpz_powm(v6, v6, v5, v4);//M^E%N

RSA解密

首先分解模数N得到P,Q。
请添加图片描述
有了P、Q、E就可以通过求模逆元计算出私钥D,从而得到明文。

1
2
3
4
5
6
7
8
9
10
import  gmpy2
c=0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n=103461035900816914121390101299049044413950405173712170434161686539878160984549
p=282164587459512124844245113950593348271
q=366669102002966856876605669837014229419
e=65537
d=gmpy2.invert(e,(p-1)*(q-1))
m = gmpy2.powmod(c,d,n)
print(m)
#185534734614696481020381637136165435809958101675798337848243069

转字符串得到flag