攻防世界-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都可以成功过关

猜你喜欢

转载自www.cnblogs.com/banpingcu/p/12656682.html