assembly disassembly

assembly - ¿Por qué se llena la pila con 0xCCCCCCCC?



disassembly (2)

No puedo hablar de Visual Studio, pero algunos entornos en los que he codificado han llenado deliberadamente la pila con un valor predeterminado (como 0xccccccccc). Esto se hizo para que la pila pudiera escanearse (comenzando desde la parte inferior) para determinar cuánto no se había utilizado. En sistemas embebidos donde la cantidad de memoria puede ser bastante limitada, esto es bastante útil durante el desarrollo para poder optimizar el uso de la memoria.

Espero que esto ayude.

Actualmente estoy desarmando algunos pequeños programas de C creados en Visual Studio 2012 Express, y he notado una tendencia entre los binarios.

El primer conjunto de instrucciones ejecutadas en la función principal son siempre:

SUB ESP,154 ; Doesn''t have to be 0x154. ..... ..... ..... LEA EDI,DWORD PTR SS:[EBP-154] MOV ECX,55 ; Also doesn''t have to be 0x55. MOV EAX,CCCCCCCC REP STOS DWORD PTR ES:[EDI]

Entonces, ¿por qué la máquina llena la pila con este 0xCCCCCCCC? He leído que es utilizado por VC ++, o algo así, como una marca para el espacio no inicializado?

Entonces digamos que voy a poner algo dentro de mi búfer ... El compilador o procesador decide ponerlo en algún punto al azar dentro de este espacio, pero no puedo ver por qué lo pondría allí ...

EBP-90 > CCCCCCCC ÌÌÌÌ EBP-8C > CCCCCCCC ÌÌÌÌ EBP-88 > CCCCCCCC ÌÌÌÌ EBP-84 > 00000001 ... ; Why this place? EBP-80 > CCCCCCCC ÌÌÌÌ EBP-7C > CCCCCCCC ÌÌÌÌ EBP-78 > 41414141 AAAA ; Why this far from both the top and bottom of the stack? EBP-74 > CCCCCC00 .ÌÌÌ EBP-70 > CCCCCCCC ÌÌÌÌ EBP-6C > CCCCCCCC ÌÌÌÌ

Y...

EBP-14 > CCCCCCCC ÌÌÌÌ EBP-10 > CCCCCCCC ÌÌÌÌ EBP-C > 00000000 .... ; Why here? EBP-8 > CCCCCCCC ÌÌÌÌ EBP-4 > 7EA7D069 iЧ~ ; I think this is some stack cookie stuff. EBP ==> >/0017FEA8 ¨þ. ; Saved EBP.

Por supuesto, las palabras clave 1 y 0 que se almacenan aquí se deben a algunas afirmaciones if, pero simplemente me pregunto por qué se colocan donde están. Si hay alguna lógica detrás de ello.

Gracias.


Solo está viendo el código generado por el compilador MSVC cuando usa la opción / RTC. Lo que habilita las comprobaciones de tiempo de ejecución, activadas de forma predeterminada en la compilación de depuración. El valor 0xcccccccc es mágico, es muy bueno para bloquear tu programa cuando usas un puntero sin inicializar. O generar un valor int extraño. O bloquee su código cuando se vuelva loco y comience a ejecutar datos como si fuera un código. 0xcc es la instrucción x86 para INT 3, que invoca una interrupción del depurador.

El "por qué este lugar" es parte de los diagnósticos que obtiene de / RTC. Hace que el compilador asigne variables locales con espacio extra entre ellas. Llenado por ese valor mágico. Lo que hace que sea muy sencillo diagnosticar la corrupción de la pila causada por el desbordamiento del búfer, solo necesita verificar si los valores mágicos todavía están allí cuando la función regresa.