Para evitar ataques de desbordamiento del búfer de pila que sobrescriben la dirección de retorno, ¿por qué no guardar una copia de la dirección de retorno al inicio de una función y luego volver a cargarla al final?
push ebp
mov ebp, esp
sub esp, 0x70 # some number
mov eax, [ ebp + 4 ]
mov [ esp ], eax // save return address to TOP of stack
luego al final
mov ecx, [ esp ]
mov [ ebp + 4], ecx // restore your copy, doesn't matter if they overwrote it
add esp, 0x70
pop ebp
retn