首页
论坛
课程
招聘
[原创]看雪CTF2019参赛题目
2019-5-29 11:53 917

[原创]看雪CTF2019参赛题目

2019-5-29 11:53
917

参赛分析

参赛的题目是一个安卓的程序,由于安卓webview在4.4后开始使用chrome的内核,所以经过测试,安卓8.1及以上的webview版本是可以成功的执行webassembly的。(低版本没有测,该题目不能保证在低版本下成功运行)。
故使用webassembly作为出题的依据,由于无法像桌面版的chrome那样直接动态调试webassembly,解题者需要讲安卓程序上的html网页转移至桌面版即可动态调试。但由于webassembly的字节码不同于x86,需要解题者对webassembly的字节码进行研究才能解题。

主要算法

首先html网页如下(安卓程序中将main.wasm直接作为二进制的字符串放在了html中,但是解题流程不变化):

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <style>
    body {
      background-color: rgb(255, 255, 255);
    }
  </style>
</head>
<script>


var instance;

fetch('../out/main.wasm').then(response =>
  response.arrayBuffer()
).then(bytes => WebAssembly.instantiate(bytes)).then(results => {
  instance = results.instance;
}).catch(console.error);


function check_flag(){
  var value = document.getElementById("key_value").value;
  instance.exports.set_input_flag_len(value.length);
  for(var ii=0;ii<value.length;ii++){
      instance.exports.set_input_flag(value[ii].charCodeAt(),ii);
  }
  var ret =  instance.exports.check_key();

  if (ret == 1){
   document.getElementById("tips").innerHTML = "Congratulations!"
  }
  else{
    document.getElementById("tips").innerHTML = "Not Correct!"
  }
}
</script>
<body>
   <div>Key:<input id="key_value" type="text" name="key"style="width:80%"; value=""><input type="submit" value="check"  onclick="check_flag()"></div>
   <div> <label  id="tips" ></label></div>
</body>
</html>

html中调用了wasm中的check_flag函数进行验证。
wasm的源码如下:

#include <string.h>
#include <stdio.h>
#define WASM_EXPORT __attribute__((visibility("default")))

char input_flag[200]={0};
int input_flag_len=0;
int check_a();
int o(char* a ,char*  b, char*  c, char*  d){
  int a1 = *a*23||*b**b^12^*c&3345^*a;
  int a2 = *c||*a&*b-32%(*b+23&&*d);
  int a3 = *a^*d+4||98&(*c+*b+*d);
  int a4 = *b&32+*c||*d*(*b+*c+*a+98);
  int a5 = *a*255**c+98**d&69**a+78**c||22;
  int a6 = *c||*d+45+*c||*a+*d||*c+*a&*d;
  if(a1+a2 != a3+a4){
    a1 = a2+a3*a5;
  }
  else{
    a1 = a4||a5-a4;
  }
  for(int ii=0;ii<16&& a1!=0;ii++ ){
    a1 += ii*(a2+a3+a4+a5);
  }
  if( *a+*b+*c+*d == -1)
  {
    return a1+a2+a3+a4+a5+a6;
  }
  else{
    *a = *a ^ 24;
    *b = *b ^ 9;
    *c = *c ^ 3;
    *d = *d ^ 107;
    return *a^0x70^a1^a2^a1^a2;
  }
}
int oo(char* a ,char*  b, char*  c, char*  d){
  int a1 = *a*263||*b^91^*c&345;
  int a2 = *c||*a-22%(*b+293);
  int a3 = *a^*d+14||8&(*c+*b+*d);
  int a4 = *b&322+*c||(*b+*c+*a+38);
  int a5 = *a*55**c+8**d&6**a+7**c||2;
  int a6 = *c||*d+5+*c+*d||*c+*a&*d;
  if(a1+a2 != a6+a4){
    a1 = a3+a1*a5;
  }
  else{
    a1 = a4*a5-a4;
  }
  for(int ii=0;ii<16&& a1!=0;ii++ ){
    a1 += ii*(a1+a2+a3);
  }
  if( *a+*b+*c+*d == -1)
  {
    return a1+a2+a3+a4+a5+a6;
  }
  else{
    *a = *a ^ 1;
    *b = *b ^ 90;
    *c = *c ^ 50;
    *d = *d ^ 87;
    return *a^0x64^a1^a2^a1^a2;
  }
}
int ooo(char* a ,char*  b, char*  c, char*  d){
  int a1 = *a||*b**b^12^*c^*a;
  int a2 = *c||*a&*b-32%(*b&&*d);
  int a3 = *a^*d+4&(*c+*b+*d);
  int a4 = *b&32+*c||*d*(*b+*c+*a);
  int a5 = *a**c**d&69**a+78**c;
  int a6 = *c||*d+*c||*a+*d||*c+*a&*d;
  if(a1+a2 != a3+a4){
    a1 = a2+a3*a2;
  }
  else{
    a1 = a4-a5-a4;
  }
  for(int ii=0;ii<16&& a1!=0;ii++ ){
    a1 += ii/2*(a1+a3+a4+a5);
  }
  if( *a+*b+*c+*d == -1)
  {
    return a1+a2+a3+a4+a5+a6;
  }
  else{
    *a = *a ^ 48;
    *b = *b ^ 93;
    *c = *c ^ 64;
    *d = *d ^ 70;
    return *a^0x66^a1^a2^a1^a2;
  }
}
int oooo(char* a ,char*  b, char*  c, char*  d){
  int a1 = *a*23||*b**b^12^*c&3345^*a;
  int a2 = *c||*a&*b-(*b+23&&*d);
  int a3 = *a^*d+4||(*c+*b+*d);
  int a4 = *b&32+*c||*d*(*b+*c+*a);
  int a5 = *a**c**d&69**a+8**c;
  int a6 = *c||*d+*c||*a+*d||*c+*a&*d;
  if(a1+a2 != a3+a4){
    a1 = a2+a3*a5;
  }
  else{
    a1 = a4||a5-a4;
  }
  for(int ii=0;ii<112&& a1!=0;ii++ ){
    a1 += ii*(a2+a3+a4+a5);
  }
  if( *a+*b+*c+*d == -1)
  {
    return a1+a2+a4+a5;
  }
  else{
    *a = *a ^ 43;
    *b = *b ^ 70;
    *c = *c ^ 86;
    *d = *d ^ 61;
    return *a^0x60^a1^a2^a1^a2;
  }
}
int ooooo(char* a ,char*  b, char*  c, char*  d){
  int a1 = *a||*b**b^12^*c&3345^*a;
  int a2 = *c||*a&*b-32%(*b&&*d);
  int a3 = *a^*d+4||98&(*c+*b+*d);
  int a4 = *b+*c||*d*(*b+*c+*a+98);
  int a5 = *a**c+98**d**a+78**c||22;
  int a6 = *c||*d+*c||*a+*d||*c+*a&*d;
  if(a1+a2 != a3+a4){
    a1 = a2+a3*a5;
  }
  else{
    a1 = a4||a5-a4;
  }
  for(int ii=0;ii<16&& a1!=0;ii++ ){
    a1 += ii*(a2+a3+a4+a5);
  }
  if( *a+*b+*c+*d == -1)
  {
    return a1+a2+a3+a4+a5+a6;
  }
  else{
    *a = *a ^ 2;
    *b = *b ^ 67;
    *c = *c ^ 23;
    *d = *d;
    return *a^0x90^a1^a2^a1^a2;
  }
}
int oooooo(char* a ,char*  b, char*  c, char*  d){
  int a1 = *a||*b**b^*c^*a;
  int a2 = *c||*a&*b%(*b&&*d);
  int a3 = *a^*d&(*c+*b+*d);
  int a4 = *b+*c||*d*(*b+*c+*a);
  int a5 = *a**c**d**a**c;
  int a6 = *c||*d+*c||*a+*d||*c+*a&*d;
  if(a1+a2 != a3+a4){
    a1 = a2+a3*a5;
  }
  else{
    a1 = a4||a5-a4;
  }
  for(int ii=0;ii<16&& a1!=0;ii++ ){
    a1 += ii*(a2+a3+a4+a5);
  }
  if( *a+*b+*c+*d == -1)
  {
    return a1+a2+a3+a4+a5+a6;
  }
  else{
    *a = *a ^ 50;
    *b = *b ^ 83;
    *c = *c ^ 31;
    *d = *d ^ 38;
    return *a^0x45^a1^a2^a1^a2;
  }
}
int ooooooo(char* a ,char*  b, char*  c, char*  d){
  int a1 = *a*23||*b**b^12^*c&3345^*a;
  int a2 = *c||*a&*b-32%(*b+23&&*d);
  int a3 = *a^*d+4||98&(*c+*b+*d);
  int a4 = *b&32+*c||*d*(*b+*c+*a+98);
  int a5 = *a*255**c+98**d&69**a+78**c||22;
  int a6 = *c||*d+45+*c||*a+*d||*c+*a&*d;
  if(a1+a2 != a3+a4){
    a1 = a2+a3*a5;
  }
  else{
    a1 = a4||a5-a2;
  }
  for(int ii=0;ii<16&& a1!=0;ii++ ){
    a1 += ii*(a2+a3+a4+a5);
  }
  if( *a+*b+*c+*d == -1)
  {
    return a1+a2+a3+a4+a5+a6;
  }
  else{
    *a = *a ^ 42;
    *b = *b ^ 1;
    *c = *c ;
    *d = *d ^ 16;
    return *a^0x32^a1^a2^a1^a2;
  }
}
int oooooooo(char* a ,char*  b, char*  c, char*  d){
  int a1 = *a*23||*b**b^12^*c&3345^*a;
  int a2 = *c||*a&*b-32%(*b+23&&*d);
  int a3 = *a^*d+4||98&(*c+*b+*d);
  int a4 = *b&32+*c||*d*(*b+*c+*a+98);
  int a5 = *a*255**c+98**d&69**a+78**c||22;
  int a6 = *c||*d+45+*c||*a+*d||*c+*a&*d;
  if(a1+a2 != a3+a4){
    a1 = a2+a1*a5;
  }
  else{
    a1 = a4||a5-a4;
  }
  for(int ii=0;ii<16&& a1!=0;ii++ ){
    a1 += ii*(a2+a3+a4+a5);
  }
  if( *a+*b+*c+*d == -1)
  {
    return a1+a2+a3+a4+a5+a6;
  }
  else{
    *a = *a ^ 16;
    *b = *b ^ 30;
    *c = *c ^ 64;
    *d = *d ;
    return *a^0x44^a1^a2^a1^a2;
  }
}
WASM_EXPORT
int set_input_flag(int value,int offset) {
  input_flag[offset] = (char)value;
  return 0;
}

