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
foo
recibe un argumento a través del stack. ¿Cuál es la instrucción enfoo
que lee el valor del argumento? - ¿Cuál es la instrucción en
main
que se encarga de poner en el stack el argumento parafoo
? ¿Qué valor es el que le pasamain
afoo
? - El propósito de la instrucción
leave
es regresar el stack frame (los valores de esp y ebp) en los valores que comenzaron la función. Si no existiera la instrucciónleave
qué instrucción(es) hubiesemos tenido que poner al final defoo
? - Muestra el contenido del stackframe de
foo
justo antes de ejecutar suleave
. foo
coloca un cierto valor en el registroeax
antes 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
cat
recibe 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