Estas tecnologías son similares en cuanto a que son protecciones del compilador. Para obtener protección, una aplicación necesita ser recompilada, pero el código fuente no necesita ser cambiado (al menos, a menos que la aplicación haga algo raro, como el código de auto-modificación)
Stack Guard se basa en un valor "canario" que se coloca en la pila con cada llamada de función. Al final de la función, se comprueba el canario. Si se ha producido un desbordamiento, se dañará el canario y se detectará.
Stack Shield se basa en copiar la dirección de retorno a un área segura y verificar la dirección de retorno al final de la función. Si se sobrescribe la dirección de retorno, esto ya no coincidirá y se detectará el ataque.
Debido a que funcionan de manera diferente, tienen propiedades de seguridad ligeramente diferentes. En particular, Stack Guard es mejor para detectar la corrupción de otras cosas además de la dirección de retorno. Y es por eso que Stack Guard se usa más ampliamente.
Este documento es interesante: enlace