WASM_EXPORT
int set_input_flag_len(int length) {
  input_flag_len = length;// (char)value;
  return 0;
}


WASM_EXPORT
int check_key(){
  o(&input_flag[0],&input_flag[1],&input_flag[2],&input_flag[3]);
  oo(&input_flag[4],&input_flag[5],&input_flag[6],&input_flag[7]);
  ooo(&input_flag[8],&input_flag[9],&input_flag[10],&input_flag[11]);
  oooo(&input_flag[12],&input_flag[13],&input_flag[14],&input_flag[15]);
  ooooo(&input_flag[16],&input_flag[17],&input_flag[18],&input_flag[19]);
  oooooo(&input_flag[20],&input_flag[21],&input_flag[22],&input_flag[23]);
  ooooooo(&input_flag[24],&input_flag[25],&input_flag[26],&input_flag[27]);
  oooooooo(&input_flag[28],&input_flag[29],&input_flag[30],&input_flag[31]);
  return xxx();

}

int xxx() {
if(input_flag[0] *  108 +input_flag[1] *  111 +input_flag[2] *  92 +input_flag[3] *  194 +input_flag[4] *  124 +input_flag[5] *  240 +input_flag[6] *  126 +input_flag[7] *  81 +input_flag[8] *  144 +input_flag[9] *  103 +input_flag[10] *  161 +input_flag[11] *  50 +input_flag[12] *  67 +input_flag[13] *  15 +input_flag[14] *  127 +input_flag[15] *  232 +input_flag[16] *  188 +input_flag[17] *  19 +input_flag[18] *  233 +input_flag[19] *  153 +input_flag[20] *  231 +input_flag[21] *  40 +input_flag[22] *  112 +input_flag[23] *  106 +input_flag[24] *  135 +input_flag[25] *  90 +input_flag[26] *  67 +input_flag[27] *  20 +input_flag[28] *  248 +input_flag[29] *  45 +input_flag[30]
*  48 +input_flag[31] *  174 !=  359512 ){return 0;}
if(input_flag[0] *  227 +input_flag[1] *  78 +input_flag[2] *  195 +input_flag[3] *  81 +input_flag[4] *  10 +input_flag[5] *  248 +input_flag[6] *  186 +input_flag[7] *  171 +input_flag[8] *  148 +input_flag[9] *  194 +input_flag[10] *  40 +input_flag[11] *  180 +input_flag[12] *  17 +input_flag[13] *  212 +input_flag[14] *  104 +input_flag[15] *  90 +input_flag[16] *  178 +input_flag[17] *  26 +input_flag[18] *  225 +input_flag[19] *  209 +input_flag[20] *  32 +input_flag[21] *  169 +input_flag[22] *  94 +input_flag[23] *  156 +input_flag[24] *  154 +input_flag[25] *  56 +input_flag[26] *  244 +input_flag[27] *  149 +input_flag[28] *  120 +input_flag[29] *  131 +input_flag[30] *  13 +input_flag[31] *  101 !=  387514 ){return 0;}
if(input_flag[0] *  83 +input_flag[1] *  44 +input_flag[2] *  95 +input_flag[3] *  131 +input_flag[4] *  30 +input_flag[5] *  55 +input_flag[6] *  46 +input_flag[7] *  36 +input_flag[8] *  67 +input_flag[9] *  109 +input_flag[10] *  69 +input_flag[11] *  251 +input_flag[12] *  8 +input_flag[13] *  248 +input_flag[14] *  40 +input_flag[15] *  154 +input_flag[16] *  251 +input_flag[17] *  86 +input_flag[18] *  112 +input_flag[19] *  9 +input_flag[20] *  174 +input_flag[21] *  197 +input_flag[22] *  38 +input_flag[23] *  14 +input_flag[24] *  202 +input_flag[25] *  60 +input_flag[26] *  117 +input_flag[27] *  188 +input_flag[28] *  136 +input_flag[29] *  145 +input_flag[30] *  240
+input_flag[31] *  53 !=  301487 ){return 0;}
if(input_flag[0] *  152 +input_flag[1] *  162 +input_flag[2] *  112 +input_flag[3] *  57 +input_flag[4] *  102 +input_flag[5] *  182 +input_flag[6] *  10 +input_flag[7] *  139 +input_flag[8] *  30 +input_flag[9] *  7 +input_flag[10] *  145 +input_flag[11] *  127 +input_flag[12] *  148 +input_flag[13] *  5 +input_flag[14] *  165 +input_flag[15] *  109 +input_flag[16] *  110 +input_flag[17] *  234 +input_flag[18] *  113 +input_flag[19] *  33 +input_flag[20] *  192 +input_flag[21] *  45 +input_flag[22] *  65 +input_flag[23] *  105 +input_flag[24] *  140 +input_flag[25] *  116 +input_flag[26] *  35 +input_flag[27] *  48 +input_flag[28] *  155 +input_flag[29] *  25 +input_flag[30] *
 234 +input_flag[31] *  25 !=  296549 ){return 0;}
if(input_flag[0] *  101 +input_flag[1] *  189 +input_flag[2] *  236 +input_flag[3] *  118 +input_flag[4] *  141 +input_flag[5] *  148 +input_flag[6] *  197 +input_flag[7] *  7 +input_flag[8] *  108 +input_flag[9] *  104 +input_flag[10] *  45 +input_flag[11] *  130 +input_flag[12] *  39 +input_flag[13] *  164 +input_flag[14] *  88 +input_flag[15] *  241 +input_flag[16] *  108 +input_flag[17] *  107 +input_flag[18] *  76 +input_flag[19] *  34 +input_flag[20] *  210 +input_flag[21] *  29 +input_flag[22] *  156 +input_flag[23] *  90 +input_flag[24] *  139 +input_flag[25] *  151 +input_flag[26] *  10 +input_flag[27] *  97 +input_flag[28] *  209 +input_flag[29] *  46 +input_flag[30] *  82 +input_flag[31] *  113 !=  344514 ){return 0;}
if(input_flag[0] *  182 +input_flag[1] *  13 +input_flag[2] *  50 +input_flag[3] *  102 +input_flag[4] *  155 +input_flag[5] *  230 +input_flag[6] *  3 +input_flag[7] *  225 +input_flag[8] *  237 +input_flag[9] *  163 +input_flag[10] *  38 +input_flag[11] *  176 +input_flag[12] *  115 +input_flag[13] *  105 +input_flag[14] *  203 +input_flag[15] *  26 +input_flag[16] *  72 +input_flag[17] *  111 +input_flag[18] *  96 +input_flag[19] *  240 +input_flag[20] *  139 +input_flag[21] *  117 +input_flag[22] *  153 +input_flag[23] *  120 +input_flag[24] *  151 +input_flag[25] *  25 +input_flag[26] *  49 +input_flag[27] *  90 +input_flag[28] *  98 +input_flag[29] *  7 +input_flag[30] *
179 +input_flag[31] *  72 !=  346892 ){return 0;}
if(input_flag[0] *  170 +input_flag[1] *  150 +input_flag[2] *  226 +input_flag[3] *  101 +input_flag[4] *  110 +input_flag[5] *  99 +input_flag[6] *  127 +input_flag[7] *  101 +input_flag[8] *  203 +input_flag[9] *  209 +input_flag[10] *  187 +input_flag[11] *  100 +input_flag[12] *  226 +input_flag[13] *  186 +input_flag[14] *  252 +input_flag[15] *  39 +input_flag[16] *  65 +input_flag[17] *  67 +input_flag[18] *  225 +input_flag[19] *  174 +input_flag[20] *  1 +input_flag[21] *  187 +input_flag[22] *  214 +input_flag[23] *  22 +input_flag[24] *  74 +input_flag[25] *  99 +input_flag[26] *  129 +input_flag[27] *  254 +input_flag[28] *  13 +input_flag[29] *  97 +input_flag[30]
*  156 +input_flag[31] *  61 !=  386678 ){return 0;}
if(input_flag[0] *  1 +input_flag[1] *  88 +input_flag[2] *  118 +input_flag[3] *  232 +input_flag[4] *  60 +input_flag[5] *  252 +input_flag[6] *  133 +input_flag[7] *  177 +input_flag[8] *  185 +input_flag[9] *  222 +input_flag[10] *  32 +input_flag[11] *  48 +input_flag[12] *  1 +input_flag[13] *  242 +input_flag[14] *  240 +input_flag[15] *  218 +input_flag[16] *  81 +input_flag[17] *  22 +input_flag[18] *  73 +input_flag[19] *  171 +input_flag[20] *  139 +input_flag[21] *  72 +input_flag[22] *  106 +input_flag[23] *  62 +input_flag[24] *  156 +input_flag[25] *  134 +input_flag[26] *  220 +input_flag[27] *  19 +input_flag[28] *  77 +input_flag[29] *  94 +input_flag[30] *  154 +input_flag[31] *  117 !=  348667 ){return 0;}
if(input_flag[0] *  189 +input_flag[1] *  173 +input_flag[2] *  41 +input_flag[3] *  39 +input_flag[4] *  26 +input_flag[5] *  232 +input_flag[6] *  75 +input_flag[7] *  75 +input_flag[8] *  95 +input_flag[9] *  7 +input_flag[10] *  117 +input_flag[11] *  96 +input_flag[12] *  211 +input_flag[13] *  130 +input_flag[14] *  228 +input_flag[15] *  143 +input_flag[16] *  91 +input_flag[17] *  247 +input_flag[18] *  43 +input_flag[19] *  122 +input_flag[20] *  131 +input_flag[21] *  52 +input_flag[22] *  48 +input_flag[23] *  29 +input_flag[24] *  111 +input_flag[25] *  38 +input_flag[26] *  19 +input_flag[27] *  242 +input_flag[28] *  162 +input_flag[29] *  70 +input_flag[30] *  220 +input_flag[31] *  151 !=  316884 ){return 0;}
if(input_flag[0] *  236 +input_flag[1] *  136 +input_flag[2] *  147 +input_flag[3] *  104 +input_flag[4] *  79 +input_flag[5] *  204 +input_flag[6] *  220 +input_flag[7] *  25 +input_flag[8] *  38 +input_flag[9] *  233 +input_flag[10] *  165 +input_flag[11] *  20 +input_flag[12] *  174 +input_flag[13] *  120 +input_flag[14] *  214 +input_flag[15] *  18 +input_flag[16] *  233 +input_flag[17] *  119 +input_flag[18] *  244 +input_flag[19] *  143 +input_flag[20] *  126 +input_flag[21] *  226 +input_flag[22] *  77 +input_flag[23] *  33 +input_flag[24] *  189 +input_flag[25] *  5 +input_flag[26] *  150 +input_flag[27] *  160 +input_flag[28] *  14 +input_flag[29] *  112 +input_flag[30] *  231 +input_flag[31] *  92 !=  372620 ){return 0;}
if(input_flag[0] *  191 +input_flag[1] *  38 +input_flag[2] *  193 +input_flag[3] *  250 +input_flag[4] *  212 +input_flag[5] *  175 +input_flag[6] *  39 +input_flag[7] *  94 +input_flag[8] *  183 +input_flag[9] *  172 +input_flag[10] *  171 +input_flag[11] *  163 +input_flag[12] *  129 +input_flag[13] *  165 +input_flag[14] *  64 +input_flag[15] *  170 +input_flag[16] *  199 +input_flag[17] *  2 +input_flag[18] *  167 +input_flag[19] *  2 +input_flag[20] *  216 +input_flag[21] *  252 +input_flag[22] *  184 +input_flag[23] *  187 +input_flag[24] *  97 +input_flag[25] *  109 +input_flag[26] *  98 +input_flag[27] *  135 +input_flag[28] *  192 +input_flag[29] *  88 +input_flag[30]
*  50 +input_flag[31] *  203 !=  413102 ){return 0;}
if(input_flag[0] *  203 +input_flag[1] *  81 +input_flag[2] *  252 +input_flag[3] *  104 +input_flag[4] *  248 +input_flag[5] *  156 +input_flag[6] *  199 +input_flag[7] *  46 +input_flag[8] *  208 +input_flag[9] *  240 +input_flag[10] *  149 +input_flag[11] *  155 +input_flag[12] *  102 +input_flag[13] *  95 +input_flag[14] *  51 +input_flag[15] *  208 +input_flag[16] *  208 +input_flag[17] *  62 +input_flag[18] *  58 +input_flag[19] *  117 +input_flag[20] *  72 +input_flag[21] *  23 +input_flag[22] *  193 +input_flag[23] *  193 +input_flag[24] *  226 +input_flag[25] *  217 +input_flag[26] *  106 +input_flag[27] *  147 +input_flag[28] *  136 +input_flag[29] *  16 +input_flag[30] *  43 +input_flag[31] *  196 !=  428661 ){return 0;}
if(input_flag[0] *  144 +input_flag[1] *  69 +input_flag[2] *  224 +input_flag[3] *  107 +input_flag[4] *  225 +input_flag[5] *  83 +input_flag[6] *  15 +input_flag[7] *  10 +input_flag[8] *  214 +input_flag[9] *  152 +input_flag[10] *  24 +input_flag[11] *  136 +input_flag[12] *  165 +input_flag[13] *  208 +input_flag[14] *  38 +input_flag[15] *  67 +input_flag[16] *  201 +input_flag[17] *  180 +input_flag[18] *  158 +input_flag[19] *  75 +input_flag[20] *  111 +input_flag[21] *  65 +input_flag[22] *  211 +input_flag[23] *  220 +input_flag[24] *  135 +input_flag[25] *  125 +input_flag[26] *  216 +input_flag[27] *  105 +input_flag[28] *  122 +input_flag[29] *  112 +input_flag[30] *  80 +input_flag[31] *  49 !=  371484 ){return 0;}
if(input_flag[0] *  143 +input_flag[1] *  68 +input_flag[2] *  127 +input_flag[3] *  51 +input_flag[4] *  152 +input_flag[5] *  88 +input_flag[6] *  153 +input_flag[7] *  9 +input_flag[8] *  149 +input_flag[9] *  107 +input_flag[10] *  178 +input_flag[11] *  166 +input_flag[12] *  190 +input_flag[13] *  177 +input_flag[14] *  99 +input_flag[15] *  71 +input_flag[16] *  63 +input_flag[17] *  233 +input_flag[18] *  58 +input_flag[19] *  132 +input_flag[20] *  109 +input_flag[21] *  75 +input_flag[22] *  152 +input_flag[23] *  95 +input_flag[24] *  74 +input_flag[25] *  195 +input_flag[26] *  90 +input_flag[27] *  251 +input_flag[28] *  205 +input_flag[29] *  8 +input_flag[30] *  76 +input_flag[31] *  129 !=  350848 ){return 0;}
if(input_flag[0] *  209 +input_flag[1] *  146 +input_flag[2] *  59 +input_flag[3] *  38 +input_flag[4] *  40 +input_flag[5] *  56 +input_flag[6] *  182 +input_flag[7] *  245 +input_flag[8] *  67 +input_flag[9] *  202 +input_flag[10] *  177 +input_flag[11] *  183 +input_flag[12] *  26 +input_flag[13] *  126 +input_flag[14] *  161 +input_flag[15] *  95 +input_flag[16] *  133 +input_flag[17] *  123 +input_flag[18] *  163 +input_flag[19] *  30 +input_flag[20] *  88 +input_flag[21] *  219 +input_flag[22] *  5 +input_flag[23] *  86 +input_flag[24] *  183 +input_flag[25] *  156 +input_flag[26] *  253 +input_flag[27] *  97 +input_flag[28] *  43 +input_flag[29] *  128 +input_flag[30] *
31 +input_flag[31] *  102 !=  334408 ){return 0;}
if(input_flag[0] *  146 +input_flag[1] *  223 +input_flag[2] *  137 +input_flag[3] *  228 +input_flag[4] *  226 +input_flag[5] *  155 +input_flag[6] *  170 +input_flag[7] *  92 +input_flag[8] *  77 +input_flag[9] *  17 +input_flag[10] *  22 +input_flag[11] *  128 +input_flag[12] *  20 +input_flag[13] *  171 +input_flag[14] *  142 +input_flag[15] *  170 +input_flag[16] *  192 +input_flag[17] *  49 +input_flag[18] *  200 +input_flag[19] *  178 +input_flag[20] *  154 +input_flag[21] *  42 +input_flag[22] *  5 +input_flag[23] *  159 +input_flag[24] *  251 +input_flag[25] *  152 +input_flag[26] *  7 +input_flag[27] *  247 +input_flag[28] *  145 +input_flag[29] *  39 +input_flag[30] *  91 +input_flag[31] *  136 !=  382822 ){return 0;}
if(input_flag[0] *  169 +input_flag[1] *  204 +input_flag[2] *  244 +input_flag[3] *  26 +input_flag[4] *  77 +input_flag[5] *  134 +input_flag[6] *  221 +input_flag[7] *  205 +input_flag[8] *  149 +input_flag[9] *  47 +input_flag[10] *  1 +input_flag[11] *  197 +input_flag[12] *  82 +input_flag[13] *  195 +input_flag[14] *  123 +input_flag[15] *  219 +input_flag[16] *  116 +input_flag[17] *  80 +input_flag[18] *  13 +input_flag[19] *  231 +input_flag[20] *  173 +input_flag[21] *  192 +input_flag[22] *  220 +input_flag[23] *  224 +input_flag[24] *  108 +input_flag[25] *  104 +input_flag[26] *  56 +input_flag[27] *  152 +input_flag[28] *  84 +input_flag[29] *  226 +input_flag[30] *  121 +input_flag[31] *  205 !=  420160 ){return 0;}
if(input_flag[0] *  184 +input_flag[1] *  45 +input_flag[2] *  176 +input_flag[3] *  126 +input_flag[4] *  118 +input_flag[5] *  161 +input_flag[6] *  142 +input_flag[7] *  171 +input_flag[8] *  215 +input_flag[9] *  83 +input_flag[10] *  233 +input_flag[11] *  184 +input_flag[12] *  171 +input_flag[13] *  182 +input_flag[14] *  126 +input_flag[15] *  111 +input_flag[16] *  118 +input_flag[17] *  67 +input_flag[18] *  92 +input_flag[19] *  219 +input_flag[20] *  70 +input_flag[21] *  252 +input_flag[22] *  194 +input_flag[23] *  21 +input_flag[24] *  245 +input_flag[25] *  204 +input_flag[26] *  48 +input_flag[27] *  150 +input_flag[28] *  39 +input_flag[29] *  85 +input_flag[30] *  73 +input_flag[31] *  95 !=  402263 ){return 0;}
if(input_flag[0] *  48 +input_flag[1] *  224 +input_flag[2] *  164 +input_flag[3] *  138 +input_flag[4] *  92 +input_flag[5] *  3 +input_flag[6] *  191 +input_flag[7] *  94 +input_flag[8] *  19 +input_flag[9] *  50 +input_flag[10] *  34 +input_flag[11] *  167 +input_flag[12] *  75 +input_flag[13] *  72 +input_flag[14] *  238 +input_flag[15] *  15 +input_flag[16] *  111 +input_flag[17] *  216 +input_flag[18] *  84 +input_flag[19] *  40 +input_flag[20] *
145 +input_flag[21] *  112 +input_flag[22] *  140 +input_flag[23] *  204 +input_flag[24] *  154 +input_flag[25] *  195 +input_flag[26] *  175 +input_flag[27] *  250 +input_flag[28] *  202 +input_flag[29] *  169 +input_flag[30] *
 170 +input_flag[31] *  120 !=  366968 ){return 0;}
if(input_flag[0] *  112 +input_flag[1] *  19 +input_flag[2] *  189 +input_flag[3] *  50 +input_flag[4] *  247 +input_flag[5] *  240 +input_flag[6] *  164 +input_flag[7] *  5 +input_flag[8] *  139 +input_flag[9] *  56 +input_flag[10] *  19 +input_flag[11] *  4 +input_flag[12] *  23 +input_flag[13] *  172 +input_flag[14] *  96 +input_flag[15] *  254 +input_flag[16] *  63 +input_flag[17] *  247 +input_flag[18] *  149 +input_flag[19] *  183 +input_flag[20] *  128 +input_flag[21] *  147 +input_flag[22] *  213 +input_flag[23] *  243 +input_flag[24] *  172 +input_flag[25] *  144 +input_flag[26] *  246 +input_flag[27] *  25 +input_flag[28] *  106 +input_flag[29] *  176 +input_flag[30] *  170 +input_flag[31] *  68 !=  384909 ){return 0;}
if(input_flag[0] *  184 +input_flag[1] *  22 +input_flag[2] *  183 +input_flag[3] *  128 +input_flag[4] *  149 +input_flag[5] *  174 +input_flag[6] *  227 +input_flag[7] *  113 +input_flag[8] *  65 +input_flag[9] *  159 +input_flag[10] *  74 +input_flag[11] *  170 +input_flag[12] *  186 +input_flag[13] *  174 +input_flag[14] *  211 +input_flag[15] *  1 +input_flag[16] *  223 +input_flag[17] *  156 +input_flag[18] *  253 +input_flag[19] *  223 +input_flag[20] *  241 +input_flag[21] *  252 +input_flag[22] *  148 +input_flag[23] *  93 +input_flag[24] *  41 +input_flag[25] *  125 +input_flag[26] *  27 +input_flag[27] *  136 +input_flag[28] *  78 +input_flag[29] *  248 +input_flag[30] *  41 +input_flag[31] *  31 !=  425203 ){return 0;}
if(input_flag[0] *  155 +input_flag[1] *  237 +input_flag[2] *  242 +input_flag[3] *  10 +input_flag[4] *  145 +input_flag[5] *  99 +input_flag[6] *  239 +input_flag[7] *  105 +input_flag[8] *  3 +input_flag[9] *  43 +input_flag[10] *  46 +input_flag[11] *  155 +input_flag[12] *  208 +input_flag[13] *  75 +input_flag[14] *  140 +input_flag[15] *  181 +input_flag[16] *  197 +input_flag[17] *  140 +input_flag[18] *  10 +input_flag[19] *  170 +input_flag[20] *  142 +input_flag[21] *  212 +input_flag[22] *  186 +input_flag[23] *  27 +input_flag[24] *  105 +input_flag[25] *  118 +input_flag[26] *  198 +input_flag[27] *  243 +input_flag[28] *  13 +input_flag[29] *  113 +input_flag[30] *  82 +input_flag[31] *  39 !=  372162 ){return 0;}
if(input_flag[0] *  207 +input_flag[1] *  206 +input_flag[2] *  127 +input_flag[3] *  58 +input_flag[4] *  91 +input_flag[5] *  87 +input_flag[6] *  7 +input_flag[7] *  17 +input_flag[8] *  63 +input_flag[9] *  180 +input_flag[10] *  40 +input_flag[11] *  96 +input_flag[12] *  202 +input_flag[13] *  185 +input_flag[14] *  68 +input_flag[15] *  72 +input_flag[16] *  240 +input_flag[17] *  36 +input_flag[18] *  139 +input_flag[19] *  199 +input_flag[20] *
 76 +input_flag[21] *  229 +input_flag[22] *  159 +input_flag[23] *  136 +input_flag[24] *  94 +input_flag[25] *  19 +input_flag[26] *  3 +input_flag[27] *  87 +input_flag[28] *  45 +input_flag[29] *  6 +input_flag[30] *  136 +input_flag[31] *  50 !=  297509 ){return 0;}
if(input_flag[0] *  115 +input_flag[1] *  215 +input_flag[2] *  40 +input_flag[3] *  166 +input_flag[4] *  87 +input_flag[5] *  83 +input_flag[6] *  74 +input_flag[7] *  202 +input_flag[8] *  235 +input_flag[9] *  149 +input_flag[10] *  114 +input_flag[11] *  76 +input_flag[12] *  204 +input_flag[13] *  218 +input_flag[14] *  63 +input_flag[15] *  123 +input_flag[16] *  9 +input_flag[17] *  172 +input_flag[18] *  38 +input_flag[19] *  138 +input_flag[20] *  35 +input_flag[21] *  200 +input_flag[22] *  221 +input_flag[23] *  144 +input_flag[24] *  235 +input_flag[25] *  108 +input_flag[26] *  1 +input_flag[27] *  245 +input_flag[28] *  153 +input_flag[29] *  184 +input_flag[30] *  90 +input_flag[31] *  12 !=  372215 ){return 0;}
if(input_flag[0] *  123 +input_flag[1] *  190 +input_flag[2] *  55 +input_flag[3] *  180 +input_flag[4] *  84 +input_flag[5] *  231 +input_flag[6] *  81 +input_flag[7] *  116 +input_flag[8] *  61 +input_flag[9] *  3 +input_flag[10] *  94 +input_flag[11] *  85 +input_flag[12] *  190 +input_flag[13] *  187 +input_flag[14] *  142 +input_flag[15] *  62 +input_flag[16] *  225 +input_flag[17] *  240 +input_flag[18] *  179 +input_flag[19] *  150 +input_flag[20] *  77 +input_flag[21] *  85 +input_flag[22] *  196 +input_flag[23] *  12 +input_flag[24] *  144 +input_flag[25] *  122 +input_flag[26] *  28 +input_flag[27] *  224 +input_flag[28] *  248 +input_flag[29] *  143 +input_flag[30] *
 114 +input_flag[31] *  36 !=  370337 ){return 0;}
if(input_flag[0] *  2 +input_flag[1] *  202 +input_flag[2] *  40 +input_flag[3] *  224 +input_flag[4] *  154 +input_flag[5] *  65 +input_flag[6] *  30 +input_flag[7] *  241 +input_flag[8] *  13 +input_flag[9] *  213 +input_flag[10] *  176 +input_flag[11] *  122 +input_flag[12] *  30 +input_flag[13] *  158 +input_flag[14] *  14 +input_flag[15] *  191 +input_flag[16] *  80 +input_flag[17] *  116 +input_flag[18] *  74 +input_flag[19] *  70 +input_flag[20] *  32 +input_flag[21] *  189 +input_flag[22] *  76 +input_flag[23] *  95 +input_flag[24] *  158 +input_flag[25] *  103 +input_flag[26] *  7 +input_flag[27] *  201 +input_flag[28] *  204 +input_flag[29] *  91 +input_flag[30] *  190 +input_flag[31] *  122 !=  314564 ){return 0;}
if(input_flag[0] *  42 +input_flag[1] *  154 +input_flag[2] *  223 +input_flag[3] *  165 +input_flag[4] *  155 +input_flag[5] *  101 +input_flag[6] *  75 +input_flag[7] *  95 +input_flag[8] *  253 +input_flag[9] *  14 +input_flag[10] *  158 +input_flag[11] *  199 +input_flag[12] *  110 +input_flag[13] *  89 +input_flag[14] *  205 +input_flag[15] *  202 +input_flag[16] *  83 +input_flag[17] *  162 +input_flag[18] *  67 +input_flag[19] *  30 +input_flag[20] *  115 +input_flag[21] *  83 +input_flag[22] *  27 +input_flag[23] *  31 +input_flag[24] *  118 +input_flag[25] *  160 +input_flag[26] *  248 +input_flag[27] *  66 +input_flag[28] *  88 +input_flag[29] *  44 +input_flag[30] *
5 +input_flag[31] *  176 !=  325974 ){return 0;}
if(input_flag[0] *  34 +input_flag[1] *  168 +input_flag[2] *  72 +input_flag[3] *  160 +input_flag[4] *  243 +input_flag[5] *  41 +input_flag[6] *  146 +input_flag[7] *  29 +input_flag[8] *  62 +input_flag[9] *  235 +input_flag[10] *  185 +input_flag[11] *  180 +input_flag[12] *  10 +input_flag[13] *  150 +input_flag[14] *  208 +input_flag[15] *  140 +input_flag[16] *  125 +input_flag[17] *  114 +input_flag[18] *  35 +input_flag[19] *  34 +input_flag[20] *  38 +input_flag[21] *  123 +input_flag[22] *  163 +input_flag[23] *  208 +input_flag[24] *  5 +input_flag[25] *  29 +input_flag[26] *  207 +input_flag[27] *  111 +input_flag[28] *  72 +input_flag[29] *  65 +input_flag[30] *
125 +input_flag[31] *  84 !=  307088 ){return 0;}
if(input_flag[0] *  18 +input_flag[1] *  11 +input_flag[2] *  26 +input_flag[3] *  175 +input_flag[4] *  44 +input_flag[5] *  128 +input_flag[6] *  32 +input_flag[7] *  100 +input_flag[8] *  21 +input_flag[9] *  116 +input_flag[10] *  253 +input_flag[11] *  213 +input_flag[12] *  67 +input_flag[13] *  16 +input_flag[14] *  171 +input_flag[15] *  178 +input_flag[16] *  97 +input_flag[17] *  7 +input_flag[18] *  162 +input_flag[19] *  152 +input_flag[20] *  78 +input_flag[21] *  167 +input_flag[22] *  177 +input_flag[23] *  97 +input_flag[24] *  26 +input_flag[25] *  155 +input_flag[26] *  127 +input_flag[27] *  21 +input_flag[28] *  243 +input_flag[29] *  188 +input_flag[30] *  140 +input_flag[31] *  197 !=  322340 ){return 0;}
if(input_flag[0] *  140 +input_flag[1] *  110 +input_flag[2] *  164 +input_flag[3] *  208 +input_flag[4] *  72 +input_flag[5] *  113 +input_flag[6] *  9 +input_flag[7] *  47 +input_flag[8] *  179 +input_flag[9] *  166 +input_flag[10] *  51 +input_flag[11] *  34 +input_flag[12] *  91 +input_flag[13] *  184 +input_flag[14] *  89 +input_flag[15] *  162 +input_flag[16] *  233 +input_flag[17] *  127 +input_flag[18] *  156 +input_flag[19] *  127 +input_flag[20] *  244 +input_flag[21] *  183 +input_flag[22] *  193 +input_flag[23] *  138 +input_flag[24] *  242 +input_flag[25] *  90 +input_flag[26] *  193 +input_flag[27] *  7 +input_flag[28] *  252 +input_flag[29] *  113 +input_flag[30]
*  152 +input_flag[31] *  7 !=  380716 ){return 0;}
if(input_flag[0] *  133 +input_flag[1] *  105 +input_flag[2] *  75 +input_flag[3] *  146 +input_flag[4] *  173 +input_flag[5] *  27 +input_flag[6] *  97 +input_flag[7] *  142 +input_flag[8] *  164 +input_flag[9] *  15 +input_flag[10] *  10 +input_flag[11] *  177 +input_flag[12] *  239 +input_flag[13] *  141 +input_flag[14] *  189 +input_flag[15] *  67 +input_flag[16] *  153 +input_flag[17] *  108 +input_flag[18] *  206 +input_flag[19] *  210 +input_flag[20] *  171 +input_flag[21] *  252 +input_flag[22] *  84 +input_flag[23] *  249 +input_flag[24] *  7 +input_flag[25] *  168 +input_flag[26] *  100 +input_flag[27] *  30 +input_flag[28] *  196 +input_flag[29] *  244 +input_flag[30] *  197 +input_flag[31] *  75 !=  393331 ){return 0;}
if(input_flag[0] *  147 +input_flag[1] *  221 +input_flag[2] *  57 +input_flag[3] *  186 +input_flag[4] *  69 +input_flag[5] *  230 +input_flag[6] *  167 +input_flag[7] *  3 +input_flag[8] *  220 +input_flag[9] *  63 +input_flag[10] *  218 +input_flag[11] *  235 +input_flag[12] *  156 +input_flag[13] *  146 +input_flag[14] *  75 +input_flag[15] *  198 +input_flag[16] *  204 +input_flag[17] *  197 +input_flag[18] *  59 +input_flag[19] *  61 +input_flag[20] *  179 +input_flag[21] *  47 +input_flag[22] *  221 +input_flag[23] *  127 +input_flag[24] *  210 +input_flag[25] *  218 +input_flag[26] *  241 +input_flag[27] *  135 +input_flag[28] *  196 +input_flag[29] *  185 +input_flag[30] *  53 +input_flag[31] *  79 !=  430295 ){return 0;}
  return 1;
}

