【TSCTF-J】新生赛 easyXor WP
下载exe文件,放入Exeinfo PE中查一下
发现是32位且没有加壳,用IDA打开,F5查看伪代码,发现其中重要的函数。
看最后的if判断,得知v5必须等于44才会输出"You are so genius!!! Your input is the right flag.
回到上面的while语句,可以发现v5必须一直加四,也就是前面那串异或表达式全部都要满足相等。
上网搜索发现异或是可以反解的,即a=b^c可推出b=a^c。
于是可以写代码来反解出v3的值,此时还必须要知道byte_40218,byte_40219,byte_4021A,byte_4021B的初值。
用shift+E提取出来,而且要注意到这四个数组在地址上是相邻的,而发现原代码中存在超出数组边界的情况,根据这些地址相邻,可以发现前面的数组越界后会得到后面数组的值。
1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 #define kb 10010 5 char v3[kb], byte_4021D8[kb]={89}, byte_4021D9[kb]={95}, byte_4021DA[kb]={76}; 6 char byte_4021DB[kb]={89, 95, 76, 7 90, 79, 37, 65, 113, 82, 97, 75, 101, 49, 8 77, 102, 93, 47, 67, 75, 77, 90, 76, 93, 9 55, 95, 75, 79, 38, 99, 79, 127, 97, 114, 10 127, 31, 113, 108, 73, 120, 115, 4, 5, 6, 11 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12 0, 0, 0}; 13 int main() 14 { 15 int v5=0; 16 while(v5<=44) 17 { 18 v3[v5]=v5^byte_4021DB[v5]^0xD; 19 v3[v5+1]=(v5+1)^byte_4021DB[v5+1]^0xD; 20 v3[v5+2]=(v5+2)^byte_4021DB[v5+2]^0xD; 21 v3[v5+3]=(v5+3)^byte_4021DB[v5+3]^0xD; 22 v5+=4; 23 } 24 for(int i=0; i<=44; i++) cout<<v3[i]; 25 return 0; 26 }
最后运行可以得到flag