__int64 sub_140006F50()
{
__int64 v0; // r8@1
__int64 v1; // r9@1
signed __int64 len; // rax@1
__int64 v3; // r8@4
__int64 i; // rdx@4
char anscii; // cl@5
char v6; // al@9
int v7; // eax@14
const char *v8; // rcx@14
char rp_rsa_zhishu(n); // [sp+20h] [bp-18h]@12 print_140006EA0("=========================================================================\n");
print_140006EA0(" 看雪CTF2017 CrackMe by 海风月影\n\n");
print_140006EA0(&unk_14004BF18);
input_140006F00((__int64)&unk_14004BF2C, (__int64)input_key, v0, v1);
print_140006EA0(&unk_14004BF30);
len = -1i64;
do
++len;
while ( input_key[len] );
if ( (_DWORD)len == ) // 长度70
{
v3 = 0i64;
i = 0i64;
while ( )
{
anscii = input_key[i];
if ( (unsigned __int8)(anscii - ) > 9u && (unsigned __int8)(anscii - ) > 031u )// 检查输入字符是否数字或大写字母
break;
if ( ++i >= )
{
*(_DWORD *)input_key_before6 = *(_DWORD *)input_key;// 输入的前6位字符串 rsa_e
*(_WORD *)input_key_before6_4 = *(_WORD *)_input_key_4_;
do
{
v6 = input_key[v3 + ];
input_key_after6[v3++] = v6; // 输入的第6位后的64位字符串 rsa_q
}
while ( v6 ); // 初始化rop,并赋值rop = str,其中str是一个表示base进制整数的字符数组
mpz_init_set_str(&rp_rsa_e, input_key_before6, 16i64);// mpz_init_set_str (mpz_t r, const char *sp, int base)
mpz_init_set_str(&rp_rsa_p, input_key_after6, 16i64);// mpz_init_set_str (mpz_t r, const char *sp, int base)
if ( mpz_probab_prime_p(&rp_rsa_p, 500i64) )// mpz_probab_prime_p (const mpz_t n, int reps)
{ // 检测n是否为素数。该函数首先对n进行试除,然后使用米勒-拉宾素性检测对n进行测试,reps表示进行检测的次数。如果n为素数,返回2;如果n可能为素数,返回1;如果n为合数,返回0。
if ( mpz_probab_prime_p(&rp_rsa_e, 500i64) )
{ // 初始化rop,并将其值设置为op
mpz_init_set_ui(&rp_rsa_q, 0i64); // mpz_init_set_ui (mpz_t r, unsigned long int x)
mpz_init_set_str(
&rp_rsa_n,
"6248BC3AB92A33B000FDB88568F19727F92F79EB68FF6AD73203EFD20A3E331BE941C7AA288095F33BC4B255FD983114D480EFFBEE"
"2E313E6218A57F9CCC8189",
16i64);
mpz_init_set_str(
&rp_rsa_d,
"2476A7F02588913F228923E1F36F963F29708C07B117396817A6B94C336FC77FF7D381925EB40CFED8FBE894570155E41569B4EC69"
"B26CB0320105A29651CB4B",
16i64);
mpz_init_set_ui(&rp_rsa_zhishu(n), 0i64);// 置 r 为 n mod d
mpz_mod(&rp_rsa_zhishu(n), &rp_rsa_n, &rp_rsa_p);// mpz_mod (mpz_t r, const mpz_t n, const mpz_t d)
if ( !(unsigned int)mpz_cmp_si((__int64)&rp_rsa_zhishu(n), 0i64) )// mpz_cmp_si (const mpz_t a, const mpz_t b)
{
// 置 q 为 n/d。 只有预先知道 d 是整除 n 的, 这些函数才返回正确的结果。
// 这里使用的程序比其他的除法函数的快得多, 当确知整除发生时它是最好的选
// 择, 例如化简有理数为最小项时
mpz_divexact(&rp_rsa_q, &rp_rsa_n, &rp_rsa_p);// mpz_divexact (mpz_t q, const mpz_t n, const mpz_t d)
// 比较 op1 和 op2。 若 op1 > op2 则返回正值, 若 op1 = op2 则返回 0, 若 op1 <
// op2 则返回负值。
// 需要注意的是 mpz_cmp_ui 和 mpz_cmp_si 是宏, 它们可能对参数估值一次以
// 上。
if ( mpz_cmp(&rp_rsa_p, &rp_rsa_q) <= )// mpz_cmp (const mpz_t a, const mpz_t b)
{
// N = (p-1)*(q-1)
mpz_sub_ui(&rp_rsa_p, (__int64)&rp_rsa_p, 1ui64);// mpz_sub_ui (mpz_t r, const mpz_t a, unsigned long b)
mpz_sub_ui(&rp_rsa_q, (__int64)&rp_rsa_q, 1ui64);
mpz_mul(&rp_rsa_zhishu(n), &rp_rsa_p, &rp_rsa_q);// mpz_mul (mpz_t r, const mpz_t u, const mpz_t v)
// 计算 op1 模 op2 的逆, 并将结果置于 rop。 如果逆存在则返回非 0 值, 且 rop 满
// 足 0 ? rop < op2。 如果逆不存在, 那么返回 0, 此时 rop 是无意义的 // e的 φ(n)-1 次方,就是e的模反元素。
mpz_invert((__int64)&rp_rsa_zhishu(n), (__int64)&rp_rsa_e, (__int64)&rp_rsa_zhishu(n));// mpz_invert (mpz_t r, const mpz_t u, const mpz_t m)
v7 = mpz_cmp(&rp_rsa_d, &rp_rsa_zhishu(n));
v8 = "注册成功!!!\n\n";
if ( !v7 )
goto LABEL_16;
}
}
}
}
break;
}
}
}
v8 = "注册失败\n\n";
LABEL_16:
print_140006EA0(v8);
sub_14002D1B4("pause");
return 0i64;
}

