BUUCTF 逆向工程(reverse)之[SUCTF2019]SignIn

用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)))

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值