J'essaie de créer un débordement de tampon avec C # pour un projet d'école:
unsafe { fixed (char* ptr_str = new char[6] {'H', 'a', 'l', 'l', 'o', ','}) { fixed (char* ptr_str2 = new char[6] {'W', 'e', 'r', 'e', 'l', 'd'}) { fixed (char* ptr_str3 = new char[6] {'!', '!', '!', '!', '!', '!'}) { for (int i = 0; i < 8; i++) { ptr_str2[i] = 'a'; } for (int i = 0; i < 6; i++) { this.Label2.Text += ptr_str[i]; this.Label3.Text += ptr_str2[i]; this.Label4.Text += ptr_str3[i]; } } } } }
4 Réponses :
Overflow de pile est un débordement de la pile d'appel. Il est fait beaucoup plus facile:
int Test () { return Test (); } Console.WriteLine (Test ());
Oui, je voulais dire un écoulement tampon où vous écrasez une variable sur la pile et non sur le tas.
Oui c'est déborder des variables de tasse (structures). J'aimerais savoir comment cela peut être fait avec des variables de pile. Où ptr_str2 écrase pTR_STR au lieu de pTR_STR2 écrasement pTR_STR3.
Vous ne semblez pas faire de la scaleverflow ici - vous n'utilisez pas vraiment la pile du tout. Vous semblez plutôt essayer de créer un débordement de tampon, je suppose que penser que c # dangereux est comme C, ce qui est similaire mais avec plusieurs différences importantes.
Un empiler peut être fabriqué simplement: P>
public void Stackoverflow() { Stackoverflow(); }
Little Fix: Retour Stackoverflow () Code> ou le fait le faire
vide code>.
Mais si vous exécutez (sûr) int i = 99; Vous utilisez la pile juste?
Ce qui devrait probablement avoir dit, c'est que vous utilisez la pile mais n'augmente pas massivement sa taille (vous utilisez réellement la pile pour chaque opération de la machine virtuelle .NET). En tant que tel, cela ne causera pas de scaleverflow. Mais vous recherchez un débordement tampon de toute façon.
Il vous manque le fait que les tableaux sont des objets eux-mêmes. Ils ont une en-tête d'objet comme n'importe quel type de référence géré et un champ privé qui stocke la taille de la matrice. Vous devez écraser ces premiers avant de commencer à écraser les éléments de la matrice. Sur une machine 32 bits, vous commencerez à écraser le premier élément de PTR_STRO2 avec ceci:
for (int i = 0; i < 13; i++) { ptr_str[i] = 'a'; }
Salut cela un incroyablement bon conseil. Je n'avais pas encore trouvé la fenêtre de mémoire ..: P mais maintenant je vois que je devais écraser la séquence PTR_STR3 ... peu d'erreur. Maintenant, je dois vérifier comment je peux écraser les valeurs d'en-tête sans causer de crash.
Hmm, n'allez pas là-bas. La prochaine collection des ordures va réorganiser les tableaux. Ils resteront adjacents à la mémoire que par accident.
Hmm ... d'accord mais n'est pas la poubelle que recueillie lorsque la matrice n'est plus nécessaire ?? Le sous-tendu semble faire l'affaire. pour (int i = 0; i <36; i ++) {if (i == 6) i + = 24; pTr_str2 [i] = 'a'; }
Le collecteur des ordures compacte également le tas. Qui déplace les objets.
Ah bien, mais je pensais que lorsque vous utilisez la mémoire, il reste dans le même endroit de la mémoire.
Cela ne reste pas épinglé pendant très longtemps dans votre extrait de code, vous devez utiliser Gchandle.alloc () pour le garder épinglé plus longtemps. Commencez une autre question à ce sujet si cela n'est toujours pas clair.
L'attaque traditionnelle qui exploite un débordement tampon déborde d'un tampon pile em>; Vous débordez un tampon em> tasse de tas. Il est beaucoup plus facile de voir une mémoire tampon à un autre tampon lorsqu'ils sont tous deux sur la pile. Essayez d'utiliser StackallOC au lieu d'un nouveau caractère pour forcer la répartition dans la pile. P>
Merci pour vos conseils. Je pensais déjà que j'ai compris quelque chose de mal. Je vais vérifier Spectacle.
Sauf Stackalloc ne vous laissera pas vraiment déborder le tampon :)
Je suppose que vous pourriez commencer par ASP .NET MVC 2 Projet ...
Nous essayons de les éviter, vous essayez de faire une ... monde étrange que nous vivons.
Ce serait un dépassement de tampon i>, pas un débordement de pile.
Oui je voulais dire un débordement de tampon ...