es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El código Perl ejecutado junto al programa C escribe una longitud de byte incorrecta en la memoria en Windows.

Mientras aprendo sobre desbordamientos de búfer, estoy jugando con código en Perl ejecutado junto a mi programa en C para demostrar cómo funciona el desbordamiento. Sin embargo, cuando ingreso el código .\Buffer $(perl -e 'print "A"x16 . "\xef\xbe\xad\xde"'), solo agrega $(perl al primer búfer en memoria, buffer_two, como se muestra aquí:

.\Buffer $(perl -e 'print "A"x16 . "\xef\xbe\xad\xde"')

<p>[ANTES] buffer<em>_two</em> está en 0061FF0C y contiene dos
[ANTES] buffer<em>_one</em> está en 0061FF14 y contiene uno
[ANTES] valor está en 0061FF1C y es 5 (0x00000005)</p>

<p>[STRCPY] copiando 6 bytes en buffer_two</p>

<p>[DESPUÉS] buffer<em>_two</em> está en 0061FF0C y contiene $(perl
[DESPUÉS] buffer<em>_one</em> está en 0061FF14 y contiene uno
[DESPUÉS] valor está en 0061FF1C y es 5 (0x00000005) 

Los bytes entre buffer_two y value son 16 bytes ((gdb) print 0x0061ff1c - 0x0061ff0c $1 = 16), así que imprimo “A” 16 veces para llenar el espacio. Sin embargo, lo que debería suceder es que el texto que sigue a "A"x16 debería sobrescribir la siguiente(s) dirección(es) de memoria. Cuando se usa en Linux, el código funciona bien y obtengo la siguiente salida:

./Buffer $(perl -e 'print "A"x16 . "\xef\xbe\xad\xde"')
[ANTES] buffer<em>_two</em> está en 0x7ffca168185c y contiene dos
[ANTES] buffer<em>_one</em> está en 0x7ffca1681864 y contiene uno
[ANTES] valor está en 0x7ffca168186c y es 5 (0x00000005)</p>

<p>[STRCPY] copiando 20 bytes en buffer_two</p>

<p>[DESPUÉS] buffer<em>_two</em> está en 0x7ffca168185c y contiene AAAAAAAAAAAAAAAAᆳ�
[DESPUÉS] buffer<em>_one</em> está en 0x7ffca1681864 y contiene AAAAAAAAᆳ�
[DESPUÉS] valor está en 0x7ffca168186c y es -559038737 (0xdeadbeef)

Aquí está el código completo:

“`c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

<pre><code>int value = 5;
char buffer_one[8], buffer_two[8]; //create two buffers of 8 bytes

strcpy(buffer_one, "one"); //copy strings one and two into buffers
strcpy(buffer_two, "two");

printf("[ANTES] buffer_two está en %p y contiene %s\n", buffer_two, buffer_two); //print initial address and value
printf("[ANTES] buffer_one está en %p y contiene %s\n", buffer_one, buffer_one);
printf("[ANTES] valor está en %p y es %d (0x%08x)\n", &value, value, value);

printf("\n[STRCPY] copiando %d bytes en buffer_two\n\n", strlen(argv[1])); //copy first argument digits into buffer two

//if((int *)argv[1] > (int *)8) //test if argument input is greater than 8 bytes
//{
// printf("[!!] Buffer error\n\n");
// exit(-1);
//}

strcpy(buffer_two, argv[1]);

printf("[DESPUÉS] buffer_two está en %p y contiene %s\n", buffer_two, buffer_two);
printf("[DESPUÉS] buffer_one está en %p y contiene %s\n", buffer_one, buffer_one);
printf("[DESPUÉS] valor está en %p y es %d (0x%08x)\n", &value, value, value);
</code></pre>

}
“`
Mientras escribo esta publicación, me doy cuenta de que indica que solo se están escribiendo 6 bytes, lo cual no estoy seguro de por qué.</stdlib.h></string.h></stdio.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que al ejecutar el código Perl junto con el programa en C, solo el primer buffer en memoria (buffer_one) está siendo afectado, mientras que el buffer previsto para ser sobrescrito (buffer_two) permanece sin cambios. La salida muestra que solo 6 bytes se están copiando en buffer_two, lo que podría explicar por qué el texto que sigue a los A no está sobrescribiendo la(s) dirección(es) de memoria siguiente(s).

    Este problema podría ser causado por varios factores, incluyendo el tamaño del búfer, la alineación de las direcciones de memoria o la implementación específica del código en C y Perl. Es posible que sea necesario investigar más sobre estos factores para determinar la causa raíz del problema.

Comments are closed.