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>
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 enbuffer_two
, lo que podría explicar por qué el texto que sigue a losA
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.