666
使用ida打开,汇编看不懂,按f5反编译

分析可知先定义了名为s和v5两个字符型数组
然后为s申请内存存放,大小为0x1E,代表30字节
输入的内容给v5
将v5和s传入给encode函数
经过encode函数后,如果v5的字符串长度和key不相等就会退出程序,相等则进入下一层判断,判断s和enflag是否相等
所以flag的关键在于encode函数里面,双击进入encode函数

分析代码
定义了字符型数组v3,然后定义了数字v4和i
如果a1的长度与key不相等就会输出Your Length is Wrong
for循环,i从0开始,每次循环后i+3,当i大于等于key的时候结束
a1和a2代表的是传进来的参数v5和s
LL代表long long,加数据类型是为了防止数据越界
按照for循环中的公式对a2(即s)进行修改,最后return a2;即输出a2
现在需要知道key和enflag,双击key

可以发现enflag是'izwhroz""w"v.K".Ni',长度为18,按照上文的加密逻辑,可以知道key等于enflag的长度18,知道这些之后就可以写解密脚本了,就是倒过来,加密是明文加6再异或key,那解密就是先让密文和key异或,然后减6
#include<stdio.h>
int main(){
int i;
char a[]="izwhroz\"\"w\"v.K\".Ni";
for(i=0;i<18;i+=3){
a[i]=(a[i]^18)-6;
a[i+1]=(a[i+1]^18)+6;
a[i+2]=(a[i+2]^18)^6;
}
printf(a);
return 0;
}


浙公网安备 33010602011771号