BUUCTF—RE—xor
先用exeinfo分析文件:
64位,ida看伪代码:
但是这里有个变量值未知,回到ida找,找道global的地址:
然后找到它的值:
这里找到了一些可见字符,就是global的值,然后编写一个简单的脚本,来反过来异或这串字符:
#include<stdio.h> #include<string.h> int main() { char flag[]={ 'f', 0x0a, 'k', 0x0c, 'w', '&', 'O', '.', '@', 0x11, 'x', 0x0D, 'Z', ';', 'U', 0x11, 'p', 0x19, 'F', 0x1F, 'v', '"', 'M', '#', 'D', 0x0e, 'g', 6, 'h', 0x0F, 'G', '2', 'O', 0 }; for(int i = 32; i>=1; i--) { flag[i]^=flag[i-1]; } printf("%s",flag); return 0; }
最后编译执行就可以得到flag:flag{QianQiuWanDai_YiTongJiangHu}
对于异或的补充:
举个栗子:33的二进制是 0010 0001
44的二进制是 0010 1100
异或就是相同的二进制位为0,不同的为1
那么33^44就是 0000 1101
那么得到的这个再和33异或一次
0010 1100
就会回到44。
大概就是这么个原理,
多一个栗子:
qwertyuiop^asdfghjkl=Q
那么qwertyuiop^Q=asdfghjkl
asdfghjkl^Q=qwertyuiop