攻防世界 reverse 666及其知识点
攻防世界 reverse 666
用ida64打开:
双击main函数打开.
汇编语言看不懂,直接按f5进行反编译.
得到c语言主函数:
意思是定义名为s和v5两个字符型数组.
为s申请内存存放,大小为0x1E,代表30字节.
输入的字符串定义给v5.
将v5和s放入encode函数中运行.encode表示加密,可得这是个加密函数.
经过encode函数后,如果v5的字符长度与key(一个数字,暂时未知)不相等,程序return 0(结束).如果相等,则判断s和enflag是否相等.如果不相等则输出You are Right.否则输出flag{This_1s_f4cker_flag}.
可以看出解flag的关键在encode函数中.
在右侧打开encode函数
意思是定义字符型数组v3,定义数字v4和i
如果a1(即v5)的字符串长度与key不一样,输出Your Length is Wrong.
For循环,i从0开始,每过一次循环i=i+3.当i不小于key时结束.
^是二进制按位异或的意思
LL代表long long,加数据类型是为了防止数据越界。
按照for循环中的公式对a2(即s)进行修改,最后return a2;即输出a2.
到这里发现key和enflag依然是未知的.直接双击图中的key.
得到enflag,是18位的字符串.联系上文可以得到加密后不得与enflag相等,那么enflag就是加密后的flag了
For循环加密是每3个字符为一轮.而enflag是18位.可得一共加密了6轮.
即key=6.
所有数据都知道了,开始解密.
对照encode函数用c语言写了个解密脚本.所谓解密就是倒着来,例如加密是明文先加6再与key异或,那么解密就先让密文与key异或,再减6.
字符的异或是先把字符换算成ascii码,再把ascii码换成二进制异或,异或结束再复原.c语言中不需要手动转换.
运行后得到flag.
总结:这道题相对逆向来说比较基础,主要考的还是对c语言是否熟悉.关于逆向的知识只有ida的基本使用.但是却帮助复习了些c语言的知识.也明白了解相关题的步骤.