En lisant le livre Hacking: The Art of Exploitation de Jon Erickson, j'essaie d'approximer l'adresse d'une variable d'environnement SHELLCODE
pour exploiter un programme.
Chaque fois que je cours getenv("SHELLCODE");
pour obtenir l'emplacement, le résultat est complètement différent.
Extrait de ma coque:
> 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
Je comprends que si le nom du programme est modifié ou de nouvelles variables d'environnement sont ajoutées, la position serait légèrement différente, mais pourquoi l'emplacement varie-t-il autant?
getenv
manuel indique qu'il renvoie un pointeur sur une chaîne contenant la valeur de la variable. Tout le reste n'est pas spécifié, donc votre noyau et / ou votre compilateur peuvent coller la valeur où ils veulent, tant que cette promesse de pointeur reste vraie. Je suppose que la réponse exacte à cela peut être une sorcellerie lourde et dépend de divers détails d'implémentation de la cartographie de la mémoire et de la phase de la lune. (Je ne suis pas assez sorcier pour vous donner la réponse exacte.)