elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
25 Mayo 2012, 10:02  


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderador: berz3k)
| | |-+  duda al seguir texto "Smashing The Stack For Fun And Profit"
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: duda al seguir texto "Smashing The Stack For Fun And Profit"  (Leído 4,403 veces)
Thor


Desconectado Desconectado

Mensajes: 1.176


Ver Perfil
Re: duda al seguir texto "Smashing The Stack For Fun And Profit"
« Respuesta #15 en: 13 Enero 2008, 03:12 »

Creo que ha habido un malentendido:
Citar
y veo un "sub $0x16,%esp" y no un "sub $0x20,%esp" en function, y supongo que es porque cada palabra(word) es de
2 bytes y no 4 como dice el texto, porque serian 6 bytes es decir 3 palabras para buffer1 y 5 palabras
para buffer2, es decir un total de 16 bytes.

Por lo que tengo entendido te equibocas. 5 bytes (del buffer 1) + 10 (del buffer 2) suman 15 bytes y como se reserva de 4 en 4 se queda en 16 bytes.

3-zhynar_X no creo que los valores que se guardan en la pila se puedan mezclar asi no creo que sea valido simplemente sumar los 5 y 10 bytes y dado que se reservan de a 4 (si un word es de 4) finalmente se ocupen 16 bytes, me parece mas logico el procedimiento seguido en el texto en el cual se van guardando asi no se utilicen 2 words para 5 bytes (si el word es de 4 bytes) y asi sucesivamente, entonces porque obtengo el "sub $0x16,%esp"?????.

Con este código:
Código:
char a[60];
char c[2];
char b[2];
strcpy(b,"AAAAABCD--------------AAAA");
printf("Contenido de b -> %s\n",b);
printf("Contenido de a -> %s\n",a);
Según he entendido a zhynar_X en la pila se almacenan los 2 bytes de b, los 2 de c y los 15 de a, en total 19 bytes, como hay que reservar la memoría en bloques de 4 bytes... ocupa 20 bytes.

Pero según entiendo a cualqueircosa, la memoría se reserva por cada variable en bloques de 4 bytes entonces se almacenarian 4 bytes de b, 4 bytes de c y 16 bytes de a, en total 24 bytazos.

Yo opto más por la versión de cualquiercosa. ¿Cual es la correcta? Si es que he interpretado alguna bien ...


Con lo de las palabras, word y demases cito:
Citar
A nivel de harware, hablamos de "palabras" (o words) para referirnos a la unidad básica o la cantidad de bytes con que el procesador "se sienta más cómodo"
Vamos que en un procesador de 32 bits las palabras son de 4 bytes.

Citar
Por regla general, también se habla de "word" o "palabra" como equivalente a 2 bytes.
vaya por dios, asi que "word" se usa para definir 2 y 4 bytes, que caos !!

El tipo WORD de windows es de 2 bytes
Código:
#include<stdio.h>
#include<windows.h>

int main(){
  WORD w;
printf("%d", sizeof(w));
  return 0;
}
2   , windows si que sabe.

Para mi que antes estaban acostumbrados a usar indistintamente el termino palabra, "word" para referirse tanto a posiciones de memoria (en los tiempos de procesadores de 16 bits) como al tipo de datos word, tmb de 2 bytes. Pero entonces vieneron los malvados procesadores de 32 bits dividiendo el termino palabra en 2, el tipo de datos word de 2 bytes, y el termino word referido a posiciones de memoría, que ocupaba 4 bytes (en las cpus de 32).

Espero no haber liado mas el lío existente.
Muchas gracias Anon tu explicación es magnifica.

Una última cosa, como decía Ertai, cuidado con los punteros, son un peligro para la raza humana:
Código:
void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
   int *ret;

   ret = buffer1 + 12;
   (*ret) += 8;
}
gcc da un aviso, punteros incompatibles, menos mal que lo interpreta como si hubiesemos puesto:
Código:
   (char *)ret = buffer1 + 12;
Como si ret fuera un puntero de tipo char, pero quizás algún novato se le ocurre cambiar el código por esto:
Código:
void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
   int *ret;

   ret = buffer1;
   ret += 12;
   (*ret) += 8;
}
Y se vuelve loco preguntándose porque le suma a ret 48 en vez de 12 que es lo que el ha puesto.
Así que...no cuesta nada definir el puntero como char y evitar lios con punteros
Código:
   char *ret;

Valla parrafada mas absurda he escrito  :rolleyes:
« Última modificación: 13 Enero 2008, 03:32 por Thor » En línea
AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
Re: duda al seguir texto "Smashing The Stack For Fun And Profit"
« Respuesta #16 en: 13 Enero 2008, 23:25 »

estuve verificando lo anterior, y al parecer, bueno, esto en mi sistema FreeBSD, si reserva de 2 bytes por variable, o si esta ocupa mas de 2, los reserva de 4 en 4, miren, el siguente codigo:

Código:
int main() {
char a[60];
unsigned int temp = 0xaabbccdd;
char c;
short word;
char b[4];
printf("Valor de temp = 0x%x\n",temp);
printf("\nFuncion strcpy():\n\n");
strcpy(b,"AAAAWWCaABCDEsto es el buffer A--------------AAAA");
printf("Contenido de b -> \"%s\"\n",b);
printf("Valor de word = 0x%x\n",word);
printf("Valor de c = %c\n",c);
printf("Valor de temp = 0x%x\n",temp);
printf("Contenido de a -> \"%s\"\n",a);
return 0;
}

Bien, a la hora de ejecutarlo en mi sistema arroja lo siguente:

Código:
%./xgdb_003
Valor de temp = 0xaabbccdd

Funcion strcpy():

Contenido de b -> "AAAAWWCaABCDEsto es el buffer A--------------AAAA"
Valor de word = 0x5757
Valor de c = a
Valor de temp = 0x44434241
Contenido de a -> "Esto es el buffer A--------------AAAA"

Si, notamos algo, nosotros declaramos las variables seguidas, lo cual nos indicaria que si el compilador las reservara por su longitud, todo estaria linealmente ajustado, sin embargo vemos que no es asi...

Si notan, la letra "C", que se encuentra despues de la "WW" esta se omite por el valor mas a la derecha en este caso la variable char c, vale "a", de ahi vemos que s muy probable que si sean resevadas de 2 en 2, sin embargo preguntemoles a los que hicieron gcc  ;D

O tal vez es para conservar la Alineacion en la Pila  :huh:
« Última modificación: 13 Enero 2008, 23:28 por Anon » En línea

Bien Super Divertido
@wifigdlmx
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Tutorial - Stack overflow bypassing SEH "Structured Exception Handler"
Bugs y Exploits
soez 5 912 Último mensaje 10 Marzo 2012, 17:02
por jackgris
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines