C es un lenguaje que permite el acceso directo a recursos de bajo nivel. Originalmente, fue construido para implementar el sistema operativo Unix, por lo que, por su naturaleza, le permite hacer cosas a nivel de sistema, lo cual es conveniente para las explotaciones.
Una consecuencia de esto es que los programas de C compilados a menudo no necesitan dependencias externas, como se señala en paj28 en los comentarios.
C ++ se creó originalmente sobre C y tiene el mismo acceso a las operaciones de bajo nivel.
Como ejemplo, C permite la manipulación directa de la memoria mediante punteros. Una vez que se crea un puntero, se puede agregar o restar para apuntar a otras ubicaciones de memoria. Con un poco de creatividad, esto puede ser usado para propósitos nefarios.
Por el contrario, Java y C # no permiten este tipo de manipulación. No permiten que un usuario agregue o reste a una llamada variable de referencia (el equivalente en Java y C # de los punteros de C).
Tradicionalmente, C y C ++ se traducen directamente en código de máquina, mientras que muchos lenguajes modernos como Java y C # se traducen en código para máquinas virtuales (código JVM y CIL). Los compiladores que traducen C y C ++ directamente al código de máquina están disponibles en casi todas las plataformas; menos aún para los compiladores que traducen Java o C # directamente al código de máquina.