|
| 1 | +; Version simple del abi_enforcer. Sin mensajes de error ni nada. |
| 2 | +; Uso: %include "abi_enforcer.mac" en cada archivo .asm, o agregar |
| 3 | +; -p "abi_enforcer.mac" al NASMFLAGS de cada Makefile. |
| 4 | +; |
| 5 | +; Features: |
| 6 | +; * Pisa todos los registros que no se preservan en cada call y ret |
| 7 | +; (rcx, rdx, rdi, rsi, r8, r9, r10, r11) |
| 8 | +; * Pisa 50 valores en el stack para asegurarnos que nadie referencie |
| 9 | +; a variables del stack luego de un call. |
| 10 | +; * Chequea que la pila este alineada antes de cada call. |
| 11 | +; |
| 12 | +; No tiene mensajes de error lindos. El codigo simplemente va a crashear. |
| 13 | +; No chequea que los registros que hay que preservar se preserven. |
| 14 | + |
| 15 | +; Macro regcrash pisa todos los registros que no se preservan. |
| 16 | +%macro regcrash 0 |
| 17 | + mov rdi, 0x001122334455667788 |
| 18 | + mov rsi, 0x001122334455667788 |
| 19 | + mov rdx, 0x001122334455667788 |
| 20 | + mov rcx, 0x001122334455667788 |
| 21 | + mov r8, 0x001122334455667788 |
| 22 | + mov r9, 0x001122334455667788 |
| 23 | + mov r10, 0x001122334455667788 |
| 24 | + mov r11, 0x001122334455667788 |
| 25 | +%endmacro |
| 26 | + |
| 27 | +; Macro stackcrash llena el stack de basura. |
| 28 | +%macro stackcrash 0 |
| 29 | + times 50 push 0x11bbccdd |
| 30 | + add rsp, 50*8 |
| 31 | +%endmacro |
| 32 | + |
| 33 | +; Macro stackcheck crashea si el stack no está alineado. |
| 34 | +%macro stackcheck 0 |
| 35 | + test rsp, 0xF |
| 36 | + jz %%aligned |
| 37 | + ud2 |
| 38 | +%%aligned: |
| 39 | +%endmacro |
| 40 | + |
| 41 | +; Macro que reemplaza la instruccion call. |
| 42 | +; Antes de ejecutar el call verdadero, chequea que el stack este alineado |
| 43 | +; Luego de ejecutar el call, pone basura en todos los registros y el stack. |
| 44 | +%imacro call 1 |
| 45 | + stackcheck |
| 46 | + call %1 |
| 47 | + regcrash |
| 48 | + stackcrash |
| 49 | +%endmacro |
| 50 | + |
| 51 | +; Macro que reemplaza la instruccion ret. |
| 52 | +; Antes de hacer el ret, pone basura en todos los registros y el stack. |
| 53 | +%imacro ret 0 |
| 54 | + regcrash |
| 55 | + stackcrash |
| 56 | + ret |
| 57 | +%endmacro |
0 commit comments