Directorio de artículos
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)
- 0x0A: leer 15 caracteres ingresados por la consola
- 0x4: Encuentre el valor de v5, el siguiente valor de posición de la cadena del archivo ^ los primeros datos de la consola
- 0x10: continuar
- 0x08: v5 se asigna al primer elemento de la matriz v3
- 0x03: (el primer elemento de la matriz v3, el siguiente valor de posición de la cadena del archivo) se asigna a v5
- 0x05: Encuentre el valor de V5, el siguiente valor de posición de la cadena del archivo * los primeros datos de la consola
- 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
- 0x4: Encuentre el valor de v5, el siguiente valor de posición de la cadena del archivo ^ los primeros datos de la consola
- 0x20: continuar
- 0x08: v5 se asigna al segundo elemento de la matriz v3
- 0x05: Encuentre el valor de V5, el siguiente valor de posición de la cadena del archivo * los segundos datos de la consola
- 0x03: (el segundo elemento de la matriz v3, el siguiente valor de posición de la cadena del archivo) se asigna a v5
- 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
……………………………………
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
- (0x22 + 5) ^ 0x10
- (0x3f / 3) ^ 0x20
- (0x34 + 1) + 2
- (0x32 ^ 4) - 1
- (0x72 + 0x21) / 3
- (0x33 + 1) + 1
- (0x18 + 0x20) ^ 9
- (0xa7 ^ 0x24) -0x51
- (0x31 + 1) - 1
- (0xf1 - 0x25) / 2
- (0x28 ^ 0x41) - 0x36
- (0x84 / 1) - 0x20
- (0xc1 - 0x25) / 3
- (0x1e + 0x20) ^ 9
- (0x7a - 1) - 0x41
flag{
757515121f3d478}