Destrezas para el mid-term 2019
-
Conocer las instrucciones esenciales: MOV, PUSH, POP, CALL, LEA, XOR, JZ, JNZ, JMP, TEST, CMP, RET, MOVZB. Poder analizar programas que las contengan. En el exámen les proveeré documentación de esas instrucciones.
-
Stack frame: Dado un programa en donde se invocan subrutinas poder ilustrar el estado del stack frame en cualquier punto durante la ejecución.
-
En una subrutina que ha sido invocada, saber cuánto espacio de stack reserva, cuáles son las variables locales vs. los argumentos, cuántos argumentos necesita.
-
Analizar código en assembly para detectar:
- variables tipo estructura
- estructuras if-else
- estructuras de repetición (usando jumps)
-
En un código cuyo
main
recibeargc
yargv
, entender cómo se accesan esos dos argumentos para tomar decisiones. -
Entender el pase de parámetros en programas de 80x86 (32 bits) y AMD64 (64 bits).
-
Conocer los siguientes términos (en contexto de esta clase):
- export
- import
- name
- rodata
- text segment
- ELF, PE
- EBP, ESP
- cdecl y stdcall
-
Entender para qué se utilizan las siguientes herramientas:
- strings
- ldd
- strace
- ltrace
- strip
- objdump
- readelf
- gdb
- nm
- xxd
-
Dado un programa en C y lo que conoces sobre la organización de un proceso en memoria, poder predecir el resultado del programa. Por ejemplo:
int main() {
int a = 8;
int *p = malloc(4);
*p = a;
printf("%x %x %x", &p, p, *p);
}
¿Cuál de los siguientes outputs sería más correcto?
a. 8 0xff909090 0xff909088
b. 0xff909090 0xff909088 8
c. 0xff909090 8 0xff909088
d. ninguna de las anteriores
Ejercicios de práctica:
- https://challenges.re/51/
- https://challenges.re/55/
- https://challenges.re/58/
- https://challenges.re/2/
- https://challenges.re/7/
0804846b <dos>:
804846b: push ebp
804846c: mov ebp,esp
804846e: mov eax,DWORD PTR [ebp+0x8]
8048471: imul eax,DWORD PTR [ebp+0x8]
8048475: pop ebp
8048476: ret
08048477 <uno>:
8048477: push ebp
8048478: mov ebp,esp
804847a: push DWORD PTR [ebp+0x8]
804847d: call 804846b <dos>
8048482: add esp,0x4
8048485: mov edx,eax
8048487: mov eax,edx
8048489: add eax,eax
804848b: add eax,edx
804848d: leave
804848e: ret
0804848f <main>:
804848f: lea ecx,[esp+0x4]
8048493: and esp,0xfffffff0
8048496: push DWORD PTR [ecx-0x4]
8048499: push ebp
804849a: mov ebp,esp
804849c: push ecx
804849d: sub esp,0x14
80484a0: sub esp,0x8
80484a3: lea eax,[ebp-0x10]
80484a6: push eax
80484a7: push 0x8048570
80484ac: call 8048350 <__isoc99_scanf@plt>
80484b1: add esp,0x10
80484b4: mov eax,DWORD PTR [ebp-0x10]
80484b7: sub esp,0xc
80484ba: push eax
80484bb: call 8048477 <uno>
80484c0: add esp,0x10
80484c3: mov DWORD PTR [ebp-0xc],eax
80484c6: sub esp,0x8
80484c9: push DWORD PTR [ebp-0xc]
80484cc: push 0x8048573
80484d1: call 8048330 <printf@plt>
80484d6: add esp,0x10
80484d9: mov eax,0x0
80484de: mov ecx,DWORD PTR [ebp-0x4]
80484e1: leave
80484e2: lea esp,[ecx-0x4]
80484e5: ret