ASLR Randomization BSS

5

Ecco alcuni codici:

#include <stdio.h>
#include <string.h>

char globalbuf[256];

void function(char *argv) {
   char localbuf[256];
   strcpy(localbuf, argv);
   strcpy(globalbuf, localbuf);
   printf("localbuf addr: %p globalbuf addr: %p\n", localbuf, globalbuf);
}

int main(int argc, char **argv) {
   function(argv[1]);
   return 0;
}

Stavo esaminando ASLR e come funziona. Altre informazioni su OS e compilatore

gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Linux 3.5.0-32-generic #53-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux

Quindi quando eseguo questo codice, vedo un costante localbuf indirizzo. Il che è perfettamente soddisfacente visto che l'ASLR è abilitato e impostato sulla modalità Full Randomized . Ma l'indirizzo globalbuf rimane sempre lo stesso. So che le variabili globali e statiche non inizializzate fanno parte della sezione BSS; e quindi presumo che le sezioni BSS, Testo e Dati non vengano randomizzate da ASLR.

È corretto? Se non mi collego a un carta . Pagina 2, ultimo paragrafo si riferisce a ciò che sto suggerendo qui.

Come ho capito, ogni processo ha le sue sezioni / aree stack, heap, testo, bss e dati, quindi ogni volta che viene generato un processo, un indirizzo casuale viene assegnato al puntatore base e tutto il resto è solo un offset da esso. Se questo è il caso, cosa viene stampato per globalbuf , è l'offset ?. Come posso trovare l'indirizzo effettivo di globalbuf ?

    
posta fahad 12.06.2013 - 17:26
fonte

1 risposta

4

La variabile globalbuf è una variabile statica non inizializzata, quindi il suo indirizzo virtuale è non randomizzato.

I know that uninitialized global and static variables are part of BSS section; and therefore I assume that BSS, Text and Data sections are not being randomized by ASLR.

La sezione BSS non è casuale perché è contrassegnata come dati non inizializzati. Questo è un flag impostato sull'intestazione della sezione nel file eseguibile. I dati in questa sezione sono statici e avranno sempre lo stesso indirizzo ogni volta che si esegue l'applicazione. Il valore del puntatore immutabile che vedi è l'indirizzo virtuale della variabile globalbuf .

Le sezioni di testo e dati sono randomizzate (se l'applicazione è compilata come posizione indipendente con -fPIE ), poiché sono contrassegnate rispettivamente come segmento di codice (CS) e segmento di dati (DS). Nota che i segmenti di codice e di dati hanno un significato speciale in x86 e i loro indirizzi di base sono popolati nei registri di segmento CS e DS. Questo è il motivo per cui spesso vedete riferimenti come dword ptr ds:[05012340] e dword ptr cs:[00410000] in assembly: il primo è un indirizzo all'interno del segmento dati (DS) e quest'ultimo è un indirizzo all'interno del segmento di codice (CS). Poiché queste sono sezioni importanti, i loro indirizzi di base sono randomizzati (cioè ugualmente sfalsati da un indirizzo di base).

    
risposta data 12.06.2013 - 17:55
fonte

Leggi altre domande sui tag