第一次参加ctf,负责划水逆向题…虽然学长说这次的题水分很大(并且很快被他们做完了)但我觉得我仍然收获了很多
1.首先是心得:
开始下下来题后,是一道输入flag经过判断函数判断正确的题,习惯暴力破解的我一直在找简单方法避免分析判断函数,最后得到的结果是….不行,必须分析这种偷懒的心思浪费了不少时间
2.关于工具
首先用的od….虽然很快定位到了主函数和判断函数..但是纯汇编的算法让我分析了一阵子就崩溃了……于是该用xdbg反汇编…结果…也很难懂….最后用了不太熟的ida….md简直是神器..反出来的代码真好读……
3.关于解题法
来看看反汇编出的代码吧:
main:
判断函数:
注意俩个已有的串:
开始的时候没看出第二个是已有的…..
好了,步骤:
设输入的串(答案)为s。已有的串q1,q2
1.看懂流程(画出流程图)
2.详细分析函数正向过程:比如此题为(1)大变小小变大(2)(s[i]^0x55+72)^q2[i]
3.结果与q1比较,一样就对。
好了,接下来是重点
设上述步骤为F(x);
接下来就是写出其反函数
这里涉及的离散知识为:若A=B^C,那么B=A^C;C=A^B
证明:A^C=B^C^C,C^C=0,B^0=B
于是写出逆向算法
1.((q1[i] ^ q2[i]) - 0x48) ^ 0x55;
2.大变小小变大
代码:
结语
虽然鄙视了自己一天….但最终还算看到点希望….逆向的硬功夫就是分析机器代码,多想多写。话说寻找反函数这或许就是加密解密之间的战争吧……嘛…..该去看看加密解密算法之类的了……
ctf的加密算法大多的已经存在的!!!!系统学习密码学