Ejercicios
Ejercicio 1
El código que aparece a continuación fue obtenido haciendo un disassembly de un ejecutable cuyo código fuente contenía dos funciones foo y main.
- ¿De qué tamaño es el stack frame reservado por
main? ¿y el defoo? - La función
foorecibe un argumento a través del stack. ¿Cuál es la instrucción enfooque lee el valor del argumento? - ¿Cuál es la instrucción en
mainque se encarga de poner en el stack el argumento parafoo? ¿Qué valor es el que le pasamainafoo? - El propósito de la instrucción
leavees regresar el stack frame (los valores de esp y ebp) en los valores que comenzaron la función. Si no existiera la instrucciónleavequé instrucción(es) hubiesemos tenido que poner al final defoo? - Muestra el contenido del stackframe de
foojusto antes de ejecutar suleave. foocoloca un cierto valor en el registroeaxantes de regresar. ¿Por qué?- ¿Qué valor (exacto) devuelve el
main?
foo:
push %ebp
mov %esp,%ebp
sub $0x10,%esp
mov 0x8(%ebp),%eax
add %eax,%eax
mov %eax,-0x4(%ebp)
mov -0x4(%ebp),%eax
leave
ret
main:
lea 0x4(%esp),%ecx
and $0xfffffff0,%esp
pushl 0xfffffffc(%ecx)
push %ebp
mov %esp,%ebp
push %ecx
sub $0x14,%esp
movl $0x7,-0xc(%ebp)
mov -0xc(%ebp),%eax
mov %eax,(%esp)
call foo
mov %eax,-0x8(%ebp)
mov -0x8(%ebp),%eax
add $0x14,%esp
pop %ecx
pop %ebp
lea -0x4(%ecx),%esp
ret
Ejercicio 2: Ojo con los paréntesis y los LEAS
- La función
catrecibe un argumento de tipo puntero. ¿Cómo lo puedes deducir? (Hint: En el ejercicio anterior la función foo recibe un entero) - ¿Cuál sería el resultado del programa?
cat:
push %ebp
mov %esp,%ebp
mov 0x8(%ebp),%eax
movl $0xa,(%eax)
pop %ebp
ret
main:
lea 0x4(%esp),%ecx
and $0xfffffff0,%esp
pushl -0x4(%ecx)
push %ebp
mov %esp,%ebp
push %ecx
sub $0x14,%esp
movl $0x7,-0x8(%ebp)
lea -0x8(%ebp),%eax
mov %eax,(%esp)
call cat
mov -0x8(%ebp),%eax
add $0x14,%esp
pop %ecx
pop %ebp
lea -0x4(%ecx),%esp
ret