斐波那契数列(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不能出现连续的l
SN不能出现除了数字、字母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:FCCE23A5A04E0EA5
SN:51l41l92022l51l01l41l92022l52l92023l71l21l51
源代码及相关文件等已放入分卷压缩文档内。
名称混淆:
IL指令加密:
exe打包:Enigma Virtual Box 将 exe 和dll文件打包成一个 非dotnet程序。
剥离内置的python程序
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
最后于 2025-9-2 13:24
被kanxue编辑
,原因: