¿Cómo realizar un desbordamiento de búfer en parámetros sin argumentos?

2

Soy nuevo en los ataques de desbordamiento de búfer y estoy tratando de hacer lo mismo en un código c de muestra que tengo.

  • Tengo tres variables a, b y buffer.
  • a y b tienen valores asignados a ellos en el propio código. buffer toma de forma interactiva la entrada del usuario. El valor de 'buffer' es no tomado del argumento.
  • Mi intención es desbordar el búfer para que sobrescriba b con un valor deseado. Sobrescribir EIP o ESP no es la intención aquí.
  • Con gdb pude averiguar que si transmito un número determinado de valores, sobrescribiría el valor de la variable b.
  • Sin embargo, estoy atrapado aquí porque gdb no me permite escribir o pegar Caracteres ASCII que corresponden al valor deseado de b. por ejemplo considera 1356 es el valor deseado. El hex para el mismo es 0x0000054C. Así que para sobrescribir b, debo dar en el ASCII de 4C, 05, 00 y 00 en gdb como los últimos cuatro bytes de la entrada respectivamente. Desafortunadamente esto no es posible.
  • Otra forma que encontré en la web es pasar los valores hexadecimales usando perl Sin embargo, este método canaliza la salida de Perl al argumento del código. La variable que estoy desbordando aquí toma su valor del usuario entrada mientras se ejecuta el programa de forma interactiva y no desde el argumento del programa.

¿Hay alguna forma de pasar valores hexadecimales a parámetros sin argumentos para realizar un desbordamiento de búfer basado en la pila?

    
pregunta hax 14.08.2016 - 03:47
fuente

3 respuestas

1

La solución a esto fue simple. Tuve que encontrar una forma de escribir el ASCII correspondiente a los valores 4C, 05, 00 y 00 hexadecimales en el indicador. Después de un poco de googlear me di cuenta de lo siguiente

4C - L

05 - ctrl + E

00 - ctrl + @

Fuente: enlace

    
respondido por el hax 12.11.2016 - 18:15
fuente
2

Algunas técnicas para lograr esto se discuten en aquí

Los métodos 1 y 2 también deberían funcionar fuera de gdb.

Editar: (Las técnicas se copian y copian a continuación para preservarlas)

Método # 1:

perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/input
gdb ./a.out
(gdb) run < /tmp/input   # voila: GDB reads terminal,
                         # your program reads /tmp/input

O fuera de gdb:

$ perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/input
$ ./foo < /tmp/input

Método # 2:

mkfifo /tmp/pipe
perl -e 'print "A"x48; print "\x1b\x88\x04\x08";' > /tmp/pipe &
# perl will block, waiting for someone to read the pipe
gdb ./a.out
(gdb) run < /tmp/pipe

Esto también se puede utilizar fuera de gdb de la manera descrita anteriormente.

    
respondido por el rhodeo 12.11.2016 - 17:46
fuente
0

Aquí hay un código C que desborda tres parámetros sin argumentos.

int main()
{
   char s[8];
   int x, y, z;

   strcpy(s, "This is some text");
   return(0);
}

"esto es" entrará en s, x obtendrá "algo", y obtendrá "tex" yz obtendrá "t seguido de un carácter nulo.

Probablemente recibirá una advertencia (¿error?) del compilador que se va a desbordar.

    
respondido por el Swashbuckler 14.08.2016 - 04:18
fuente

Lea otras preguntas en las etiquetas