Fuzzing, según la definición actual de Wikipedia, se define de la siguiente manera:
Fuzzing o fuzz testing es una técnica de prueba de software automatizada que consiste en proporcionar datos no válidos, inesperados o aleatorios como entradas a un programa de computadora. Luego, el programa se supervisa para detectar excepciones como fallos, fallos en las aserciones de código incorporadas o posibles pérdidas de memoria. Normalmente, los fuzzers se usan para probar programas que toman entradas estructuradas.
La ejecución simbólica, por el contrario, se define de la siguiente manera, también se extrae de Wikipedia:
En informática, la ejecución simbólica (también la evaluación simbólica) es un medio para analizar un programa para determinar qué entradas hacen que se ejecuten cada parte de un programa. Un intérprete sigue el programa, asumiendo valores simbólicos para las entradas en lugar de obtener entradas reales como lo haría la ejecución normal del programa, un caso de interpretación abstracta.
Lo que estoy tratando de entender es la diferencia funcional entre estos dos métodos. Veo que la línea que dice que la ejecución simbólica determina "qué entradas hacen que cada parte de un programa se ejecute", por lo que puede diferenciar cada método por el "objetivo" que un investigador de seguridad tiene en mente. Los documentos que he leído recientemente diferencian la ejecución simbólica de la confusión al decir que el primero tiene una sobrecarga significativamente mayor / corre más lentamente.
Desde mi perspectiva, la ejecución simbólica utiliza una forma de "fuzzing dirigido" que afecta específicamente a ciertos valores simbólicos. También he oído decir que la ejecución simbólica es simplemente "un engaño más sofisticado".
¿Puede alguien aclarar cuál es la diferencia real entre los dos y por qué o cuándo deberíamos preferir un método sobre el otro?