逆向工程实战:BUUCTF——xor题解
本题涉及到异或操作,要写一个反逻辑的小脚本
笔者采用纯静态分析(IDA)技术
常规操作,首先用小蓝盒分析,64bit
然后用64位ida打开
很容易找到主函数,F5反汇编
直接分析关键代码
这里_b看起来不舒服,先改为a
嗯,舒服多了
第8行,a就是我们输入的flag
第9行,如果a长度不是33,跳转到16行,“Failed”。说明,a肯定是33的长度
第11、12行,进行了一个异或操作,这一位异或上一位
13行,判断,如果a 和global相等,就Success,否则Failed
说明global里有我们需要的数据,点击跟进
发现aFKWOXZUPFVMDGH这一串,光标放上去,发现有我们要的信息
再点击跟进
提取出字符串
global = [ ‘f’,0xA,‘k’,0xC,‘w’,‘&’,‘O’,‘.’,‘@’,0x11,‘x’,0xD,‘Z’,‘;’,‘U’,0x11,‘p’,0x19,‘F’,0x1F,‘v’,‘"’,‘M’,‘#’,‘D’,0xE,‘g’,6,‘h’,0xF,‘G’,‘2’,‘O’ ]
很明显,要写一个反脚本,在网上找的类似都是python,但是还没学怎么办,于是我依然选择用c写
#include <stdio.h>
int main() {
char s[] = {'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'};
char flag[33];
flag[0] = 'f';
for (int i = 1; i < sizeof(s)/sizeof(s[0]); i++) {
flag[i] = (char)s[i] ^ (char)s[i - 1];
}
flag[sizeof(s)/sizeof(s[0])] = '\0';
printf("%s\n", flag);
return 0;
}
这里我们需要知道一个异或小知识
如果a^b=c
那么a^c=b ; b^c=a
于是可以得到flag
flag{QianQiuWanDai_YiTongJiangHu}