Jocker de la Copa Wangding 2020 (Grupo Qinglong)

declaración

Después de analizar esta pregunta, hay dos conocimientos, uno es la modificación del puntero de pila y el otro la auto-modificación de smc (para la auto-modificación, hay dos métodos de ruptura, uno es el script idc, el otro es el ajuste dinámico)

Modificación del puntero de pila

Inserte la descripción de la imagen aquí
Ingrese 0x401838el puntero sp (desequilibrio de la pila) de la dirección directa del programa e informe un error, haga clic en opciones—> general—> verifique el puntero de la pila, luego busque la dirección 0x401838, tome una captura de pantalla para ver si la posición del
Inserte la descripción de la imagen aquí
puntero spde la pila es diferente antes y después de que se llame a la función de llamada , ¿es posible? ? ? ? ? ? ? ¿Cómo equilibrar la pila? ? ? ? Para obtener más detalles, consulte https://blog.csdn.net/dj0379/article/details/8699219?utm_source=app&app_version=4.5.5 Si
no es nada más, cámbielo. Haga clic con el mouse para llamar, luego presione el teclado y luego Alt + K
Inserte la descripción de la imagen aquí
cambie este sp a 0.
Inserte la descripción de la imagen aquí
Luego, hay otro error como este a continuación, puede
Inserte la descripción de la imagen aquí
modificarlo y podrá hacerlo después de finalizar la F5modificación.
Inserte la descripción de la imagen aquí

equivocado

Inserte la descripción de la imagen aquí

Dios mío

Inserte la descripción de la imagen aquí
Exportar teclas de método abreviado de matriz de memoriashift + E

unsigned char unk_4030C0[] =
{
    
    
  0x66,0x6B,0x63,0x64,0x7F,0x61,0x67,0x64,
  0x3B,0x56,0x6B,0x61,0x7B,0x26,0x3B,0x50,
  0x63,0x5F,0x4D,0x5A,0x71,0x0C,0x37,0x66
};

Esta función incorrecta y Dios mío obtienen una bandera falsa, lo cual es un desperdicio de expresiónflag{fak3_alw35_sp_me!!}

auto-modificación de smc

Inserte la descripción de la imagen aquí
Hay un ciclo for muy largo aquí, que es smc a primera vista, por lo que no
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
puedo hacerlo directamente con F5 cuando entro encriptar en un estado estático Estoy emocionado por el puntero en la parte superior de la pila. . . . El ciego no miró directamente y luego modificó el puntero de la pila. . . .
Estas dos instrucciones también se dan para parchear. . También verifiqué específicamente cuáles fueron los datos agregados después del comando enter. . . . Olvídalo, todo es una tragedia ciega. . .
Inserte la descripción de la imagen aquí

Dinámica

Inserte la descripción de la imagen aquí

Ingrese encrtpt (analice el código de programación del segmento de datos)

Inserte la descripción de la imagen aquí

.text:0040152C jmp     short near ptr dword_401534+43h

La dirección de salto es un segmento de datos, que no es conveniente para nosotros observar, y el compilador no es conveniente para analizar, pero no afecta la ejecución del programa. . . Si necesitamos observar, necesitamos convertir este grupo de segmentos de datos en código (presione la tecla c) para analizar, y luego quedar así.
Inserte la descripción de la imagen aquí
Luego presione la tecla p, es decir, trátelo como una función para analizar.

Inserte la descripción de la imagen aquí

int __cdecl encrypt(char *a1)
{
    
    
  int v2[19]; // [sp+1Ch] [bp-6Ch]@1
  int v3; // [sp+68h] [bp-20h]@1
  int i; // [sp+6Ch] [bp-1Ch]@1

  v3 = 1;
  qmemcpy(v2, &unk_403040, sizeof(v2));
  for ( i = 0; i <= 18; ++i )
  {
    
    
    if ( (char)(a1[i] ^ aHahahaha_do_yo[i]) != v2[i] )
    {
    
    
      puts("wrong ~");
      v3 = 0;
      exit(0);
    }
  }
  if ( v3 == 1 )
    puts("come here");
  return v3;
}
unsigned char unk_403040[] =
{
    
    
  0x0E,0x0D,0x09,0x06,0x13,0x05,
  0x58,0x56,0x3E,0x06,0x0C,0x3C,
  0x1F,0x57,0x14,0x6B,0x57,0x59,0x0D,
};
aHahahaha_do_yo db 'hahahaha_do_you_find_me?'

Solo hay 19 bits arriba, y los cinco bits restantes están en la función finalmente. El
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
último es 58 porque el último de la bandera es todo }, y }necesita ser XORed con 71 , y luego los cuatro valores anteriores se XOR con 71 . Un poco fuerte

flag{
    
    d07abccf8a410cb37a}

secuencia de comandos idc

#include<idc.idc>
static main(){
    
    
auto start=0x401500l;
auto i =0;
for(;i<187;i++){
    
    
 auto a=Byte(start+i);
   PatchByte(i+start,a^0x41);
}
}

Guárdelo como un archivo con el sufijo .idc
Inserte la descripción de la imagen aquí
y luego importe el archivo de secuencia de comandos que escribió,

Antes de importar

Inserte la descripción de la imagen aquí

Después de la importación

Inserte la descripción de la imagen aquí
Simplemente presione la tecla p. . . Después de F5
Inserte la descripción de la imagen aquí

Supongo que te gusta

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