2011-02-05 14 views
7

Estoy intentando crear un desbordamiento de búfer con C# para un proyecto escolar:C# creación de desbordamiento de búfer

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

pensé que esto sería inundar ptr_str2 caracteres y de este modo sobreescritura en ptr_str. Sin embargo, eso no parece suceder. Se ejecuta pero los valores en ptr_str no se sobrescriben.

¿Alguien puede ayudar a lograr esto? No entiendo lo que estoy haciendo mal.

+1

Supongo que podría comenzar con el proyecto ASP .NET MVC 2 ... –

+2

Estamos tratando de evitarlos, está tratando de hacer uno ... Extraño mundo en el que vivimos. – alex

+6

Esto sería un * buffer overflow *, no un desbordamiento de la pila. –

Respuesta

5

Te estás perdiendo el hecho de que las matrices son objetos en sí mismos. Tienen un encabezado de objeto como cualquier tipo de referencia administrada y un campo privado que almacena el tamaño de la matriz. Debe sobrescribir los primeros antes de comenzar a sobrescribir los elementos de la matriz. En una máquina de 32 bits, podrás empezar a sobrescribir el primer elemento de ptr_str2 con esto:

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

Por supuesto, tenía que ser 13.

observar esto mediante el establecimiento de un punto de interrupción en el bucle . Depurar + Windows + Memoria + Memoria 1, escriba "ptr_str" en el cuadro Dirección. Paso el código para ver la memoria cambiando. Verá ptr_str2 inmediatamente después, 4 bytes para syncblk, 4 bytes para el puntero de la tabla de métodos y 4 bytes para la longitud de la matriz. 12 bytes en total, 6 caracteres

+0

Hola, este es un consejo increíblemente bueno. Todavía no había encontrado la ventana de la memoria ...: P Pero ahora veo que necesito sobreescribir la secuencia ptr_str3 ... Pequeño error. Ahora debo verificar cómo puedo sobreescribir los valores del encabezado sin causar un bloqueo. – BigChief

+0

Hmm, no vayas allí. La próxima recolección de basura va a reorganizar las matrices. Permanecerán adyacentes en la memoria solo por accidente. –

+0

Hmm ... bien, pero ¿no se recoge la basura solo cuando ya no se necesita la matriz? Lo mencionado más abajo parece ser el truco. para (int i = 0; i <36; i ++) { if (i == 6) i + = 24; ptr_str2 [i] = 'a'; } – BigChief

6

El desbordamiento de pila es un desbordamiento de la pila de llamadas. Se hace mucho más fácil:

int Test() 
{ 
    return Test(); 
} 

Console.WriteLine (Test()); 

si nos referimos desbordamiento de memoria intermedia, hay una similar question.

+0

Sí, quise decir un flujo de búfer donde sobrescribes una variable en la pila y no en el montón. – BigChief

+1

Sí, eso es desbordar las variables de montón (estructuras). Me gustaría saber cómo se puede hacer con las variables de pila. Donde ptr_str2 sobrescribe ptr_str en lugar de ptr_str2 sobrescribiendo ptr_str3. – BigChief

0

Parece que no estás haciendo un Stackoverflow aquí, no estás realmente usando la pila. Pareces estar intentando crear un desbordamiento de búfer, supongo que piensas que C# inseguro es como C, que es similar pero con varias diferencias importantes.

Un stackoverflow puede hacerse simplemente:

public void Stackoverflow() 
{ 
    Stackoverflow(); 
} 

y luego llamando Stackoverflow() en alguna parte.

+0

Pequeña solución: 'return Stackoverflow()' o bien, haga que 'void'. –

+0

@gaearon: Gracias. –

+0

Pero si está ejecutando (seguro) int i = 99; estás usando la pila ¿verdad? – BigChief

6

El ataque tradicional que explota un desbordamiento de búfer se desborda un pila búfer; está desbordando un montón de memoria intermedia. Es mucho más fácil ver un búfer de escritura en uno amortiguando otro búfer cuando ambos están en la pila. Intenta usar stackalloc en lugar de nuevo char para forzar la asignación en la pila.

+0

Gracias por su consejo. Ya estaba pensando que entendí algo mal. Voy a ver a stackalloc. – BigChief

+0

Excepto que stackalloc no le permitirá desbordar el buffer aunque :) –

Cuestiones relacionadas