攻防世界 reverse 666及其知识点

攻防世界 reverse  666

 

ida64打开:

 

 

 

 

 

双击main函数打开.

 

 

 

汇编语言看不懂,直接按f5进行反编译.

得到c语言主函数:

 

 

 

意思是定义名为sv5两个字符型数组.

s申请内存存放,大小为0x1E,代表30字节.

输入的字符串定义给v5.

v5s放入encode函数中运行.encode表示加密,可得这是个加密函数.

经过encode函数后,如果v5的字符长度与key(一个数字,暂时未知)不相等,程序return 0(结束).如果相等,则判断senflag是否相等.如果不相等则输出You are Right.否则输出flag{This_1s_f4cker_flag}.

 

可以看出解flag的关键在encode函数中.

 

 

 

 

在右侧打开encode函数

 

 

 

意思是定义字符型数组v3,定义数字v4i

如果a1(v5)的字符串长度与key不一样,输出Your Length is Wrong.

For循环,i0开始,每过一次循环i=i+3.i不小于key时结束.

^是二进制按位异或的意思

LL代表long long,加数据类型是为了防止数据越界。

按照for循环中的公式对a2(即s)进行修改,最后return a2;即输出a2.

 

到这里发现key和enflag依然是未知的.直接双击图中的key.

 

 

 

 

得到enflag,18位的字符串.联系上文可以得到加密后不得与enflag相等,那么enflag就是加密后的flag

For循环加密是每3个字符为一轮.enflag18.可得一共加密了6.

key=6.

所有数据都知道了,开始解密.

 

 

 

对照encode函数用c语言写了个解密脚本.所谓解密就是倒着来,例如加密是明文先加6再与key异或,那么解密就先让密文与key异或,再减6.

字符的异或是先把字符换算成ascii,再把ascii码换成二进制异或,异或结束再复原.c语言中不需要手动转换.

 

 

 

运行后得到flag.

总结:这道题相对逆向来说比较基础,主要考的还是对c语言是否熟悉.关于逆向的知识只有ida的基本使用.但是却帮助复习了些c语言的知识.也明白了解相关题的步骤.

posted @ 2022-12-04 18:08  M4r1s4  阅读(468)  评论(0编辑  收藏  举报