Directorio de artículos
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
Ingrese 0x401838
el 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
puntero sp
de 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
cambie este sp a 0.
Luego, hay otro error como este a continuación, puede
modificarlo y podrá hacerlo después de finalizar la F5
modificación.
equivocado
Dios mío
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
Hay un ciclo for muy largo aquí, que es smc a primera vista, por lo que no
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. . .
Dinámica
Ingrese encrtpt (analice el código de programación del segmento de datos)
.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í.
Luego presione la tecla p, es decir, trátelo como una función para analizar.
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
ú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
y luego importe el archivo de secuencia de comandos que escribió,
Antes de importar
Después de la importación
Simplemente presione la tecla p. . . Después de F5