Il C#, come il Java, è un linguaggio semicompilato. Il codice sorgente che scrivi viene compilato in un codice intermedio (in C# si chiama IL) che non è costituito da istruzioni dipendenti dalla tua macchina, ma è pensato per girare su una macchina virtuale. Questa virtual machine (che in C# si chiama CLR) è un software; se qualcuno trova una falla di sicurezza in questo software i tuoi programmi ne risentono e tu non ci puoi fare proprio niente.
Nel C e nel C++ questo codice intermedio non c'è, quindi il problema non si pone e le fragilità presenti nell'eseguibile sono quasi tutte controllabili/evitabili dal programmatore. Tuttavia c'è da dire che in un caso sei sotto un ambiente controllato, mentre nell'altro no: in C scrivi gets e il tuo codice è quasi certamente vulnerabile, in C# non hai questo tipo di problemi.
I programmi "importanti" si possono scrivere in tutti e tre i linguaggi, ma se vuoi fare un programma difficilmente exploitabile probabilmente vorrai usare il C++ o, ancora meglio, il C. Non sono un esperto del settore, ma immagino che tutti i crackme siano scritti per lo più in C e assembly. Ma per sottolineare che le cose "importanti" si possono scrivere in qualsiasi linguaggio: i programmi che hanno a che fare con la crittografia, quindi molto importanti dal punto di vista della sicurezza non hai bisogno di reversarli; ti fanno vedere il codice sorgente e ti spiegano per filo e per segno cosa stanno facendo (se non lo fanno, sono insicuri), ma nonostante questo non riuscirai ad attaccarli.
Nel C e nel C++ questo codice intermedio non c'è, quindi il problema non si pone e le fragilità presenti nell'eseguibile sono quasi tutte controllabili/evitabili dal programmatore. Tuttavia c'è da dire che in un caso sei sotto un ambiente controllato, mentre nell'altro no: in C scrivi gets e il tuo codice è quasi certamente vulnerabile, in C# non hai questo tipo di problemi.
I programmi "importanti" si possono scrivere in tutti e tre i linguaggi, ma se vuoi fare un programma difficilmente exploitabile probabilmente vorrai usare il C++ o, ancora meglio, il C. Non sono un esperto del settore, ma immagino che tutti i crackme siano scritti per lo più in C e assembly. Ma per sottolineare che le cose "importanti" si possono scrivere in qualsiasi linguaggio: i programmi che hanno a che fare con la crittografia, quindi molto importanti dal punto di vista della sicurezza non hai bisogno di reversarli; ti fanno vedere il codice sorgente e ti spiegano per filo e per segno cosa stanno facendo (se non lo fanno, sono insicuri), ma nonostante questo non riuscirai ad attaccarli.