elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Tamaño de word
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Tamaño de word  (Leído 6,995 veces)
Kerber0

Desconectado Desconectado

Mensajes: 142

Yo me Amo!


Ver Perfil
Tamaño de word
« en: 17 Noviembre 2009, 06:55 am »

Hola gente, no se si corresponde esto aca pero creo que es el subforo mas adecuado. Estoy siguiendo lo de buffer overflow el texto de Aleph y en ejemplo el tiene el sgte codigo en C:

Código:
void funcion(){
char buffer1[5];
char buffer2{10];
}
Genera el codigo ensamblador y sale lo sgte:
Código:
...
pushl %ebp
movl %esp,%ebp
subl $20,%esp
...
La memoria guarda los datos en multiplos de word. En este caso su word vale 4 bytes, ya que (5 bytes de la primer variable se guardan en 2 word, y 10 bytes de la segunda var se guardan en 3 word) En total tengo 5 word que multiplicados por 4, reservo un espacio de 20 bytes
Código:
subl $20,%esp

Ahora, yo genero en mi pc el mismo codigo y me sale lo siguiente:
Código:
	pushl	%ebp
movl %esp, %ebp
subl $40, %esp
Cuanto valdria mi word? Cuanto reserva para la primer variable (char buffer1[5]) y cuanto reserva para la segunda (char buffer2[10])?

Muchas gracias de antemano.


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Tamaño de word
« Respuesta #1 en: 17 Noviembre 2009, 08:10 am »

Un char (caracter) ocupa un byte unicamente, el tema esta en el alineamiento en memoria pero en x86 una palabra son 2 bytes, una doble palabra (DWORD) son 4 bytes.

Habria que ver que modificadores estas usando para el compilador, si yo genero ESE codigo con VC++ no hace nada al optimizarlo ...


« Última modificación: 17 Noviembre 2009, 08:13 am por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Kerber0

Desconectado Desconectado

Mensajes: 142

Yo me Amo!


Ver Perfil
Re: Tamaño de word
« Respuesta #2 en: 17 Noviembre 2009, 16:43 pm »

Hola, gracias por contestar. El tema es que me quiero posicionar sobre la ret. Es decir

PILA

buf2|buf1|SBP|ret

si yo me posiciono en buf1 estoy a ¿cuanto de ret? el SBP ocuparia 4bytes? dire de memoria ret = dire de buf1 + 4bytes?

Corro con Ubuntu, compilo en gcc

Muchas gracias
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Tamaño de word
« Respuesta #3 en: 17 Noviembre 2009, 17:18 pm »

Si, la direccion de retorno ocupa 4 bytes, esta en la pila, cuando la funcion es llamada equivale justamente a ESP. Para obtenerla DENTRO de la funcion, cuando el prologo ya se ejecuto y el epilogo todavia no lo hizo tenes que sumarle el tamaño de bytes que resto (subl   $40, %esp) mas 4 (pushl %ebp).

ret = esp + (X + 4)

Siguiendo tu logica:
buf1|buf2|ESP|ret

ret = buf1 + sizeof(buf2) + 4

Lo mejor que podes hacer es depurarlo para comprobarlo.
« Última modificación: 17 Noviembre 2009, 17:22 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Kerber0

Desconectado Desconectado

Mensajes: 142

Yo me Amo!


Ver Perfil
Re: Tamaño de word
« Respuesta #4 en: 17 Noviembre 2009, 21:16 pm »

Muchas gracias por contestar, a ver si voy entendiendo y disculpen por el codigo en c.

Sea el sgte codigo:
Código:
#include <stdio.h>

void function(){
int i;
int* p;
p=&i+2; //Estaria apuntando al ret
}

void main(){
int j;
function();
j=5;
printf("\n%d\n",j);
j=6;
printf("\n%d\n",j);
}

Al desamblar el main:

Código:
Dump of assembler code for function main:
0x080483fc <main+0>: push   %ebp
0x080483fd <main+1>: mov    %esp,%ebp
0x080483ff <main+3>: and    $0xfffffff0,%esp
0x08048402 <main+6>: sub    $0x20,%esp
0x08048405 <main+9>: call   0x80483e4 <function>
0x0804840a <main+14>: movl   $0x5,0x1c(%esp) -> ESTA SERIA LA DIRE DE RETORNO
0x08048412 <main+22>: mov    $0x8048510,%eax
0x08048417 <main+27>: mov    0x1c(%esp),%edx
0x0804841b <main+31>: mov    %edx,0x4(%esp)
0x0804841f <main+35>: mov    %eax,(%esp)
0x08048422 <main+38>: call   0x804831c <printf@plt>
0x08048427 <main+43>: movl   $0x6,0x1c(%esp)
0x0804842f <main+51>: mov    $0x8048510,%eax
0x08048434 <main+56>: mov    0x1c(%esp),%edx
0x08048438 <main+60>: mov    %edx,0x4(%esp)
0x0804843c <main+64>: mov    %eax,(%esp)
0x0804843f <main+67>: call   0x804831c <printf@plt>
0x08048444 <main+72>: leave 
0x08048445 <main+73>: ret   
End of assembler dump.

