Je lis piratage: l'art de l'exploitation (2e édition) strong>, et je suis actuellement sur la section sur les débordements tampons. Dans le premier exemple, les variables sont déclarées / Initialisé dans cet ordre: P> char password_buffer[16];
int auth_flag = 0;
4 Réponses :
Les compilateurs sont libres de réorganiser les variables au fur et à mesure qu'ils se sentent mieux. Je crois que la seule restriction dans l'ordre des membres de la structure. Ceux-ci doivent être en mémoire dans le même ordre que déclaré dans la structure. P>
Le compilateur est autorisé à choisir n'importe quel ordre qu'il souhaite, afin de fournir un code plus optimal, voire au hasard, car il est plus facile de mettre en œuvre. Une chose que vous pourriez essayer est -O0 code> drapeau qui désactive toutes les optimisations. P>
J'ai trouvé ce fil assez intéressant:
Quote: en théorie, cela peut être fait em> p>
Apple a une fonctionnalité de sécurité pour empêcher le type de piratage dont vous parlez - il existe un degré de randomisation où tout est stocké en mémoire, vous ne pouvez donc pas par exemple trouver la mémoire allouée à un certain programme, et aller à l'octet 1502nd où la fonction d'ouvrir les serrures de saut de sécurité élevées SITES, car ce n'est pas toujours au même endroit en mémoire. P>
voir http://fr.wikipedia.org/wiki/address_space_layout_randomise pour plus de détails sur Comment cela fonctionne. p>
Coiïtion drôle que vous rencontreriez ceci et que Matt Joiner trébuche sur la réponse en essayant de brûler la pomme. P>
À la deuxième pensée ... Avez-vous dit Ubuntu est le système d'exploitation actif? Je pourrais être complètement faux si c'est le cas.
Premièrement, l'OP a dit qu'il exécutait l'expérience dans un Ubuntu VM. Deuxièmement, Ubuntu a également activé ASLR. Et troisièmement, ASLR randomise la base de la pile, mais ne rompe pas les positions relatives de deux variables de pile.
Le compilateur aura tendance à organiser des variables par ordre de diminution des exigences d'alignement pour minimiser le remplissage. Cela dit, il est étrange que le
int code> soit toujours plus élevé et pas toujours plus bas. Quoi qu'il en soit, vous ne pouvez pas dépendre de l'ordre de déclaration en faisant une sorte de différence, ce qui est un point étrange pour le livre. Bravo pour effectuer l'expérience et trouver le BS.
Aussi, bienvenue pour ainsi et +1 pour le libellé éloquent.
Je me demande pourquoi Potatoswatter n'a pas posté son commentaire comme une réponse ...
@brennan :-) Lire un esprit d'une personne qui passe par un pseudonyme tel que Poatoswatter est peut-être bien au-delà de mon Ken. Mais si je devais m'aventurer une supposition, il a écrit cela comme un commentaire pour expliquer son +1 pour la question qui a été bien formulée.
@Potato, lorsque deux valeurs sont poussées sur la pile, la première a une adresse supérieure, car elle est remplie du sommet, n'est-ce pas?
@Samuel: sur n'importe quelle plate-forme moderne, le pointeur de pile est ajusté par un
Ajouter code> ou une instruction similaire, puis l'espace créé est utilisé. Les variables locales ne sont pas poussées d'une à une.
J'ai commencé à taper dans la zone de commentaire et j'ai fini surtout répondre à la question ... Cela se produit.
@Joe, peut-être que cela traite le tableau de caractères de caractère comme s'il a un alignement de 16. Voir si vous modifiez la taille à 15 ou 17 commuter la commande.