分析发现这是RSA算法,提供了N和D,输入e和p进行匹配。其计算公式如下:

q=n/p
N = (p-)*(q-)
d1 = invert(e,N)
d1 == d?

其中的invert是求模反元素的函数调用。

看雪CTF第十题的更多相关文章

  1. 看雪CTF第十四题

    from z3 import * dest=[] s = Solver() data = [, , , , , , , , , , , , , , , , , , , , , , , , , , , ...

  2. 看雪CTF第十五题

    1.直接运行起来,再用OD附加 在此处luajit加载并调用main函数 004021C7 E8 64FE0000 call CrackMe. ; luaL_newstate 004021CC 8BF ...

  3. 看雪CTF第八题

    IDA查看Exports有3个TlsCallback 只有TlsCallback_2有用 其中创建6个线程用于代码动态解码smc 只有前三个线程有用 分别对check_part1,check_part ...

  4. 2019看雪CTF 晋级赛Q2第四题wp

    上次参加2019看雪CTF 晋级赛Q2卡在了这道题上,虽然逆出算法,但是方程不会解,哈哈哈哈,果然数学知识很重要呀,现在记录一下. 首先根据关键信息,根据错误提示字符串定位到这里: 1 int __t ...

  5. 看雪论坛 破解exe 看雪CTF2017第一题分析-『CrackMe』-看雪安全论坛

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 逆向 黑客 破解 学习 论坛 『CrackMe』 http://bbs.pediy.co ...

  6. 看雪.TSRC 2017CTF秋季赛第三题

    看雪.TSRC 2017CTF秋季赛第三题 wp 这是一道很简单的题,反调试的坑略多.这道题采用了很多常用的反调试手段,比如调用IsDebuggerPresent.进程名检查等等.另外也有利用SEH的 ...

  7. ECC加密算法入门介绍 --- 看雪

    标 题:ECC加密算法入门介绍 作 者:zmworm 时 间:2003/05/04 08:32pm 链 接:http://bbs.pediy.com ECC加密算法入门介绍 作者  :ZMWorm[C ...

  8. Java实习生常规技术面试题每日十题Java基础(一)

    目录 1.Java 的 "一次编写,处处运行"如何实现? 2.描述JVM运行原理. 3.为什么Java没有全局变量? 4.说明一下public static void main(S ...

  9. C语言考试解答十题

    学院比较奇葩,大一下期让学的VB,这学期就要学C++了,然后在开学的前三个周没有课,就由老师讲三个周的C语言,每天9:30~11:30听课,除去放假和双休日,实际听课时间一共是12天*2小时,下午是1 ...

随机推荐

  1. Java笔记(二)类

    类 一.类的基础 1.类---一种自定义数据类型. 2.与方法内创建局部变量不同,在创建对象的时候,所有的实例变量都会分配 一个默认值,这与创建数组的时候是类似的. 3.在{}对实例变量内赋值: in ...

  2. jquery 1.7.2源码解析(一)总体架构

    总体架构 jquery模块分类和依赖关系: 自调用匿名函数: /** * 自调用匿名函数,jquery加载完后立即被调用,用来加载各个模块 * 为什么使用自调用匿名函数: * 通过使用自调用匿名函数, ...

  3. 2190 ACM 数学概率论的乘法和加法原则

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2190 思路:明显我们要寻找 边长为n和边长为n-1,n-2,n-3·····的规律,这样得出一个递推公式就 ...

  4. 更改pip安装源的镜像解决安装总是timeout的情况(pip 豆瓣镜像源)

    由于国外的pip源总是由于各种原因不能被访问或者网速过慢,而造成的timeout错误 解决方法是修改pip的配置文件(如果没有配置文件在相应的地方新建,配置文件的路径和名字参考这里),设置安装包时候访 ...

  5. 2017.07.09【NOIP提高组】模拟赛B组

    Summary 今天放假,比赛于是就没有打了,但是看了一下题,发现都挺简单了,不想码~╮(╯▽╰)╭懒虫一条.最后一题居然做过原题.这次比赛让我对并查集“刮目相看”,对贪心感到“前途无量”,觉得树形D ...

  6. java-----任意进制间的转换

      public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Sy ...

  7. JS_高程3.基本概念(3)

    1.ECMAScript数值的范围 由于内存的限制,在大多数浏览器中,ECMAScript能够拿保存的数据的范围是 5e-324 ~ 1.7976931348623157e+308,其中最小的数值保存 ...

  8. angular.copy()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. C# Xamarin For Android自动升级项目实战

    一.课程介绍 “明人不说暗话,跟着阿笨一起玩Xamarin”,本次分享课程阿笨将带来大家一起学习Xamarin For Android系列<C# Xamarin For Android自动升级项 ...

  10. Git上传空文件夹

    git上传的文件夹为空的时候 1,先删除空的文件夹 参考:https://www.cnblogs.com/wang715100018066/p/9694532.html 2,这个只能说是技巧不能说是方 ...