最根本的算法就是一个32*32的线性方程组,函数为xxx(),而o,oo等八个函数只是简单的做了一个异或运算,迷惑解题者。

 

线性方程组的A和b为:

108, 111, 92, 194, 124, 240, 126, 81, 144, 103, 161, 50, 67, 15, 127, 232, 188, 19, 233, 153, 231, 40, 112, 106, 135, 90, 67, 20, 248, 45, 48, 174
227, 78, 195, 81, 10, 248, 186, 171, 148, 194, 40, 180, 17, 212, 104, 90, 178, 26, 225, 209, 32, 169, 94, 156, 154, 56, 244, 149, 120, 131, 13, 101
83, 44, 95, 131, 30, 55, 46, 36, 67, 109, 69, 251, 8, 248, 40, 154, 251, 86, 112, 9, 174, 197, 38, 14, 202, 60, 117, 188, 136, 145, 240, 53
152, 162, 112, 57, 102, 182, 10, 139, 30, 7, 145, 127, 148, 5, 165, 109, 110, 234, 113, 33, 192, 45, 65, 105, 140,116, 35, 48, 155, 25, 234, 25
101, 189, 236, 118, 141, 148, 197, 7, 108, 104, 45, 130, 39, 164, 88, 241, 108, 107, 76, 34, 210, 29, 156, 90, 139, 151, 10, 97, 209, 46, 82, 113
182,13, 50, 102, 155, 230, 3, 225, 237, 163, 38, 176, 115, 105, 203, 26, 72, 111, 96, 240, 139, 117, 153, 120, 151, 25, 49, 90, 98, 7, 179, 72
170, 150, 226, 101, 110, 99, 127, 101, 203, 209, 187, 100, 226, 186, 252, 39, 65, 67, 225, 174, 1, 187, 214, 22, 74, 99, 129, 254, 13, 97, 156, 61
1, 88, 118, 232, 60, 252, 133, 177, 185, 222, 32, 48, 1, 242, 240, 218, 81, 22, 73, 171, 139, 72, 106, 62, 156, 134, 220, 19, 77, 94, 154, 117
189, 173, 41, 39, 26, 232, 75, 75, 95, 7, 117, 96, 211, 130, 228, 143, 91, 247, 43, 122, 131, 52, 48, 29, 111, 38, 19, 242, 162, 70, 220, 151
236, 136, 147, 104, 79, 204, 220, 25, 38, 233, 165, 20, 174, 120, 214, 18, 233, 119, 244, 143, 126, 226, 77, 33, 189, 5, 150, 160, 14, 112, 231, 92
191, 38, 193,250, 212, 175, 39, 94, 183, 172, 171, 163, 129, 165, 64, 170, 199, 2, 167, 2, 216, 252, 184, 187, 97, 109, 98, 135, 192, 88, 50, 203
203, 81, 252, 104, 248, 156, 199, 46, 208, 240, 149, 155, 102, 95, 51, 208, 208, 62, 58, 117, 72, 23, 193, 193, 226, 217, 106, 147, 136, 16, 43, 196
144, 69, 224, 107, 225, 83, 15, 10, 214, 152, 24, 136, 165, 208, 38, 67, 201, 180, 158, 75, 111, 65, 211, 220, 135, 125, 216, 105, 122, 112, 80, 49
143, 68, 127, 51, 152, 88, 153, 9, 149, 107, 178, 166, 190, 177, 99, 71, 63, 233, 58, 132, 109, 75, 152, 95, 74, 195, 90,251, 205, 8, 76, 129
209, 146, 59, 38, 40, 56, 182, 245, 67, 202, 177, 183, 26, 126, 161, 95, 133, 123, 163, 30, 88, 219, 5, 86, 183, 156, 253, 97, 43, 128, 31, 102
146, 223, 137, 228, 226, 155, 170, 92, 77, 17, 22, 128, 20, 171, 142, 170, 192, 49, 200, 178, 154, 42, 5, 159, 251, 152, 7, 247, 145, 39, 91, 136
169, 204, 244, 26, 77, 134, 221, 205, 149, 47, 1, 197, 82, 195, 123, 219, 116, 80, 13, 231, 173, 192, 220, 224, 108, 104, 56, 152, 84, 226, 121, 205
184, 45, 176, 126, 118, 161, 142, 171, 215, 83, 233, 184, 171, 182, 126, 111, 118, 67, 92, 219, 70, 252, 194, 21, 245, 204, 48, 150, 39, 85, 73, 95
48, 224, 164, 138, 92, 3, 191, 94, 19, 50, 34, 167, 75, 72, 238, 15, 111, 216, 84, 40, 145, 112, 140, 204, 154, 195, 175, 250, 202, 169, 170, 120
112, 19, 189, 50, 247, 240, 164, 5, 139, 56, 19, 4, 23, 172, 96, 254, 63, 247, 149, 183, 128, 147, 213, 243, 172, 144, 246, 25, 106, 176, 170, 68
184, 22, 183,128, 149, 174, 227, 113, 65, 159, 74, 170, 186, 174, 211, 1, 223, 156, 253, 223, 241, 252, 148, 93, 41, 125, 27, 136, 78, 248, 41, 31
155, 237, 242, 10, 145, 99, 239, 105, 3, 43, 46, 155, 208, 75, 140, 181, 197, 140, 10, 170, 142, 212, 186, 27, 105, 118, 198, 243, 13, 113, 82, 39
207, 206, 127, 58, 91, 87, 7, 17, 63, 180, 40, 96, 202, 185, 68, 72, 240, 36, 139, 199, 76, 229, 159, 136, 94, 19, 3, 87, 45, 6, 136, 50
115, 215, 40, 166, 87, 83, 74, 202, 235, 149, 114, 76, 204, 218, 63, 123, 9, 172, 38, 138, 35, 200, 221, 144, 235, 108, 1, 245, 153, 184, 90, 12
123, 190, 55, 180, 84, 231, 81, 116, 61, 3, 94, 85, 190, 187, 142, 62, 225, 240, 179, 150, 77, 85, 196, 12, 144, 122, 28, 224, 248, 143, 114, 36
2, 202, 40, 224, 154, 65, 30, 241, 13, 213, 176, 122, 30, 158, 14, 191, 80, 116, 74, 70, 32, 189, 76, 95, 158, 103, 7, 201, 204, 91, 190, 122
42, 154, 223, 165, 155, 101, 75, 95, 253, 14, 158, 199, 110, 89, 205, 202, 83, 162, 67, 30, 115, 83, 27, 31, 118, 160, 248, 66, 88, 44, 5, 176
34, 168, 72, 160, 243, 41, 146, 29, 62, 235, 185, 180, 10, 150, 208, 140, 125, 114, 35, 34, 38, 123, 163, 208, 5, 29, 207, 111, 72, 65, 125, 84
18, 11, 26, 175, 44, 128, 32, 100, 21, 116, 253, 213, 67, 16, 171, 178, 97, 7, 162, 152, 78, 167, 177, 97, 26, 155, 127, 21, 243, 188, 140, 197
140, 110, 164, 208, 72, 113, 9, 47, 179, 166, 51, 34, 91, 184, 89, 162, 233, 127, 156, 127, 244, 183, 193, 138, 242, 90, 193, 7, 252, 113, 152, 7
133, 105, 75, 146, 173, 27, 97, 142, 164, 15, 10, 177, 239, 141, 189, 67, 153, 108, 206, 210, 171, 252, 84, 249, 7, 168, 100, 30, 196, 244, 197, 75
147, 221, 57, 186, 69, 230, 167, 3, 220, 63, 218, 235, 156, 146, 75, 198, 204, 197, 59, 61, 179, 47, 221, 127, 210, 218, 241, 135, 196, 185, 53, 79

