xor题解
1.解压文件
得到文件夹,得到一个__MACOSX,说明是MacOs系统的可执行文件
._xor在windows系统中是没用的
只需要对xor进行反汇编
2.查壳
是一个64位文件
3.静态分析
找到main函数,按下F5反编译
int __cdecl main(int argc, const char **argv, const char **envp) { int i; // [rsp+2Ch] [rbp-124h] char v5[264]; // [rsp+40h] [rbp-110h] memset(v5, 0, 0x100uLL); printf("Input your flag:\n"); get_line(v5, 256LL); //输入字符串 if ( strlen(v5) != 33 ) //如果字符串长度不等于33,跳转 goto LABEL_11; for ( i = 1; i < 33; ++i ) v5[i] ^= v5[i - 1]; if ( !strncmp(v5, global, 0x21uLL) ) printf("Success"); else LABEL_11: printf("Failed"); //字符串长度不等于33,输出failed,flag长度一定是33 return 0; }
flag是一个长度为33的字符串
for ( i = 1; i < 33; ++i ) v5[i] ^= v5[i - 1]; if ( !strncmp(v5, global, 0x21uLL) ) printf("Success");
根据这段关键代码编写wp
需要知道:两次异或等于没有异或
global与异或操作之后的数据相等
查看global
点击aFKWOXZUPFVMDGH继续跟进
找到数据
选中,shift加e提取
提取数据
102, 10, 107, 12, 119, 38, 79, 46, 64, 17,
120, 13, 90, 59, 85, 17, 112, 25, 70, 31,
118, 34, 77, 35, 68, 14, 103, 6, 104, 15,
71, 50, 79, 0
4.编写wp
python wp
flag="" data=[ 102,10,107,12,119,38,79,46,64,17,120,13,90,59,85,17,112,25,70,31,118,34,77,35,68,14,103,6,104,15,71,50,79,0] for i in range(1,len(data)): flag+=chr(data[i]^data[i-1]) //第一个数据之后的都参与异或运算,需要逆向 print(chr(data[0])+flag) //第一个数据没有参与异或运算,直接打印
C++ wp
#include<iostream> using namespace std; int main(){ int data[34]={102,10,107,12,119,38,79,46,64,17,120,13,90,59,85,17,112,25,70,31,118,34,77,35,68,14,103,6,104,15,71,50,79,0}; printf("%c",char(data[0])); for(int i=1 ;i<=32;i++){ char a; a=(char)data[i]^data[i-1]; printf("%c",a); } return 0; }
flag{QianQiuWanDai_YiTongJiangHu} 千秋万代,一统江湖!