Beim Lesen des Buches Hacking: The Art of Exploitation von Jon Erickson versuche ich, die Adresse einer Umgebungsvariablen zu approximieren SHELLCODE
, um ein Programm auszunutzen.
Jedes Mal, wenn ich renne getenv("SHELLCODE");
, um den Ort zu finden, ist das Ergebnis völlig anders.
Auszug aus meiner Muschel:
> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3
Ich verstehe, dass die Position etwas anders wäre, wenn der Programmname geändert oder neue Umgebungsvariablen hinzugefügt würden, aber warum variiert der Speicherort so stark?
getenv
Handbuch gibt an, dass ein Zeiger auf eine Zeichenfolge zurückgegeben wird, die den Wert der Variablen enthält. Alles andere ist nicht spezifiziert, so dass Ihr Kernel und / oder Compiler den Wert behalten können, wo immer sie wollen, solange dieses Zeigerversprechen wahr bleibt. Ich vermute, dass die genaue Antwort darauf eine schwere Zauberei sein kann und von verschiedenen Details der Implementierung der Speicherzuordnung und der Mondphase abhängt. (Ich bin nicht Zauberer genug, um Ihnen die genaue Antwort zu geben.)