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.

  1. ¿De qué tamaño es el stack frame reservado por main? ¿y el de foo?
  2. La función foo recibe un argumento a través del stack. ¿Cuál es la instrucción en foo que lee el valor del argumento?
  3. ¿Cuál es la instrucción en main que se encarga de poner en el stack el argumento para foo? ¿Qué valor es el que le pasa main a foo?
  4. 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ón leave qué instrucción(es) hubiesemos tenido que poner al final de foo?
  5. Muestra el contenido del stackframe de foo justo antes de ejecutar su leave.
  6. foo coloca un cierto valor en el registro eax antes de regresar. ¿Por qué?
  7. ¿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

  1. 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)
  2. ¿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