2012-02-12 15 views
11
 
void return_input (void) 
{ 
    char array[30]; 

    gets (array); 
    printf("%s\n", array); 
} 

Dopo aver compilato in gcc, questa funzione viene convertita al seguente codice Assembly:Qual è% gs in Assemblea

 
push %ebp 
mov %esp,%ebp 
sub $0x28,%esp 
mov %gs:0x14,%eax 
mov %eax,-0x4(%ebp) 
xor %eax,%eax 
lea -0x22(%ebp),%eax 
mov %eax,(%esp) 
call 0x8048374 
lea -0x22(%ebp),%eax 
mov %eax,(%esp) 
call 0x80483a4 
mov -0x4(%ebp),%eax 
xor %gs:0x14,%eax 
je  0x80484ac 
call 0x8048394 
leave 
ret 

Non capisco due linee:

 
mov %gs:0x14,%eax 
xor %gs:0x14,%eax 

Cos'è% gs e cosa fanno esattamente queste due linee?

Questo è il comando di compilazione:

 
cc -c -mpreferred-stack-boundary=2 -ggdb file.c 
+0

Suppongo che si tratti di registri di segmento SS, DS, CS, ES, FS, GS. Se ho capito bene –

+1

Possibile duplicato di [Qual è il registro "FS"/"GS" destinato?] (Http://stackoverflow.com/questions/10810203/what-is-the-fs-gs-register-intended-for) –

risposta

16

GS è un registro di segmento, il suo utilizzo in Linux può essere letto su here (il suo fondamentalmente utilizzato per per i dati di processo).

mov %gs:0x14,%eax 
xor %gs:0x14,%eax 

questo codice viene utilizzato per convalidare che la pila non è esploso o stato corupted, utilizzando un valore canarino conservato a GS + 0x14, vedere this.

3

ES, FS, GS: Segmento Extra Registri Può essere usato come registri di segmento in più; utilizzato anche in istruzioni speciali che si estendono su segmenti (come copie di stringa). presi da qui

http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm


Speranza che aiuta

Problemi correlati