CISCN 2020 线上初赛 z3 WP

IDA打开后核心代码如下:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [rsp+20h] [rbp-60h]
  int v5; // [rsp+24h] [rbp-5Ch]
  int v6; // [rsp+28h] [rbp-58h]
  int v7; // [rsp+2Ch] [rbp-54h]
  int v8; // [rsp+30h] [rbp-50h]
  int v9; // [rsp+34h] [rbp-4Ch]
  int v10; // [rsp+38h] [rbp-48h]
  int v11; // [rsp+3Ch] [rbp-44h]
  int v12; // [rsp+40h] [rbp-40h]
  int v13; // [rsp+44h] [rbp-3Ch]
  int v14; // [rsp+48h] [rbp-38h]
  int v15; // [rsp+4Ch] [rbp-34h]
  int v16; // [rsp+50h] [rbp-30h]
  int v17; // [rsp+54h] [rbp-2Ch]
  int v18; // [rsp+58h] [rbp-28h]
  int v19; // [rsp+5Ch] [rbp-24h]
  int v20; // [rsp+60h] [rbp-20h]
  int v21; // [rsp+64h] [rbp-1Ch]
  int v22; // [rsp+68h] [rbp-18h]
  int v23; // [rsp+6Ch] [rbp-14h]
  int v24; // [rsp+70h] [rbp-10h]
  int v25; // [rsp+74h] [rbp-Ch]
  int v26; // [rsp+78h] [rbp-8h]
  int v27; // [rsp+7Ch] [rbp-4h]
  int v28; // [rsp+80h] [rbp+0h]
  int v29; // [rsp+84h] [rbp+4h]
  int v30; // [rsp+88h] [rbp+8h]
  int v31; // [rsp+8Ch] [rbp+Ch]
  int v32; // [rsp+90h] [rbp+10h]
  int v33; // [rsp+94h] [rbp+14h]
  int v34; // [rsp+98h] [rbp+18h]
  int v35; // [rsp+9Ch] [rbp+1Ch]
  int v36; // [rsp+A0h] [rbp+20h]
  int v37; // [rsp+A4h] [rbp+24h]
  int v38; // [rsp+A8h] [rbp+28h]
  int v39; // [rsp+ACh] [rbp+2Ch]
  int v40; // [rsp+B0h] [rbp+30h]
  int v41; // [rsp+B4h] [rbp+34h]
  int v42; // [rsp+B8h] [rbp+38h]
  int v43; // [rsp+BCh] [rbp+3Ch]
  int v44; // [rsp+C0h] [rbp+40h]
  int v45; // [rsp+C4h] [rbp+44h]
  unsigned __int8 v46; // [rsp+D0h] [rbp+50h]
  unsigned __int8 v47; // [rsp+D1h] [rbp+51h]
  unsigned __int8 v48; // [rsp+D2h] [rbp+52h]
  unsigned __int8 v49; // [rsp+D3h] [rbp+53h]
  unsigned __int8 v50; // [rsp+D4h] [rbp+54h]
  unsigned __int8 v51; // [rsp+D5h] [rbp+55h]
  unsigned __int8 v52; // [rsp+D6h] [rbp+56h]
  unsigned __int8 v53; // [rsp+D7h] [rbp+57h]
  unsigned __int8 v54; // [rsp+D8h] [rbp+58h]
  unsigned __int8 v55; // [rsp+D9h] [rbp+59h]
  unsigned __int8 v56; // [rsp+DAh] [rbp+5Ah]
  unsigned __int8 v57; // [rsp+DBh] [rbp+5Bh]
  unsigned __int8 v58; // [rsp+DCh] [rbp+5Ch]
  unsigned __int8 v59; // [rsp+DDh] [rbp+5Dh]
  unsigned __int8 v60; // [rsp+DEh] [rbp+5Eh]
  unsigned __int8 v61; // [rsp+DFh] [rbp+5Fh]
  unsigned __int8 v62; // [rsp+E0h] [rbp+60h]
  unsigned __int8 v63; // [rsp+E1h] [rbp+61h]
  unsigned __int8 v64; // [rsp+E2h] [rbp+62h]
  unsigned __int8 v65; // [rsp+E3h] [rbp+63h]
  unsigned __int8 v66; // [rsp+E4h] [rbp+64h]
  unsigned __int8 v67; // [rsp+E5h] [rbp+65h]
  unsigned __int8 v68; // [rsp+E6h] [rbp+66h]
  unsigned __int8 v69; // [rsp+E7h] [rbp+67h]
  unsigned __int8 v70; // [rsp+E8h] [rbp+68h]
  unsigned __int8 v71; // [rsp+E9h] [rbp+69h]
  unsigned __int8 v72; // [rsp+EAh] [rbp+6Ah]
  unsigned __int8 v73; // [rsp+EBh] [rbp+6Bh]
  unsigned __int8 v74; // [rsp+ECh] [rbp+6Ch]
  unsigned __int8 v75; // [rsp+EDh] [rbp+6Dh]
  unsigned __int8 v76; // [rsp+EEh] [rbp+6Eh]
  unsigned __int8 v77; // [rsp+EFh] [rbp+6Fh]
  unsigned __int8 v78; // [rsp+F0h] [rbp+70h]
  unsigned __int8 v79; // [rsp+F1h] [rbp+71h]
  unsigned __int8 v80; // [rsp+F2h] [rbp+72h]
  unsigned __int8 v81; // [rsp+F3h] [rbp+73h]
  unsigned __int8 v82; // [rsp+F4h] [rbp+74h]
  unsigned __int8 v83; // [rsp+F5h] [rbp+75h]
  unsigned __int8 v84; // [rsp+F6h] [rbp+76h]
  unsigned __int8 v85; // [rsp+F7h] [rbp+77h]
  unsigned __int8 v86; // [rsp+F8h] [rbp+78h]
  unsigned __int8 v87; // [rsp+F9h] [rbp+79h]
  int Dst[43]; // [rsp+110h] [rbp+90h]
  int i; // [rsp+1BCh] [rbp+13Ch]

  _main(*(_QWORD *)&argc, argv, envp);
  memcpy(Dst, &unk_404020, 0xA8ui64);
  printf("plz input your flag:");
  scanf("%42s", &v46);
  v4 = 34 * v49 + 12 * v46 + 53 * v47 + 6 * v48 + 58 * v50 + 36 * v51 + v52;
  v5 = 27 * v50 + 73 * v49 + 12 * v48 + 83 * v46 + 85 * v47 + 96 * v51 + 52 * v52;
  v6 = 24 * v48 + 78 * v46 + 53 * v47 + 36 * v49 + 86 * v50 + 25 * v51 + 46 * v52;
  v7 = 78 * v47 + 39 * v46 + 52 * v48 + 9 * v49 + 62 * v50 + 37 * v51 + 84 * v52;
  v8 = 48 * v50 + 14 * v48 + 23 * v46 + 6 * v47 + 74 * v49 + 12 * v51 + 83 * v52;
  v9 = 15 * v51 + 48 * v50 + 92 * v48 + 85 * v47 + 27 * v46 + 42 * v49 + 72 * v52;
  v10 = 26 * v51 + 67 * v49 + 6 * v47 + 4 * v46 + 3 * v48 + 68 * v52;
  v11 = 34 * v56 + 12 * v53 + 53 * v54 + 6 * v55 + 58 * v57 + 36 * v58 + v59;
  v12 = 27 * v57 + 73 * v56 + 12 * v55 + 83 * v53 + 85 * v54 + 96 * v58 + 52 * v59;
  v13 = 24 * v55 + 78 * v53 + 53 * v54 + 36 * v56 + 86 * v57 + 25 * v58 + 46 * v59;
  v14 = 78 * v54 + 39 * v53 + 52 * v55 + 9 * v56 + 62 * v57 + 37 * v58 + 84 * v59;
  v15 = 48 * v57 + 14 * v55 + 23 * v53 + 6 * v54 + 74 * v56 + 12 * v58 + 83 * v59;
  v16 = 15 * v58 + 48 * v57 + 92 * v55 + 85 * v54 + 27 * v53 + 42 * v56 + 72 * v59;
  v17 = 26 * v58 + 67 * v56 + 6 * v54 + 4 * v53 + 3 * v55 + 68 * v59;
  v18 = 34 * v63 + 12 * v60 + 53 * v61 + 6 * v62 + 58 * v64 + 36 * v65 + v66;
  v19 = 27 * v64 + 73 * v63 + 12 * v62 + 83 * v60 + 85 * v61 + 96 * v65 + 52 * v66;
  v20 = 24 * v62 + 78 * v60 + 53 * v61 + 36 * v63 + 86 * v64 + 25 * v65 + 46 * v66;
  v21 = 78 * v61 + 39 * v60 + 52 * v62 + 9 * v63 + 62 * v64 + 37 * v65 + 84 * v66;
  v22 = 48 * v64 + 14 * v62 + 23 * v60 + 6 * v61 + 74 * v63 + 12 * v65 + 83 * v66;
  v23 = 15 * v65 + 48 * v64 + 92 * v62 + 85 * v61 + 27 * v60 + 42 * v63 + 72 * v66;
  v24 = 26 * v65 + 67 * v63 + 6 * v61 + 4 * v60 + 3 * v62 + 68 * v66;
  v25 = 34 * v70 + 12 * v67 + 53 * v68 + 6 * v69 + 58 * v71 + 36 * v72 + v73;
  v26 = 27 * v71 + 73 * v70 + 12 * v69 + 83 * v67 + 85 * v68 + 96 * v72 + 52 * v73;
  v27 = 24 * v69 + 78 * v67 + 53 * v68 + 36 * v70 + 86 * v71 + 25 * v72 + 46 * v73;
  v28 = 78 * v68 + 39 * v67 + 52 * v69 + 9 * v70 + 62 * v71 + 37 * v72 + 84 * v73;
  v29 = 48 * v71 + 14 * v69 + 23 * v67 + 6 * v68 + 74 * v70 + 12 * v72 + 83 * v73;
  v30 = 15 * v72 + 48 * v71 + 92 * v69 + 85 * v68 + 27 * v67 + 42 * v70 + 72 * v73;
  v31 = 26 * v72 + 67 * v70 + 6 * v68 + 4 * v67 + 3 * v69 + 68 * v73;
  v32 = 34 * v77 + 12 * v74 + 53 * v75 + 6 * v76 + 58 * v78 + 36 * v79 + v80;
  v33 = 27 * v78 + 73 * v77 + 12 * v76 + 83 * v74 + 85 * v75 + 96 * v79 + 52 * v80;
  v34 = 24 * v76 + 78 * v74 + 53 * v75 + 36 * v77 + 86 * v78 + 25 * v79 + 46 * v80;
  v35 = 78 * v75 + 39 * v74 + 52 * v76 + 9 * v77 + 62 * v78 + 37 * v79 + 84 * v80;
  v36 = 48 * v78 + 14 * v76 + 23 * v74 + 6 * v75 + 74 * v77 + 12 * v79 + 83 * v80;
  v37 = 15 * v79 + 48 * v78 + 92 * v76 + 85 * v75 + 27 * v74 + 42 * v77 + 72 * v80;
  v38 = 26 * v79 + 67 * v77 + 6 * v75 + 4 * v74 + 3 * v76 + 68 * v80;
  v39 = 34 * v84 + 12 * v81 + 53 * v82 + 6 * v83 + 58 * v85 + 36 * v86 + v87;
  v40 = 27 * v85 + 73 * v84 + 12 * v83 + 83 * v81 + 85 * v82 + 96 * v86 + 52 * v87;
  v41 = 24 * v83 + 78 * v81 + 53 * v82 + 36 * v84 + 86 * v85 + 25 * v86 + 46 * v87;
  v42 = 78 * v82 + 39 * v81 + 52 * v83 + 9 * v84 + 62 * v85 + 37 * v86 + 84 * v87;
  v43 = 48 * v85 + 14 * v83 + 23 * v81 + 6 * v82 + 74 * v84 + 12 * v86 + 83 * v87;
  v44 = 15 * v86 + 48 * v85 + 92 * v83 + 85 * v82 + 27 * v81 + 42 * v84 + 72 * v87;
  v45 = 26 * v86 + 67 * v84 + 6 * v82 + 4 * v81 + 3 * v83 + 68 * v87;
  for ( i = 0; i <= 41; ++i )
  {
    if ( *(&v4 + i) != Dst[i] )
    {
      printf("error");
      exit(0);
    }
  }
  printf("win");
  return 0;
}

