Un servidor que no hace nada no es un servidor útil. Es posible que un archivo de texto no sea ejecutable por sí mismo, sin embargo, en general, el procesamiento debe realizarse en él. Las vulnerabilidades de día cero por lo general no son problemas con la funcionalidad normal del programa, sino que explotan algún error de programación poco claro, como el hecho de que la funcionalidad se haya pirateado cuando se envía una entrada mal formada.
En el ejemplo de su servidor de correo, tal vez haya un filtro de correo no deseado que lo analice y, si coloca un poco de correo electrónico, causa un error en el comportamiento del filtro de correo no deseado. O tal vez cuando le envía una solicitud SMTP con formato incorrecto, puede hacer que ejecute un código arbitrario que usted ingresó en su solicitud SMTP con formato incorrecto. Los correos electrónicos en sí pueden ser de texto, pero ese texto se debe utilizar en algún momento. Los protocolos para manejar el intercambio de esos mensajes también tienen que hacer ejecuciones más avanzadas y necesitan escribir y leer información del disco.
Una posible vulnerabilidad de día cero podría estar presente en cualquier parte del proceso y dado que los desarrolladores no son perfectos, cualquier parte de ella podría tener un problema. La única manera de que una computadora esté perfectamente segura (para el mundo exterior) es no tener que responder al mundo exterior en absoluto. Si expone cualquier tipo de funcionalidad interactiva, es posible que un error en esa funcionalidad pueda permitir que se ejecuten comandos arbitrarios al proporcionarle una entrada que sobrescribe la memoria con una llamada al código que se incluye con la entrada.
Esto se denomina desbordamiento de búfer, y aunque no es el único tipo de vulnerabilidad de día cero, es bastante común. En la memoria, no hay ninguna diferencia entre los datos y las instrucciones del programa. Las cosas que se llaman punteros le dicen a la computadora dónde ir para buscar datos o su próxima instrucción. Si puede incluir instrucciones como datos y luego modificar un puntero para indicar al código del programa que ejecute el código que ingresó en la porción de datos, pensará que está siguiendo el programa en lugar de ejecutarse en los datos. Hay algunas medidas técnicas que hacen que esto sea un poco más difícil de hacer, pero esa es la idea básica y realmente no hay una manera perfecta de detenerlo.