Ahora yo quiero modificar la direccion de retorno para llegar a que salte el primer printf y ejecute el 2do j=6;
Es decir, correctamente la ret es:
0x0804840a <main+14>:   movl   $0x5,0x1c(%esp)
yo quiero modificarla y que caiga en:
0x08048427 <main+43>:   movl   $0x6,0x1c(%esp)

Estoy a 43-14 bytes = 29 bytes de diferencia entre la ret correcta y la ret que quiero donde caiga.Esto es correcto? Tendria que aumentar en 29 bytes la ret para caer aqui?Pero 29 no es multiplo de word, se podria aumentar?

Gracias !!!
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Tamaño de word
« Respuesta #5 en: 17 Noviembre 2009, 22:15 pm »

Asi me funciona:

Código
  1. #include <stdio.h>
  2.  
  3. void function(){
  4. int i;
  5. unsigned char *p = (unsigned char*)&i+0xC;
  6. *p += 0x1A;
  7. }
  8.  
  9. void main(){
  10. int j;
  11. function();
  12. j=5;
  13. printf("\n%d\n",j);
  14. j=6;
  15. printf("\n%d\n",j);
  16. }

Siendo main:
0x080483f3 <main+0>:    lea    0x4(%esp),%ecx
0x080483f7 <main+4>:    and    $0xfffffff0,%esp
0x080483fa <main+7>:    pushl  -0x4(%ecx)
0x080483fd <main+10>:   push   %ebp
0x080483fe <main+11>:   mov    %esp,%ebp
0x08048400 <main+13>:   push   %ecx
0x08048401 <main+14>:   sub    $0x24,%esp
0x08048404 <main+17>:   call   0x80483d4 <function>
0x08048409 <main+22>:   movl   $0x5,-0x8(%ebp) ;direccion original
0x08048410 <main+29>:   mov    -0x8(%ebp),%eax
0x08048413 <main+32>:   mov    %eax,0x4(%esp)
0x08048417 <main+36>:   movl   $0x8048510,(%esp)
0x0804841e <main+43>:   call   0x8048310 <printf@plt>
---Type <return> to continue, or q <return> to quit---
0x08048423 <main+48>:   movl   $0x6,-0x8(%ebp) ;direccion a la que queremos saltar
0x0804842a <main+55>:   mov    -0x8(%ebp),%eax
0x0804842d <main+58>:   mov    %eax,0x4(%esp)
0x08048431 <main+62>:   movl   $0x8048510,(%esp)
0x08048438 <main+69>:   call   0x8048310 <printf@plt>
0x0804843d <main+74>:   add    $0x24,%esp
0x08048440 <main+77>:   pop    %ecx
0x08048441 <main+78>:   pop    %ebp
0x08048442 <main+79>:   lea    -0x4(%ecx),%esp
0x08048445 <main+82>:   ret

Y function:
0x080483d4 <function+0>:        push   %ebp
0x080483d5 <function+1>:        mov    %esp,%ebp
0x080483d7 <function+3>:        sub    $0x10,%esp
0x080483da <function+6>:        lea    -0x8(%ebp),%eax
0x080483dd <function+9>:        add    $0xc,%eax
0x080483e0 <function+12>:       mov    %eax,-0x4(%ebp)
0x080483e3 <function+15>:       mov    -0x4(%ebp),%eax
0x080483e6 <function+18>:       movzbl (%eax),%eax
0x080483e9 <function+21>:       lea    0x1a(%eax),%edx
0x080483ec <function+24>:       mov    -0x4(%ebp),%eax
0x080483ef <function+27>:       mov    %dl,(%eax)
0x080483f1 <function+29>:       leave
0x080483f2 <function+30>:       ret

0x23-0x9=0x1A.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Kerber0

Desconectado Desconectado

Mensajes: 142

Yo me Amo!


Ver Perfil
Re: Tamaño de word
« Respuesta #6 en: 18 Noviembre 2009, 03:23 am »

Sos groso Eternal Idol, sabelo!

Muchas gracias por tu tiempo !!!

Saludos
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Tamaño de word
« Respuesta #7 en: 18 Noviembre 2009, 08:02 am »

De nadas  ;D
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
shortcut para aumentar el tamaño de fuente en Word?
Software
skan 2 2,085 Último mensaje 7 Mayo 2012, 19:27 pm
por maxtextla
duda programa para cambiar tamaño word « 1 2 »
Software
General Dmitry Vergadoski 10 2,844 Último mensaje 9 Diciembre 2014, 21:57 pm
por engel lex
Independizar tamaño de columnas en tablas de Word 2013.
Software
Tachikomaia 3 8,144 Último mensaje 28 Febrero 2024, 10:01 am
por Tachikomaia
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines