【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

 

posted @ 2021-10-24 20:02  king_kb  阅读(244)  评论(0编辑  收藏  举报