2011-02-05 3 views
7

Je suis en train de créer un dépassement de mémoire tampon tampon avec C# pour un projet scolaire:C# créer trop-plein

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]; 
       } 
      } 
     } 
    } 
} 

Je pensais que ce inonderait ptr_str2 et de ce fait en caractères ptr_str écrasant. Cependant, cela ne semble pas arriver. Il s'exécute mais les valeurs dans ptr_str ne sont pas remplacées.

Quelqu'un peut-il aider à atteindre cet objectif? Je ne comprends pas ce que je fais mal.

+1

Je suppose que vous pourriez commencer avec le projet ASP .NET MVC 2 ... –

+2

Nous essayons de les éviter, vous essayez de faire un ... Monde étrange dans lequel nous vivons. – alex

+6

Ce serait un * tampon débordement *, pas un débordement de pile. –

Répondre

5

Il vous manque le fait que les tableaux sont eux-mêmes des objets. Ils ont un en-tête d'objet comme tout type de référence géré et un champ privé qui stocke la taille du tableau. Vous devez les remplacer avant de commencer à écraser les éléments du tableau. Sur une machine 32 bits, vous commencerez le premier élément d'écraser de ptr_str2 avec ceci:

     for (int i = 0; i < 13; i++) { 
          ptr_str[i] = 'a'; 
         } 

Bien sûr, il devait être 13.

observé en réglant un point d'arrêt sur la boucle . Déboguer + Windows + Mémoire + Mémoire 1, tapez "ptr_str" dans la zone Adresse. Étape le code pour voir la mémoire se changer. Vous verrez ptr_str2 juste après cela, 4 octets pour le syncblk, 4 octets pour le pointeur de la table de méthodes et 4 octets pour la longueur du tableau. 12 octets au total, 6 caractères.

+0

Hé, c'est un très bon conseil. Je n'avais pas encore trouvé la fenêtre de mémoire ..: P Mais maintenant je vois que j'avais besoin d'écraser la séquence ptr_str3 ... Petite erreur. Maintenant, je dois vérifier comment je peux écraser les valeurs d'en-tête sans causer de plantage. – BigChief

+0

Hmm, n'y allez pas. La prochaine garbage collection va réarranger les tableaux. Ils resteront adjacents dans la mémoire seulement par accident. –

+0

Hmm ... ok mais n'est-ce pas la poubelle collectée seulement quand le tableau n'est plus nécessaire? Le sous-entendu semble faire l'affaire. pour (int i = 0; i <36; i ++) { si (i == 6) i + = 24; ptr_str2 [i] = 'a'; } – BigChief

6

Le dépassement de pile est un débordement de la pile d'appel. Il se fait beaucoup plus facile:

int Test() 
{ 
    return Test(); 
} 

Console.WriteLine (Test()); 

Si vous vouliez dire dépassement de mémoire tampon, il y a un similar question.

+0

Oui, je voulais dire un flux tampon où vous remplacez une variable sur la pile et non sur le tas. – BigChief

+1

Oui, cela déborde les variables de segment (structs). Je voudrais savoir comment cela peut être fait avec des variables de pile. Où ptr_str2 écrase ptr_str au lieu de ptr_str2 en écrasant ptr_str3. – BigChief

0

Vous ne semblez pas faire de Stackoverflow 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 C# dangereux est comme C, ce qui est similaire mais avec plusieurs différences importantes.

Un stackoverflow peut être faite simplement:

public void Stackoverflow() 
{ 
    Stackoverflow(); 
} 

puis en appelant quelque part Stackoverflow().

+0

Petite correction: 'renvoie Stackoverflow()' ou sinon le rend 'void'. –

+0

@gaearon: Merci. –

+0

Mais si vous exécutez (safe) int i = 99; vous utilisez la pile droite? – BigChief

6

L'attaque traditionnelle qui exploite un débordement de buffer déborde d'un buffer stack; vous débordez un tampon tas. Il est beaucoup plus facile de voir une écriture dans un tampon écrasant un autre tampon quand ils sont tous les deux sur la pile. Essayez d'utiliser stackalloc au lieu du nouveau caractère pour forcer l'allocation dans la pile.

+0

Merci pour votre aide. Je pensais déjà avoir compris quelque chose de mal. Je vais vérifier stackalloc. – BigChief

+0

Sauf stackalloc ne vous laissera pas réellement déborder le tampon si :) –