Señal de la Copa Wangding 2020 (Grupo Qinglong)

vm_operad

int __cdecl vm_operad(int *a1, int a2)
{
    
    
  int result; // eax@2
  char v3[100]; // [sp+13h] [bp-E5h]@4
  char v4[100]; // [sp+77h] [bp-81h]@5
  char v5; // [sp+DBh] [bp-1Dh]@5
  int v6; // [sp+DCh] [bp-1Ch]@1
  int v7; // [sp+E0h] [bp-18h]@1
  int v8; // [sp+E4h] [bp-14h]@1
  int v9; // [sp+E8h] [bp-10h]@1
  int v10; // [sp+ECh] [bp-Ch]@1

  v10 = 0;
  v9 = 0;
  v8 = 0;
  v7 = 0;
  v6 = 0;
  while ( 1 )
  {
    
    
    result = v10;
    if ( v10 >= a2 )
      return result;
    switch ( a1[v10] )
    {
    
    
      case 10:
        read(v3);
        ++v10;
        break;
      case 1:
        v4[v7] = v5;
        ++v10;
        ++v7;
        ++v9;
        break;
      case 2:
        v5 = a1[v10 + 1] + v3[v9];
        v10 += 2;
        break;
      case 3:
        v5 = v3[v9] - LOBYTE(a1[v10 + 1]);
        v10 += 2;
        break;
      case 4:
        v5 = a1[v10 + 1] ^ v3[v9];
        v10 += 2;
        break;
      case 5:
        v5 = a1[v10 + 1] * v3[v9];
        v10 += 2;
        break;
      case 6:
        ++v10;
        break;
      case 7:
        if ( v4[v8] != a1[v10 + 1] )
        {
    
    
          printf("what a shame...");
          exit(0);
        }
        ++v8;
        v10 += 2;
        break;
      case 11:
        v5 = v3[v9] - 1;
        ++v10;
        break;
      case 12:
        v5 = v3[v9] + 1;
        ++v10;
        break;
      case 8:
        v3[v6] = v5;
        ++v10;
        ++v6;
        break;
      default:
        continue;
    }
  }
}

Función función

Utilice los datos del proceso (y los datos cifrados) guardados en la cadena del archivo y los datos de la consola para verificar la marca (los datos guardados en la cadena del archivo no solo juegan el papel del proceso sino también el cifrado)

leer

size_t __cdecl read(char *a1)
{
    
    
  size_t result; // eax@1

  printf("string:");
  scanf("%s", a1);
  result = strlen(a1);
  if ( result != 15 )
  {
    
    
    puts("WRONG!\n");
    exit(0);
  }
  return result;
}

Función función

Esta función de lectura se usa para leer los comandos ingresados ​​en la consola, creo que es la bandera

0A 00 00 00 04 00 00 00  10 00 00 00 08 00 00 00
03 00 00 00 05 00 00 00  01 00 00 00 04 00 00 00
20 00 00 00 08 00 00 00  05 00 00 00 03 00 00 00
01 00 00 00 03 00 00 00  02 00 00 00 08 00 00 00
0B 00 00 00 01 00 00 00  0C 00 00 00 08 00 00 00
04 00 00 00 04 00 00 00  01 00 00 00 05 00 00 00
03 00 00 00 08 00 00 00  03 00 00 00 21 00 00 00
01 00 00 00 0B 00 00 00  08 00 00 00 0B 00 00 00
01 00 00 00 04 00 00 00  09 00 00 00 08 00 00 00
03 00 00 00 20 00 00 00  01 00 00 00 02 00 00 00
51 00 00 00 08 00 00 00  04 00 00 00 24 00 00 00
01 00 00 00 0C 00 00 00  08 00 00 00 0B 00 00 00
01 00 00 00 05 00 00 00  02 00 00 00 08 00 00 00
02 00 00 00 25 00 00 00  01 00 00 00 02 00 00 00
36 00 00 00 08 00 00 00  04 00 00 00 41 00 00 00
01 00 00 00 02 00 00 00  20 00 00 00 08 00 00 00
05 00 00 00 01 00 00 00  01 00 00 00 05 00 00 00
03 00 00 00 08 00 00 00  02 00 00 00 25 00 00 00
01 00 00 00 04 00 00 00  09 00 00 00 08 00 00 00
03 00 00 00 20 00 00 00  01 00 00 00 02 00 00 00
41 00 00 00 08 00 00 00  0C 00 00 00 01 00 00 00
07 00 00 00 22 00 00 00  07 00 00 00 3F 00 00 00
07 00 00 00 34 00 00 00  07 00 00 00 32 00 00 00
07 00 00 00 72 00 00 00  07 00 00 00 33 00 00 00
07 00 00 00 18 00 00 00  07 00 00 00 A7 FF FF FF
07 00 00 00 31 00 00 00  07 00 00 00 F1 FF FF FF
07 00 00 00 28 00 00 00  07 00 00 00 84 FF FF FF
07 00 00 00 C1 FF FF FF  07 00 00 00 1E 00 00 00
07 00 00 00 7A 00 00 00

