Domanda Reversing Curiosità Reverse C

Stato
Discussione chiusa ad ulteriori risposte.

Second Reality

Utente Electrum
19 Settembre 2015
255
43
67
156
Per una mia curiosità, quale dei tre metodi ritenete più "resistente" ad un eventuale azione di reverse ?
Tutti stampano la parola "microsoft" in console.

#1
C:
#define aoaoaoaoao(...) printf(__VA_ARGS__);

// Stampa Microsoft in Console utilizzando codici ASCII
aoaoaoaoao("%c%c%c%c%c%c%c%c%c",109,105,99,114,111,115,111,102,116);

#2
C:
#define aoaoaoao(...) printf(__VA_ARGS__);

char aoaoaoaoao[10] = {91,92,93,94,95,96,97,98,99,100};
char aoaoaoaoaoa[10] = {101,102,103,104,105,106,107,108,109,110};
char aoaoaoaoaoo[10] = {111,112,113,114,115,116,117,118,119,120};

// Stampa Microsoft in console utilizzando i vettori contenenti codici ASCII

aoaoaoao("%c%c%c%c%c%c%c%c%c",aoaoaoaoao[9],aoaoaoaoaoa[8], ecc ecc)

#3
C:
// Come il precedente, ma ogni output passa per 3 vettori diversi tramite puntatori
 
Direi che sono ugualmente insicuri. La define viene rimossa dal preprocessore in una fase precedente alla compilazione, quindi puoi tranquillamente scrivere printf. I caratteri sono di fatto memorizzati con il loro valore ascii, quindi compilare #1 e compilare quest'altro codice è indifferente in termini di codice generato:
C:
printf("%c%c%c%c%c%c%c%c%c",'m','i','c','r','o','s','o','f','t');

Il #2 e il #3 sono leggermente più complessi, ma l'ostacolo per un reverser è veramente molto basso. Se vuoi fare qualcosa di un po' più complicato l'idea di base è che devi calcolare la scritta in runtime; questo renderebbe l'analisi statica del codice un po' più complessa. Certo che finché tutto quello che devi fare è stampare una scritta... basta che l'attaccante fa partire il programma per "reversarlo".
Il discorso sarebbe un po' più interessante se stessi cercando di ottenere una password, o comunque se l'user dovesse interagire in qualche modo col programma.
 
Grazie mille per la risposta St3ve. Mi sto avvicinando per la prima volta a questo mondo. Vorrei farti un'ultima domanda...

Tra i linguaggi C, C++ e C#, quale offre maggior possibilità di "difesa" ? Mi spiego meglio, premettendo che un programmatore conosca bene tutti e tre, quale dovrebbe scegliere per scrivere un programma "importante"?
 
I tre linguaggi da te elencati sono tutti Turing-completi, per cui offrono le stesse possibilità.
Una piccola nota può essere fatta per il C, essendo più a basso livello devi essere tu ad eseguire delle routine di controllo e scrivere del buon codice robusto, ma se parli di "possibilità" sono equivalenti.
 
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.
 
Stato
Discussione chiusa ad ulteriori risposte.