2013-07-14 9 views
16

Attualmente sto smontando alcuni piccoli programmi in C realizzati in Visual Studio 2012 Express e ho notato una tendenza tra i file binari.Perché lo stack è pieno di 0xCCCCCCCC

La prima serie di istruzioni eseguite nella funzione principale sono sempre:

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] 

Così, perché la macchina riempire lo stack con questo 0xCCCCCCCC? Ho letto che è usato da VC++, o qualcosa del genere, come un marchio per lo spazio non inizializzato?

Allora diciamo che sto per mettere qualcosa dentro il mio tampone ... Il compilatore o un processore decide di mettere a un certo punto a caso all'interno di questo spazio, ma non riesco a vedere il motivo per cui sarebbe messo lì. ..

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 ÌÌÌÌ 

e ...

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. 

scontata la dwords 1 e 0 sono memorizzati qui è a causa di qualche istruzioni if, ma sto semplicemente chiedendo perché essi sono posti dove sono. Se c'è una logica dietro di esso.

Grazie.

+0

Creazione ottimizzata o di debug? –

+0

@KerrekSB Penso che sia effettivamente in fase di debug ... Non l'ho mai notato, ora che lo hai fatto notare. – Volatile

+0

Se si fosse un compilatore di debug, si può immaginare che uso possa avere un "modello prevedibile"? –

risposta

22

Si sta appena visualizzando il codice generato dal compilatore MSVC quando si utilizza l'opzione/RTC. Che abilita i controlli di runtime, attivati ​​di default nella build di debug. Il valore 0xcccccccc è magico, è molto valido per bloccare il programma quando si utilizza un puntatore non inizializzato. Oppure genera un valore strano int. O crash il tuo codice quando va banane e inizia ad eseguire i dati come se fosse un codice. 0xcc è l'istruzione x86 per INT 3, invoca un'interruzione del debugger.

Il "perché questo luogo" fa parte della diagnostica che si ottiene da/RTC. Fa in modo che il compilatore allochi le variabili locali con in più di spazio tra di loro. Riempito da quel valore magico. Il che rende molto semplice diagnosticare il danneggiamento dello stack causato da sovraccarichi del buffer, è sufficiente controllare se i valori magici sono ancora lì quando la funzione ritorna.

+0

Molto bello, grazie! Che tipo di valore intero strano ti riferisci a? – Volatile

+1

Ogni volta che si visualizza 3435973836 o -858993460 nel debugger. Vai, hmm, è strano, non è un valore che un essere umano abbia mai scritto. Non è vero. –

+0

Haha, ok grazie. =) – Volatile

3

Non riesco a parlare per Visual Studio, ma alcuni ambienti in cui ho codificato hanno deliberatamente riempito lo stack con un valore predeterminato (come 0xcccccccc). Questo è stato fatto in modo che la pila potesse essere scansionata (partendo dal basso) per determinare quanto non era stato usato. Su sistemi embedded in cui la quantità di memoria può essere piuttosto limitata, è piuttosto utile durante lo sviluppo in modo che l'utilizzo della memoria possa essere ottimizzato.

Spero che questo aiuti.

+0

Questo è stato molto illuminante, grazie. – Volatile