b

359512
387514
301487
296549
344514
346892
386678
348667
316884
372620
413102
428661
371484
350848
334408
382822
420160
402263
366968
384909
425203
372162
297509
372215
370337
314564
325974
307088
322340
380716
393331
430295

解题者需要利用脚本文件去读取这些参数并求解。解为S0m3time_l1tt1e_c0de_1s_us3ful33

 

而由于o,oo,等八个函数只是做异或运算,可以得到flag为K9nXu3_2o1q2_w3bassembly_r3vers3

安卓程序

只有一个activiy,其中最主要的是一个webview,通过loadurl(127.0.0.1:8000)来解析html。但是程序中还写了一个textview,一个button和一个edittext来迷惑解题者。
主要代码:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        eText1 = findViewById(R.id.editText);
        txView1 = findViewById(R.id.textView);
        ((WebView) findViewById(R.id.text1View)).loadUrl(u);
        ((WebView) findViewById(R.id.text1View)).getSettings().setJavaScriptEnabled(true);
        button1 = findViewById(R.id.button);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String key = eText1.getText().toString();
                int ret = check_key(key);
                if(ret == 1){
                    txView1.setText("Congratulations!");
                }
                else{
                    txView1.setText("Not Correct!");
                }

            }
        });

    }

native的函数主要工作为,实现一个简单的http服务器,内容为上面的wasm代码。
代码如下:

//
// Created by foyjog on 2019/5/27.
//

#include <jni.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <signal.h>
#include <pthread.h>

#include "com_example_assemgogogo_gogogoJNI.h"

#define PORT "8000" // The port users will connect to
#define BACKLOG 128 // how many pending connections queue will hold
#define NUM_THREADS 8
// get sockaddr, IPv4 or IPv6
void* j_nullsub__ (struct sockaddr* sa) {
    if (sa->sa_family == AF_INET) {
        return &(((struct sockaddr_in*) sa)->sin_addr);
    } else {
        return &(((struct sockaddr_in6*) sa)->sin6_addr);
    }
}

struct ThreadData {
    int sockfd;
    char* body;
};
int sock_fd_g = 0;
void* _nullsub_ (void* td) {

    int new_fd, id = (int) pthread_self();
    struct ThreadData* data = (struct ThreadData*) td;
    struct sockaddr_storage their_addr; // connector's address
    socklen_t sin_size = sizeof their_addr;
    char s [INET6_ADDRSTRLEN], buf [50000];
    const char* const msg = mm0;
    const char* const fmt_header =
            "HTTP/1.1 200 OK\r\n"
            "Content-Type: text/html; charset=utf-8\r\n"
            "Content-Length: %ld\r\n"
            "\r\n"
            "%s";

    while (1) {
        new_fd = accept(data->sockfd, (struct sockaddr*) &their_addr, &sin_size);
        if (new_fd == -1) {
            continue;
        }

        inet_ntop(their_addr.ss_family,
                  j_nullsub__((struct sockaddr*) &their_addr), s, sizeof s);

        snprintf(buf, 50000, fmt_header, strlen(msg), msg);
        if (send(new_fd, buf, strlen(buf), 0) == -1) {
            perror("send");
        }
        close(new_fd);
    }

    return NULL;
}
int inti_proc()
{
    int sockfd; // listen on sock_fd, new connection on new_fd
    struct addrinfo hints, *servinfo, *p;
    int yes = 1;
    int rv;
    for(int ii=0;ii<34291;ii++){
        mm0[ii] = mm0[ii] ^ 0x67;
    }
    hints = (struct addrinfo) {
            .ai_family = AF_UNSPEC,
            .ai_socktype = SOCK_STREAM,
            .ai_flags = AI_PASSIVE // use my IP
    };

    if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
        return 1;
    }

    // loop through all results and bind to the first we can
    for (p = servinfo; p != NULL; p = p->ai_next) {
        if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
            continue;
        }

        if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof (int)) == -1) {
            return 1;
        }

        if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
            close(sockfd);
            continue;
        }

        break;
    }

    if (p == NULL) {
        return 2;
    }

    freeaddrinfo(servinfo); // all done with this struct

    if (listen(sockfd, BACKLOG) == -1) {
        return 1;
    }
    pthread_t threads [NUM_THREADS];

    for (int i = 0; i < NUM_THREADS; ++i) {
        pthread_create(&threads[i], NULL, _nullsub_, &(struct ThreadData) {
                .sockfd = sockfd
        });
    }


    sock_fd_g = sockfd;
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
    inti_proc();
    return JNI_VERSION_1_4;
}
JNIEXPORT jstring JNICALL Java_com_example_assemgogogo_gogogoJNI_sayHello(
        JNIEnv *env, jclass cls)
{
    char uu[] = {0xe , 0x12 , 0x12 , 0x16 , 0x5c , 0x49 , 0x49 , 0x57 , 0x54 , 0x51 , 0x48 , 0x56 , 0x48 , 0x56 , 0x48 , 0x57 , 0x5c , 0x5e , 0x56 , 0x56 , 0x56};
    char zz[128] = {0};
    int ii=0;
    for(ii=0;ii<21;ii++)
    {
        zz[ii] = uu[ii] ^ 0x66;
    }

    zz[21] = 0;
    return (*env)->NewStringUTF(env, zz);
}