看着十分凌乱,我们整理一下代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int cyphered[42]; // [rsp+20h] [rbp-60h]
  char input_str[42]; // [rsp+D0h] [rbp+50h]
  int Dst[43]; // [rsp+110h] [rbp+90h]
  int i; // [rsp+1BCh] [rbp+13Ch]

  _main(*(_QWORD *)&argc, argv, envp);
  memcpy(Dst, &unk_404020, 0xA8ui64);
  printf("plz input your flag:");
  scanf("%42s", input_str);
  cyphered[0] = 34 * (unsigned __int8)input_str[3]
              + 12 * (unsigned __int8)input_str[0]
              + 53 * (unsigned __int8)input_str[1]
              + 6 * (unsigned __int8)input_str[2]
              + 58 * (unsigned __int8)input_str[4]
              + 36 * (unsigned __int8)input_str[5]
              + (unsigned __int8)input_str[6];
  cyphered[1] = 27 * (unsigned __int8)input_str[4]
              + 73 * (unsigned __int8)input_str[3]
              + 12 * (unsigned __int8)input_str[2]
              + 83 * (unsigned __int8)input_str[0]
              + 85 * (unsigned __int8)input_str[1]
              + 96 * (unsigned __int8)input_str[5]
              + 52 * (unsigned __int8)input_str[6];
  cyphered[2] = 24 * (unsigned __int8)input_str[2]
              + 78 * (unsigned __int8)input_str[0]
              + 53 * (unsigned __int8)input_str[1]
              + 36 * (unsigned __int8)input_str[3]
              + 86 * (unsigned __int8)input_str[4]
              + 25 * (unsigned __int8)input_str[5]
              + 46 * (unsigned __int8)input_str[6];
  cyphered[3] = 78 * (unsigned __int8)input_str[1]
              + 39 * (unsigned __int8)input_str[0]
              + 52 * (unsigned __int8)input_str[2]
              + 9 * (unsigned __int8)input_str[3]
              + 62 * (unsigned __int8)input_str[4]
              + 37 * (unsigned __int8)input_str[5]
              + 84 * (unsigned __int8)input_str[6];
  cyphered[4] = 48 * (unsigned __int8)input_str[4]
              + 14 * (unsigned __int8)input_str[2]
              + 23 * (unsigned __int8)input_str[0]
              + 6 * (unsigned __int8)input_str[1]
              + 74 * (unsigned __int8)input_str[3]
              + 12 * (unsigned __int8)input_str[5]
              + 83 * (unsigned __int8)input_str[6];
  cyphered[5] = 15 * (unsigned __int8)input_str[5]
              + 48 * (unsigned __int8)input_str[4]
              + 92 * (unsigned __int8)input_str[2]
              + 85 * (unsigned __int8)input_str[1]
              + 27 * (unsigned __int8)input_str[0]
              + 42 * (unsigned __int8)input_str[3]
              + 72 * (unsigned __int8)input_str[6];
  cyphered[6] = 26 * (unsigned __int8)input_str[5]
              + 67 * (unsigned __int8)input_str[3]
              + 6 * (unsigned __int8)input_str[1]
              + 4 * (unsigned __int8)input_str[0]
              + 3 * (unsigned __int8)input_str[2]
              + 68 * (unsigned __int8)input_str[6];
  cyphered[7] = 34 * (unsigned __int8)input_str[10]
              + 12 * (unsigned __int8)input_str[7]
              + 53 * (unsigned __int8)input_str[8]
              + 6 * (unsigned __int8)input_str[9]
              + 58 * (unsigned __int8)input_str[11]
              + 36 * (unsigned __int8)input_str[12]
              + (unsigned __int8)input_str[13];
  cyphered[8] = 27 * (unsigned __int8)input_str[11]
              + 73 * (unsigned __int8)input_str[10]
              + 12 * (unsigned __int8)input_str[9]
              + 83 * (unsigned __int8)input_str[7]
              + 85 * (unsigned __int8)input_str[8]
              + 96 * (unsigned __int8)input_str[12]
              + 52 * (unsigned __int8)input_str[13];
  cyphered[9] = 24 * (unsigned __int8)input_str[9]
              + 78 * (unsigned __int8)input_str[7]
              + 53 * (unsigned __int8)input_str[8]
              + 36 * (unsigned __int8)input_str[10]
              + 86 * (unsigned __int8)input_str[11]
              + 25 * (unsigned __int8)input_str[12]
              + 46 * (unsigned __int8)input_str[13];
  cyphered[10] = 78 * (unsigned __int8)input_str[8]
               + 39 * (unsigned __int8)input_str[7]
               + 52 * (unsigned __int8)input_str[9]
               + 9 * (unsigned __int8)input_str[10]
               + 62 * (unsigned __int8)input_str[11]
               + 37 * (unsigned __int8)input_str[12]
               + 84 * (unsigned __int8)input_str[13];
  cyphered[11] = 48 * (unsigned __int8)input_str[11]
               + 14 * (unsigned __int8)input_str[9]
               + 23 * (unsigned __int8)input_str[7]
               + 6 * (unsigned __int8)input_str[8]
               + 74 * (unsigned __int8)input_str[10]
               + 12 * (unsigned __int8)input_str[12]
               + 83 * (unsigned __int8)input_str[13];
  cyphered[12] = 15 * (unsigned __int8)input_str[12]
               + 48 * (unsigned __int8)input_str[11]
               + 92 * (unsigned __int8)input_str[9]
               + 85 * (unsigned __int8)input_str[8]
               + 27 * (unsigned __int8)input_str[7]
               + 42 * (unsigned __int8)input_str[10]
               + 72 * (unsigned __int8)input_str[13];
  cyphered[13] = 26 * (unsigned __int8)input_str[12]
               + 67 * (unsigned __int8)input_str[10]
               + 6 * (unsigned __int8)input_str[8]
               + 4 * (unsigned __int8)input_str[7]
               + 3 * (unsigned __int8)input_str[9]
               + 68 * (unsigned __int8)input_str[13];
  cyphered[14] = 34 * (unsigned __int8)input_str[17]
               + 12 * (unsigned __int8)input_str[14]
               + 53 * (unsigned __int8)input_str[15]
               + 6 * (unsigned __int8)input_str[16]
               + 58 * (unsigned __int8)input_str[18]
               + 36 * (unsigned __int8)input_str[19]
               + (unsigned __int8)input_str[20];
  cyphered[15] = 27 * (unsigned __int8)input_str[18]
               + 73 * (unsigned __int8)input_str[17]
               + 12 * (unsigned __int8)input_str[16]
               + 83 * (unsigned __int8)input_str[14]
               + 85 * (unsigned __int8)input_str[15]
               + 96 * (unsigned __int8)input_str[19]
               + 52 * (unsigned __int8)input_str[20];
  cyphered[16] = 24 * (unsigned __int8)input_str[16]
               + 78 * (unsigned __int8)input_str[14]
               + 53 * (unsigned __int8)input_str[15]
               + 36 * (unsigned __int8)input_str[17]
               + 86 * (unsigned __int8)input_str[18]
               + 25 * (unsigned __int8)input_str[19]
               + 46 * (unsigned __int8)input_str[20];
  cyphered[17] = 78 * (unsigned __int8)input_str[15]
               + 39 * (unsigned __int8)input_str[14]
               + 52 * (unsigned __int8)input_str[16]
               + 9 * (unsigned __int8)input_str[17]
               + 62 * (unsigned __int8)input_str[18]
               + 37 * (unsigned __int8)input_str[19]
               + 84 * (unsigned __int8)input_str[20];
  cyphered[18] = 48 * (unsigned __int8)input_str[18]
               + 14 * (unsigned __int8)input_str[16]
               + 23 * (unsigned __int8)input_str[14]
               + 6 * (unsigned __int8)input_str[15]
               + 74 * (unsigned __int8)input_str[17]
               + 12 * (unsigned __int8)input_str[19]
               + 83 * (unsigned __int8)input_str[20];
  cyphered[19] = 15 * (unsigned __int8)input_str[19]
               + 48 * (unsigned __int8)input_str[18]
               + 92 * (unsigned __int8)input_str[16]
               + 85 * (unsigned __int8)input_str[15]
               + 27 * (unsigned __int8)input_str[14]
               + 42 * (unsigned __int8)input_str[17]
               + 72 * (unsigned __int8)input_str[20];
  cyphered[20] = 26 * (unsigned __int8)input_str[19]
               + 67 * (unsigned __int8)input_str[17]
               + 6 * (unsigned __int8)input_str[15]
               + 4 * (unsigned __int8)input_str[14]
               + 3 * (unsigned __int8)input_str[16]
               + 68 * (unsigned __int8)input_str[20];
  cyphered[21] = 34 * (unsigned __int8)input_str[24]
               + 12 * (unsigned __int8)input_str[21]
               + 53 * (unsigned __int8)input_str[22]
               + 6 * (unsigned __int8)input_str[23]
               + 58 * (unsigned __int8)input_str[25]
               + 36 * (unsigned __int8)input_str[26]
               + (unsigned __int8)input_str[27];
  cyphered[22] = 27 * (unsigned __int8)input_str[25]
               + 73 * (unsigned __int8)input_str[24]
               + 12 * (unsigned __int8)input_str[23]
               + 83 * (unsigned __int8)input_str[21]
               + 85 * (unsigned __int8)input_str[22]
               + 96 * (unsigned __int8)input_str[26]
               + 52 * (unsigned __int8)input_str[27];
  cyphered[23] = 24 * (unsigned __int8)input_str[23]
               + 78 * (unsigned __int8)input_str[21]
               + 53 * (unsigned __int8)input_str[22]
               + 36 * (unsigned __int8)input_str[24]
               + 86 * (unsigned __int8)input_str[25]
               + 25 * (unsigned __int8)input_str[26]
               + 46 * (unsigned __int8)input_str[27];
  cyphered[24] = 78 * (unsigned __int8)input_str[22]
               + 39 * (unsigned __int8)input_str[21]
               + 52 * (unsigned __int8)input_str[23]
               + 9 * (unsigned __int8)input_str[24]
               + 62 * (unsigned __int8)input_str[25]
               + 37 * (unsigned __int8)input_str[26]
               + 84 * (unsigned __int8)input_str[27];
  cyphered[25] = 48 * (unsigned __int8)input_str[25]
               + 14 * (unsigned __int8)input_str[23]
               + 23 * (unsigned __int8)input_str[21]
               + 6 * (unsigned __int8)input_str[22]
               + 74 * (unsigned __int8)input_str[24]
               + 12 * (unsigned __int8)input_str[26]
               + 83 * (unsigned __int8)input_str[27];
  cyphered[26] = 15 * (unsigned __int8)input_str[26]
               + 48 * (unsigned __int8)input_str[25]
               + 92 * (unsigned __int8)input_str[23]
               + 85 * (unsigned __int8)input_str[22]
               + 27 * (unsigned __int8)input_str[21]
               + 42 * (unsigned __int8)input_str[24]
               + 72 * (unsigned __int8)input_str[27];
  cyphered[27] = 26 * (unsigned __int8)input_str[26]
               + 67 * (unsigned __int8)input_str[24]
               + 6 * (unsigned __int8)input_str[22]
               + 4 * (unsigned __int8)input_str[21]
               + 3 * (unsigned __int8)input_str[23]
               + 68 * (unsigned __int8)input_str[27];
  cyphered[28] = 34 * (unsigned __int8)input_str[31]
               + 12 * (unsigned __int8)input_str[28]
               + 53 * (unsigned __int8)input_str[29]
               + 6 * (unsigned __int8)input_str[30]
               + 58 * (unsigned __int8)input_str[32]
               + 36 * (unsigned __int8)input_str[33]
               + (unsigned __int8)input_str[34];
  cyphered[29] = 27 * (unsigned __int8)input_str[32]
               + 73 * (unsigned __int8)input_str[31]
               + 12 * (unsigned __int8)input_str[30]
               + 83 * (unsigned __int8)input_str[28]
               + 85 * (unsigned __int8)input_str[29]
               + 96 * (unsigned __int8)input_str[33]
               + 52 * (unsigned __int8)input_str[34];
  cyphered[30] = 24 * (unsigned __int8)input_str[30]
               + 78 * (unsigned __int8)input_str[28]
               + 53 * (unsigned __int8)input_str[29]
               + 36 * (unsigned __int8)input_str[31]
               + 86 * (unsigned __int8)input_str[32]
               + 25 * (unsigned __int8)input_str[33]
               + 46 * (unsigned __int8)input_str[34];
  cyphered[31] = 78 * (unsigned __int8)input_str[29]
               + 39 * (unsigned __int8)input_str[28]
               + 52 * (unsigned __int8)input_str[30]
               + 9 * (unsigned __int8)input_str[31]
               + 62 * (unsigned __int8)input_str[32]
               + 37 * (unsigned __int8)input_str[33]
               + 84 * (unsigned __int8)input_str[34];
  cyphered[32] = 48 * (unsigned __int8)input_str[32]
               + 14 * (unsigned __int8)input_str[30]
               + 23 * (unsigned __int8)input_str[28]
               + 6 * (unsigned __int8)input_str[29]
               + 74 * (unsigned __int8)input_str[31]
               + 12 * (unsigned __int8)input_str[33]
               + 83 * (unsigned __int8)input_str[34];
  cyphered[33] = 15 * (unsigned __int8)input_str[33]
               + 48 * (unsigned __int8)input_str[32]
               + 92 * (unsigned __int8)input_str[30]
               + 85 * (unsigned __int8)input_str[29]
               + 27 * (unsigned __int8)input_str[28]
               + 42 * (unsigned __int8)input_str[31]
               + 72 * (unsigned __int8)input_str[34];
  cyphered[34] = 26 * (unsigned __int8)input_str[33]
               + 67 * (unsigned __int8)input_str[31]
               + 6 * (unsigned __int8)input_str[29]
               + 4 * (unsigned __int8)input_str[28]
               + 3 * (unsigned __int8)input_str[30]
               + 68 * (unsigned __int8)input_str[34];
  cyphered[35] = 34 * (unsigned __int8)input_str[38]
               + 12 * (unsigned __int8)input_str[35]
               + 53 * (unsigned __int8)input_str[36]
               + 6 * (unsigned __int8)input_str[37]
               + 58 * (unsigned __int8)input_str[39]
               + 36 * (unsigned __int8)input_str[40]
               + (unsigned __int8)input_str[41];
  cyphered[36] = 27 * (unsigned __int8)input_str[39]
               + 73 * (unsigned __int8)input_str[38]
               + 12 * (unsigned __int8)input_str[37]
               + 83 * (unsigned __int8)input_str[35]
               + 85 * (unsigned __int8)input_str[36]
               + 96 * (unsigned __int8)input_str[40]
               + 52 * (unsigned __int8)input_str[41];
  cyphered[37] = 24 * (unsigned __int8)input_str[37]
               + 78 * (unsigned __int8)input_str[35]
               + 53 * (unsigned __int8)input_str[36]
               + 36 * (unsigned __int8)input_str[38]
               + 86 * (unsigned __int8)input_str[39]
               + 25 * (unsigned __int8)input_str[40]
               + 46 * (unsigned __int8)input_str[41];
  cyphered[38] = 78 * (unsigned __int8)input_str[36]
               + 39 * (unsigned __int8)input_str[35]
               + 52 * (unsigned __int8)input_str[37]
               + 9 * (unsigned __int8)input_str[38]
               + 62 * (unsigned __int8)input_str[39]
               + 37 * (unsigned __int8)input_str[40]
               + 84 * (unsigned __int8)input_str[41];
  cyphered[39] = 48 * (unsigned __int8)input_str[39]
               + 14 * (unsigned __int8)input_str[37]
               + 23 * (unsigned __int8)input_str[35]
               + 6 * (unsigned __int8)input_str[36]
               + 74 * (unsigned __int8)input_str[38]
               + 12 * (unsigned __int8)input_str[40]
               + 83 * (unsigned __int8)input_str[41];
  cyphered[40] = 15 * (unsigned __int8)input_str[40]
               + 48 * (unsigned __int8)input_str[39]
               + 92 * (unsigned __int8)input_str[37]
               + 85 * (unsigned __int8)input_str[36]
               + 27 * (unsigned __int8)input_str[35]
               + 42 * (unsigned __int8)input_str[38]
               + 72 * (unsigned __int8)input_str[41];
  cyphered[41] = 26 * (unsigned __int8)input_str[40]
               + 67 * (unsigned __int8)input_str[38]
               + 6 * (unsigned __int8)input_str[36]
               + 4 * (unsigned __int8)input_str[35]
               + 3 * (unsigned __int8)input_str[37]
               + 68 * (unsigned __int8)input_str[41];
  for ( i = 0; i <= 41; ++i )
  {
    if ( cyphered[i] != Dst[i] )
    {
      printf("error");
      exit(0);
    }
  }
  printf("win");
  return 0;
}

