Ich habe an einigen Stellen gelesen, dass ASLR den .data
Abschnitt an zufälligen Adressen laden soll, jedes Mal wenn ein Programm ausgeführt wird, was bedeutet, dass die Adressen der globalen Variablen unterschiedlich sein sollten. Allerdings, wenn ich den folgenden Code haben:Wie können Adressen von globalen Variablen randomisiert werden, wenn sie innerhalb der ELF fest codiert sind?
int global_var = 42;
int main()
{
global_var = 10;
return 0;
}
und ich kompilieren es mit gcc -fpie -o global global.c
, zeigt objdump -d -M intel
folgendes:
4004ed: 55 push rbp
4004ee: 48 89 e5 mov rbp,rsp
4004f1: c7 05 3d 0b 20 00 0a mov DWORD PTR [rip+0x200b3d],0xa # 601038 <global_var>
Es scheint, dass global_var
immer bei 601038. Tat gestellt werden, wenn ich mit Bugsymbol kompilieren global_var
‚hat s DIE diese Adresse fest einprogrammiert:
$ gcc -ggdb3 -fpie -o global global.c
$ objdump --dwarf=info global
...
<1><55>: Abbrev Number: 4 (DW_TAG_variable)
<56> DW_AT_name : (indirect string, offset: 0x30c): global_var
<5a> DW_AT_decl_file : 1
<5b> DW_AT_decl_line : 1
<5c> DW_AT_type : <0x4e>
<60> DW_AT_external : 1
<60> DW_AT_location : 9 byte block: 3 38 10 60 0 0 0 0 0 (DW_OP_addr: 601038)
Wie funktioniert ASLR Arbeit i In diesen Fällen?
Ich glaube, ASLR funktioniert nur auf den Code, Stack und Heap. Nicht unbedingt auf die Daten. Könnte falsch sein, also nicht als Antwort. –
Haben Sie versucht, mit 'gdb' zu laufen und zu debuggen? Ich bin mir nicht sicher, aber vielleicht gibt es dort eine Art Umsiedlung. – Tomer