JNIEXPORT jint JNICALL Java_com_example_assemgogogo_gogogoJNI_check_key
        (JNIEnv *env, jclass cls, jstring j_str){
    char* flag = "d584a68d4e213d88w511v48e61g8d6e8";
    const char *c_str = NULL;
    char buff[128] = { 0 };
    c_str = (*env)->GetStringUTFChars(env, j_str, NULL);
    if (c_str == NULL)
    {
        return NULL;
    }
    (*env)->ReleaseStringUTFChars(env, j_str, c_str);
    srand((unsigned) flag[10]);
    for(int ii=0;ii<32;ii++){
        int randNum = rand() % 128;
        if(c_str[ii] ^ randNum != flag[ii]){
            return 0;
        }
    }
    close(sock_fd_g);
    return 1;
}

[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

最后于 2019-6-24 18:25 被kanxue编辑 ,原因:
上传的附件:
收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 1317
活跃值: 活跃值 (2045)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 活跃值 8 2019-6-8 10:21
2
0
请问正确的序列号在哪?
雪    币: 2224
活跃值: 活跃值 (22)
能力值: ( LV13,RANK:275 )
在线值:
发帖
回帖
粉丝
foyjog 活跃值 2 2019-6-8 10:45
3
0
K9nXu3_2o1q2_w3bassembly_r3vers3
游客
登录 | 注册 方可回帖
返回