Código de proceso

  case 10:
        read(v3);
        ++v10;
        break;
      case 1:
        v4[v7] = v5;
        ++v10;
        ++v7;
        ++v9;
        break;
      case 2:
        v5 = a1[v10 + 1] + v3[v9];
        v10 += 2;
        break;
      case 3:
        v5 = v3[v9] - LOBYTE(a1[v10 + 1]);
        v10 += 2;
        break;
      case 4:
        v5 = a1[v10 + 1] ^ v3[v9];
        v10 += 2;
        break;
      case 5:
        v5 = a1[v10 + 1] * v3[v9];
        v10 += 2;
        break;
      case 6:
        ++v10;
        break;
      case 7:
        if ( v4[v8] != a1[v10 + 1] )
        {
    
    
          printf("what a shame...");
          exit(0);
        }
        ++v8;
        v10 += 2;
        break;
      case 11:
        v5 = v3[v9] - 1;
        ++v10;
        break;
      case 12:
        v5 = v3[v9] + 1;
        ++v10;
        break;
      case 8:
        v3[v6] = v5;
        ++v10;
        ++v6;
        break;
      default:
        continue;

Introduzca lo que tiene que hacer cada número (pero el proceso no sigue de esta manera)

  1. 0x0A: leer 15 caracteres ingresados ​​por la consola
  2. 0x4: Encuentre el valor de v5, el siguiente valor de posición de la cadena del archivo ^ los primeros datos de la consola
  3. 0x10: continuar
  4. 0x08: v5 se asigna al primer elemento de la matriz v3
  5. 0x03: (el primer elemento de la matriz v3, el siguiente valor de posición de la cadena del archivo) se asigna a v5
  6. 0x05: Encuentre el valor de V5, el siguiente valor de posición de la cadena del archivo * los primeros datos de la consola
  7. 0x01: v5 se asigna al primer elemento de la matriz v4, y luego se incrementa v9, lo que significa que los segundos datos de la consola deben usarse a continuación
  8. 0x4: Encuentre el valor de v5, el siguiente valor de posición de la cadena del archivo ^ los primeros datos de la consola
  9. 0x20: continuar
  10. 0x08: v5 se asigna al segundo elemento de la matriz v3
  11. 0x05: Encuentre el valor de V5, el siguiente valor de posición de la cadena del archivo * los segundos datos de la consola
  12. 0x03: (el segundo elemento de la matriz v3, el siguiente valor de posición de la cadena del archivo) se asigna a v5
  13. 0x01: v5 se asigna al segundo elemento de la matriz v4, y luego se incrementa v9, lo que significa que los terceros datos de la consola deben usarse a continuación
    ……………………………………
    Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Nota:

Cuando se encuentra la cadena de archivo 2 ,3,4,5,7, el siguiente valor no controla el flujo (¡el flujo se omite directamente!) , Sino que se utiliza como datos de cálculo . . Así que solo diga que el flujo de ejecución no está escrito sobre el

Datos de validación (enfoque inverso)

07 00 00 00 22 00 00 00  07 00 00 00 3F 00 00 00
07 00 00 00 34 00 00 00  07 00 00 00 32 00 00 00
07 00 00 00 72 00 00 00  07 00 00 00 33 00 00 00
07 00 00 00 18 00 00 00  07 00 00 00 A7 FF FF FF
07 00 00 00 31 00 00 00  07 00 00 00 F1 FF FF FF
07 00 00 00 28 00 00 00  07 00 00 00 84 FF FF FF
07 00 00 00 C1 FF FF FF  07 00 00 00 1E 00 00 00
07 00 00 00 7A 00 00 00

Aquí todos se usan para verificar: el
orden es, 22h 3fh 34h 32h 72h 33h 18h ffffffa7h 31h fffff1h 28h ffff84h 1eh 7ah
por lo tanto, de acuerdo con la cadena estándar, y luego cada carácter para hacerlo nuevamente contra la operación, y luego nos perdimos en la consola algo, luego inmediatamente terminó. . .

Pensamiento inverso

  1. (0x22 + 5) ^ 0x10
  2. (0x3f / 3) ^ 0x20
  3. (0x34 + 1) + 2
  4. (0x32 ^ 4) - 1
  5. (0x72 + 0x21) / 3
  6. (0x33 + 1) + 1
  7. (0x18 + 0x20) ^ 9
  8. (0xa7 ^ 0x24) -0x51
  9. (0x31 + 1) - 1
  10. (0xf1 - 0x25) / 2
  11. (0x28 ^ 0x41) - 0x36
  12. (0x84 / 1) - 0x20
  13. (0xc1 - 0x25) / 3
  14. (0x1e + 0x20) ^ 9
  15. (0x7a - 1) - 0x41
flag{
    
    757515121f3d478}

Supongo que te gusta

Origin blog.csdn.net/CSNN2019/article/details/115314613
Recomendado
Clasificación