攻防世界-reverse-7(game)
第七题:game
下载后是一个可执行程序。
ida打开并且SHIFT+F12
进入后跳转交叉引用列表
发现关键代码
v60 = 18;
v61 = 64;
v62 = 98;
v63 = 5;
v64 = 2;
v65 = 4;
v66 = 6;
v67 = 3;
v68 = 6;
v69 = 48;
v70 = 49;
v71 = 65;
v72 = 32;
v73 = 12;
v74 = 48;
v75 = 65;
v76 = 31;
v77 = 78;
v78 = 62;
v79 = 32;
v80 = 49;
v81 = 32;
v82 = 1;
v83 = 57;
v84 = 96;
v85 = 3;
v86 = 21;
v87 = 9;
v88 = 4;
v89 = 62;
v90 = 3;
v91 = 5;
v92 = 4;
v93 = 1;
v94 = 2;
v95 = 3;
v96 = 44;
v97 = 65;
v98 = 78;
v99 = 32;
v100 = 16;
v101 = 97;
v102 = 54;
v103 = 16;
v104 = 44;
v105 = 52;
v106 = 32;
v107 = 64;
v108 = 89;
v109 = 45;
v110 = 32;
v111 = 65;
v112 = 15;
v113 = 34;
v114 = 18;
v115 = 16;
v116 = 0;
v3 = 123;
v4 = 32;
v5 = 18;
v6 = 98;
v7 = 119;
v8 = 108;
v9 = 65;
v10 = 41;
v11 = 124;
v12 = 80;
v13 = 125;
v14 = 38;
v15 = 124;
v16 = 111;
v17 = 74;
v18 = 49;
v19 = 83;
v20 = 108;
v21 = 94;
v22 = 108;
v23 = 84;
v24 = 6;
v25 = 96;
v26 = 83;
v27 = 44;
v28 = 121;
v29 = 104;
v30 = 110;
v31 = 32;
v32 = 95;
v33 = 117;
v34 = 101;
v35 = 99;
v36 = 123;
v37 = 127;
v38 = 119;
v39 = 96;
v40 = 48;
v41 = 107;
v42 = 71;
v43 = 92;
v44 = 29;
v45 = 81;
v46 = 107;
v47 = 90;
v48 = 85;
v49 = 64;
v50 = 12;
v51 = 43;
v52 = 76;
v53 = 86;
v54 = 13;
v55 = 114;
v56 = 1;
v57 = 117;
v58 = 126;
v59 = 0;
for ( i = 0; i < 56; ++i )
{
*(&v3 + i) ^= *(&v60 + i);
*(&v3 + i) ^= 0x13u;
}
return sub_45A7BE((int)"%s\n", (unsigned int)&v3);
}
逆向代码
a = [18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32, 49, 32,1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44, 65, 78, 32, 16, 97, 54, 16, 44,52, 32, 64, 89, 45, 32, 65, 15, 34, 18, 16, 0]//将60-116划入一个数组中
b = [123, 32, 18, 98, 119, 108, 65, 41, 124, 80, 125, 38, 124, 111, 74, 49,83, 108, 94, 108, 84, 6, 96, 83, 44, 121, 104, 110, 32, 95, 117, 101, 99,123, 127, 119, 96, 48, 107, 71, 92, 29, 81, 107, 90, 85, 64, 12, 43, 76, 86,13, 114, 1, 117, 126, 0]//3-59划入一个数组。
str = ''
for i in range(0, 56):
b[0 + i] ^= a[0 + i]
b[0 + i] ^= 0x13
str = str + chr(b[i]);
print(str)
破解游戏运行规则
a=bc,先运算 bc,这个表达式的含义是,若 b 与 c 相等,那么得出的值为 1,若不等则为 0.
bool __cdecl sub_45E640(int a1)
{
bool result; // al
if ( a1 )
{
if ( a1 == 7 )
{
byte_532E28[7] = byte_532E28[7] == 0;
byte_532E27[7] = byte_532E27[7] == 0;
result = 1;
byte_532E28[0] = byte_532E28[0] == 0;
}
else
{
byte_532E28[a1] = byte_532E28[a1] == 0;
byte_532E27[a1] = byte_532E27[a1] == 0;
result = byte_532E29[a1] == 0;
byte_532E29[a1] = result;
}
}
else
{
byte_532E28[0] = byte_532E28[0] == 0;
byte_532E29[0] = byte_532E29[0] == 0;
result = 1;
byte_532E28[7] = byte_532E28[7] == 0;
}
return result;
}
分析得:
按1--改变1,2,8状态
按8--改变1,7,8状态
按i(除1,8)--转变i-1,i,i+1状态
因此无论是87654321还是12345678都可以成功过关