-
-
[原创] 第十三题 NeuralCrackme WriteUp
-
发表于: 2018-7-10 16:09 2855
-
这道题看题目名似乎是一道和神经网络有关的题目,实际上……确实有关系,不过关系似乎不是很大= =
程序中所有的字符串常量都是动态解密的,调一下就能知道。
程序首先读入Flag,然后检验Flag长度是否为10,并且是否为0-9 A-F之间的字符。然后,程序将Flag转为对应的bytes(5个字节),拆成两段,第一段2字节,第二段3字节。然后将这些字节之后补0补齐8个字节,转成IEEE754 double浮点数。
接下来是一个看上去有点懵的函数,传入了这两个浮点数,进行了一堆奇怪的操作 = =
首先程序里硬编码了一些浮点数,用C语言搞一下得到真实值,标一下。然后现场学了一下神经网络,参考这篇文章
a94K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3K9r3g2S2j5h3c8Q4x3V1k6S2M7X3y4Z5K9i4k6W2i4K6u0r3x3U0l9I4x3g2)9J5c8U0l9K6i4K6u0r3x3o6N6Q4x3V1j5I4z5e0M7$3y4o6b7K6i4K6u0W2K9s2c8E0L8l9`.`.
大概明白了这个程序实现了一个神经元,神经元中有一个二维权重向量{w, v},可以提取出来,将输入的两个浮点数x和y先进行一个预处理,然后生成净激活{x × wi + y × vi}向量,接着经过一个激活函数f得到向量z,最后将一个硬编码的输入向量和z相乘得到一个数。经过调试,发现f函数符合Sigmoid型函数。
得到数字之后做sprintf,判断是否为小于10的浮点数,并取整数位和小数前两位这三个数字,平方相加后开根号,判断是否大于15.5,以及之前的y的第3字节的低4bit是否为0.最后一个检验是检查x + y - f的绝对值是否小于0.003.
x y的取值非常有限,写一个程序爆破:
得到X和Y的bytes