我们可以看出是7位一组进行加密,而且是使用了线性方程组的形式,解该线性方程组即可进行解密。

在这里插入图片描述

重复6次即可得到flag

102 108 97 103 123 55 101 49 55 49 100 52 51 45 54 51 98 57 45 52 101 49 56 45 57 57 48 101 45 54 101 49 52 99 50 97 102 101 54 52 56 125
flag{7e171d43-63b9-4e18-990e-6e14c2afe648}

我感觉应该有更快的方法。。比赛时几乎直接就秒了。。

要是有师傅有更优解可以给个提示。。感激不尽


2020.8.23更新

评论区有师傅提示,刚好看书也提到了约束求解的概念
用z3求解器再做一次

from z3 import *



Sol = Solver()
# 初始化变量
v4=IntVector('v4', 42)
v4=[20247,40182,36315,36518,26921,39185,16546
    ,12094,25270,19330,18540,16386,21207,11759
    ,10460,25613,21135,24891,18305,27415,12855
    ,10899,24927,20670,22926,18006,23345,12602
    ,12304,26622,19807,22747,14233,24736,10064
    ,14169,35155,28962,33273,21796,35185,14877]
input_str=IntVector("input_str",42)

# 添加限制
Sol.add(v4[0] == 34 * input_str[3] + 12 * input_str[0] + 53 * input_str[1] + 6 * input_str[2] + 58 * input_str[4] + 36 * input_str[5] + input_str[6])
Sol.add(v4[1] == 27 * input_str[4] + 73 * input_str[3] + 12 * input_str[2] + 83 * input_str[0] + 85 * input_str[1] + 96 * input_str[5] + 52 * input_str[6])
Sol.add(v4[2] == 24 * input_str[2] + 78 * input_str[0] + 53 * input_str[1] + 36 * input_str[3] + 86 * input_str[4] + 25 * input_str[5] + 46 * input_str[6])
Sol.add(v4[3] == 78 * input_str[1] + 39 * input_str[0] + 52 * input_str[2] + 9 * input_str[3] + 62 * input_str[4] + 37 * input_str[5] + 84 * input_str[6])
Sol.add(v4[4] == 48 * input_str[4] + 14 * input_str[2] + 23 * input_str[0] + 6 * input_str[1] + 74 * input_str[3] + 12 * input_str[5] + 83 * input_str[6])
Sol.add(v4[5] == 15 * input_str[5] + 48 * input_str[4] + 92 * input_str[2] + 85 * input_str[1] + 27 * input_str[0] + 42 * input_str[3] + 72 * input_str[6])
Sol.add(v4[6] == 26 * input_str[5] + 67 * input_str[3] + 6 * input_str[1] + 4 * input_str[0] + 3 * input_str[2] + 68 * input_str[6])
Sol.add(v4[7] == 34 * input_str[10] + 12 * input_str[7] + 53 * input_str[8] + 6 * input_str[9] + 58 * input_str[11] + 36 * input_str[12] + input_str[13])
Sol.add(v4[8] == 27 * input_str[11] + 73 * input_str[10] + 12 * input_str[9] + 83 * input_str[7] + 85 * input_str[8] + 96 * input_str[12] + 52 * input_str[13])
Sol.add(v4[9] == 24 * input_str[9] + 78 * input_str[7] + 53 * input_str[8] + 36 * input_str[10] + 86 * input_str[11] + 25 * input_str[12] + 46 * input_str[13])
Sol.add(v4[10] == 78 * input_str[8] + 39 * input_str[7] + 52 * input_str[9] + 9 * input_str[10] + 62 * input_str[11] + 37 * input_str[12] + 84 * input_str[13])
Sol.add(v4[11] == 48 * input_str[11] + 14 * input_str[9] + 23 * input_str[7] + 6 * input_str[8] + 74 * input_str[10] + 12 * input_str[12] + 83 * input_str[13])
Sol.add(v4[12] == 15 * input_str[12] + 48 * input_str[11] + 92 * input_str[9] + 85 * input_str[8] + 27 * input_str[7] + 42 * input_str[10] + 72 * input_str[13])
Sol.add(v4[13] == 26 * input_str[12] + 67 * input_str[10] + 6 * input_str[8] + 4 * input_str[7] + 3 * input_str[9] + 68 * input_str[13])
Sol.add(v4[14] == 34 * input_str[17] + 12 * input_str[14] + 53 * input_str[15] + 6 * input_str[16] + 58 * input_str[18] + 36 * input_str[19] + input_str[20])
Sol.add(v4[15] == 27 * input_str[18] + 73 * input_str[17] + 12 * input_str[16] + 83 * input_str[14] + 85 * input_str[15] + 96 * input_str[19] + 52 * input_str[20])
Sol.add(v4[16] == 24 * input_str[16] + 78 * input_str[14] + 53 * input_str[15] + 36 * input_str[17] + 86 * input_str[18] + 25 * input_str[19] + 46 * input_str[20])
Sol.add(v4[17] == 78 * input_str[15] + 39 * input_str[14] + 52 * input_str[16] + 9 * input_str[17] + 62 * input_str[18] + 37 * input_str[19] + 84 * input_str[20])
Sol.add(v4[18] == 48 * input_str[18] + 14 * input_str[16] + 23 * input_str[14] + 6 * input_str[15] + 74 * input_str[17] + 12 * input_str[19] + 83 * input_str[20])
Sol.add(v4[19] == 15 * input_str[19] + 48 * input_str[18] + 92 * input_str[16] + 85 * input_str[15] + 27 * input_str[14] + 42 * input_str[17] + 72 * input_str[20])
Sol.add(v4[20] == 26 * input_str[19] + 67 * input_str[17] + 6 * input_str[15] + 4 * input_str[14] + 3 * input_str[16] + 68 * input_str[20])
Sol.add(v4[21] == 34 * input_str[24] + 12 * input_str[21] + 53 * input_str[22] + 6 * input_str[23] + 58 * input_str[25] + 36 * input_str[26] + input_str[27])
Sol.add(v4[22] == 27 * input_str[25] + 73 * input_str[24] + 12 * input_str[23] + 83 * input_str[21] + 85 * input_str[22] + 96 * input_str[26] + 52 * input_str[27])
Sol.add(v4[23] == 24 * input_str[23] + 78 * input_str[21] + 53 * input_str[22] + 36 * input_str[24] + 86 * input_str[25] + 25 * input_str[26] + 46 * input_str[27])
Sol.add(v4[24] == 78 * input_str[22] + 39 * input_str[21] + 52 * input_str[23] + 9 * input_str[24] + 62 * input_str[25] + 37 * input_str[26] + 84 * input_str[27])
Sol.add(v4[25] == 48 * input_str[25] + 14 * input_str[23] + 23 * input_str[21] + 6 * input_str[22] + 74 * input_str[24] + 12 * input_str[26] + 83 * input_str[27])
Sol.add(v4[26] == 15 * input_str[26] + 48 * input_str[25] + 92 * input_str[23] + 85 * input_str[22] + 27 * input_str[21] + 42 * input_str[24] + 72 * input_str[27])
Sol.add(v4[27] == 26 * input_str[26] + 67 * input_str[24] + 6 * input_str[22] + 4 * input_str[21] + 3 * input_str[23] + 68 * input_str[27])
Sol.add(v4[28] == 34 * input_str[31] + 12 * input_str[28] + 53 * input_str[29] + 6 * input_str[30] + 58 * input_str[32] + 36 * input_str[33] + input_str[34])
Sol.add(v4[29] == 27 * input_str[32] + 73 * input_str[31] + 12 * input_str[30] + 83 * input_str[28] + 85 * input_str[29] + 96 * input_str[33] + 52 * input_str[34])
Sol.add(v4[30] == 24 * input_str[30] + 78 * input_str[28] + 53 * input_str[29] + 36 * input_str[31] + 86 * input_str[32] + 25 * input_str[33] + 46 * input_str[34])
Sol.add(v4[31] == 78 * input_str[29] + 39 * input_str[28] + 52 * input_str[30] + 9 * input_str[31] + 62 * input_str[32] + 37 * input_str[33] + 84 * input_str[34])
Sol.add(v4[32] == 48 * input_str[32] + 14 * input_str[30] + 23 * input_str[28] + 6 * input_str[29] + 74 * input_str[31] + 12 * input_str[33] + 83 * input_str[34])
Sol.add(v4[33] == 15 * input_str[33] + 48 * input_str[32] + 92 * input_str[30] + 85 * input_str[29] + 27 * input_str[28] + 42 * input_str[31] + 72 * input_str[34])
Sol.add(v4[34] == 26 * input_str[33] + 67 * input_str[31] + 6 * input_str[29] + 4 * input_str[28] + 3 * input_str[30] + 68 * input_str[34])
Sol.add(v4[35] == 34 * input_str[38] + 12 * input_str[35] + 53 * input_str[36] + 6 * input_str[37] + 58 * input_str[39] + 36 * input_str[40] + input_str[41])
Sol.add(v4[36] == 27 * input_str[39] + 73 * input_str[38] + 12 * input_str[37] + 83 * input_str[35] + 85 * input_str[36] + 96 * input_str[40] + 52 * input_str[41])
Sol.add(v4[37] == 24 * input_str[37] + 78 * input_str[35] + 53 * input_str[36] + 36 * input_str[38] + 86 * input_str[39] + 25 * input_str[40] + 46 * input_str[41])
Sol.add(v4[38] == 78 * input_str[36] + 39 * input_str[35] + 52 * input_str[37] + 9 * input_str[38] + 62 * input_str[39] + 37 * input_str[40] + 84 * input_str[41])
Sol.add(v4[39] == 48 * input_str[39] + 14 * input_str[37] + 23 * input_str[35] + 6 * input_str[36] + 74 * input_str[38] + 12 * input_str[40] + 83 * input_str[41])
Sol.add(v4[40] == 15 * input_str[40] + 48 * input_str[39] + 92 * input_str[37] + 85 * input_str[36] + 27 * input_str[35] + 42 * input_str[38] + 72 * input_str[41])
Sol.add(v4[41] == 26 * input_str[40] + 67 * input_str[38] + 6 * input_str[36] + 4 * input_str[35] + 3 * input_str[37] + 68 * input_str[41])


# 求解
print(Sol.check())
print(Sol.model())

m = Sol.model()

print("answer:")
[print(chr(int(str(m[i]))),end='') for i in input_str]

这个方便多了。 这应该也是比赛时师傅们求解的方法
按题目名称来看这应该也是预期解

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h1nt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值