-
-
[原创]第十题 海风月影cm解题过程
-
发表于:
2017-6-21 10:43
6661
-
拖到IDA去分析,查看字符串,看到两个大数串:
跟着引用进去便能直接定位到赤裸裸的一个主函数,F5稍加分析一下流程,判断了输入key为70位字符:
判断完了输入长度后还检查了输入字符是否在大写的十六进制字符集里,并且将其分为前6位和后64位两个字符串,分别对应两个16进制“大数”:
接着就能看到上面“查看字符串”里的两个大数串,分别参与到程序运算和比较中去,最后判断是否符合预期:
也就是说,我们只需要搞清楚这些运算的流程与含义,最后进行验证就可以了,逻辑一目了然比较清晰。关键就是这里面不多的几个运算函数,如果你进去细跟的话基本就调入坑里了,实际上它们都是一些第三方的调用库编译出来的,这个怎么看呢?还是字符串:
随便搜索引擎都能知道这是个出名的数学运算库:
找到其官网https://gmplib.org/,目前最新版本“6.1.2”,可以下载源码过来学习研究,对应版本的手册地址是https://gmplib.org/gmp-man-6.1.2.pdf,当然是英文版,实在不想看也可以直接跳到附件里早期翻译的版本,本题主要涉及其中的整数运算和数论部分函数。
接下来就是去识别上面的运算函数,将其与gmp库里的函数对应上。本来以为有源码了很好找函数,结果半天也没准确对上,最后还是连蒙带猜的把函数功能调出来,先直接看一下最后对应上来的样子吧:
当看到判断素数时就可以猜到是考察RSA,于是复习相关的数论知识,这里推荐找阮一峰老师的两篇“RSA算法原理”看看,简单易懂。下面简单说一下怎么对应上如上的函数,最简单的方法还是动态调试,去观察上面每个函数的输入输出进行功能判定,再根据参数特征查手册寻找对应的函数。一开始,将输入的两个十六进制大数转化到两个对象里,从第三个参数“16”便可以猜到是表示进制,这样在整数函数里很容易就确定了这个转化函数是“赋值函数”系列,其中第三个参数正好是表示进制数base,第二个参数是我们输入的数串,第一个参数是一个结构体,gmp库里把大数封装在其中,通过动态调试可以观察出它的简单结构,包含一个存储实际数据的地址:
通过该函数,将数串转化为mpz_t结构,后面的运算主要基于该结构,调试过程中可以随时把一个字符串通过该函数转化为此对象,也可以通过该对象的addr字段查看对应的数据内容。接下来的运算可以通过这个特点来控制输入参数,观察输出来判断函数功能,简单的运算都能比较容易对应上函数。比较特殊的函数主要有两个,一个是判断素数的函数“mpz_probab_prime_p_13F067350”,另一个是求模逆的函数“mpz_invert_13F9273B0”。第一个函数虽然通过参数类型也能排除掉一些可能性,但是其第三个参数500实在让人有些摸不着头脑。后面一想,输入的两个数有一个数才6位,也可以判断通过,这样的话就表示我们枚举一下6位数就能知道哪些数能通过校验,顺便学习一下IDC脚本,还是贴一段简单暴力的调试代码:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!