斐波那契数列(Fibonacci sequence)是以递推方式定义的数列,其数值为0、1、1、2、3、5、8……,每一项等于前两项之和,由意大利数学家莱昂纳多·斐波那契于1202年提出,广泛应用于数学、自然科学等领域。 递推关系为:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n≥2,n∈N)。其前几项为0,1,1,2,3,5,8,13,21,34........
这个递推关系较为简单,我尝试增加一个复杂度,当前数值为前三个数值的线性关系,系数不一定为1。 递推关系为:F(0)=0,F(1)=1,F(n)=F(n-1)*9+F(n-2) *8+F(n-3) *5(n≥3,n∈N)。其前几项为0,0,1,9,89,878,8659,85400,842262,8306853,........
那如何构造一个Reverse题目了? 将所构造的伪斐波那契数列的每一个数值扩展为一定宽度的字符(前缀补0),然后顺序拼接成一个超长的字符序列,最后在前面添加“0.”,即构成一个有效数位超长的纯小数m。m的倒数为一个超大的实数,其整数部分N有一定的规律性,可以压缩存储为SN。 当然,此处有一个bug,如果构造出了小数,然后直接运算就可以得到想要的数值。此处,如果将宽度设置为2025,那这个小数的有效数位可能达到数百万级别,是可以计算出来的,但是需要留意,一般的程序语言无法计算,如果用python计算,需要注意计算精度,有可能给出错误结果。 整体来说,此处的逆向难度偏低,构造出小数后,就可以得到结果。(不好写MD,直接截图)读入用户输入序列号SN:SN是一个仅由[0-9]和小写字母l、句号.共12种字符组成的字符串,长度限定[0x1a,0x32] ,可有效避免穷举。 为了避免直接输入超长的NN,采用压缩算法: 首位为数字字符,紧接着的字符串为一段数值(10进制),表示字符重复数量;以l为分割字符串, l之后不能为l或为空;允许出现.(此为干扰项,后续算法可规避.字符) ;不允许.后面的数值全为0,也就是说规避整数的不同表现形式;有且仅有一个.,否则即不是数值的有效表现形式;在有限的字符数量约束下,很难出现满足要求的其他解,因转换的小数位长度已达到 4,131,000。 将SN按照上面的压缩算法还原为超大整数,并进行验证: 能够转换成数值.个数不能大于1.后面的数值不能全为0.不能作为尾字符比如 NN 有 6075 位,采用压缩算法后,为 Sn=92024l01l92024l11l92024l51,仅 26 位。 考虑用C#相关大数库,或自设计一个超大整数的乘法及加法运算,运算性能均不够理想,最终考虑内嵌 python 代码实现。SN长度限定为[0x10,0x20]SN不能以0和.开头SN不能以l开头(foreach里面判断)SN不能出现连续的lSN不能出现除了数字、字母l、字符.之外的字符l字符出现时,其已确定了前面的字符及对应的数量,且数量一定为大于0的数值,比如 ...l10000l为错误序列号不允许.开头不允许:.出现前,还未完成字符数量的获取...l245.不允许:.出现前,即还未开始获取字符数量...l2.约定最后一组不能出现l,即不能以l结尾。不允许:最后一组字符的数量为0的情况不允许:在.后面添加多个0 正确的 name 和 SN。name:KCTF,“KCTF”经过运算得到一个不大于65的正奇数 27,作为被除数。SN:21l61l92022l71l51l61l92022l71l81l31l92022l81l61l51解析为一个超大整数,作为被除数。题目为附件中的 Crackme.exe,hash 值计算可通过Windows PowerShell 命令 get-filehash filefullpath 获取 文件的hash为 FCCE23A5A04E0EA58BFF205329074C6CD2D658D3B2BDE30719D14DD117FDBB96, 给定的公开name和sn分别为:name:FCCE23A5A04E0EA5SN:51l41l92022l51l01l41l92022l52l92023l71l21l51源代码及相关文件等已放入分卷压缩文档内。名称混淆:IL指令加密:exe打包:Enigma Virtual Box 将 exe 和dll文件打包成一个 非dotnet程序。剥离内置的python程序
登录后可查看完整内容
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287721.htm
[原创]Reverse-伪斐波那契数列 (第九题 智斗邪首设计思路)
242 浏览
1 回复
可以私聊吗