Come posso trovare la dimensione di un array solo dal programma C compilato?

2

Sto giocando con le vulnerabilità del buffer e dell'heap overflow, e va benissimo sfruttare le cose quando si ha il codice sorgente e si possono vedere tutte le variabili, le loro dimensioni e valori, ecc. Ma, cosa succede se ho solo il programma compilato e ho bisogno di trovare una dimensione di un array. Ad esempio, se prendiamo il seguente programma di esempio, che ha dichiarato alcune variabili e un array, e in una fase successiva dell'esecuzione, l'array viene passato ad un'altra funzione.

int main(int argc, char **argv) 
{
   char test;
   char arr[100];
   double someVar;

   // Somewhere in the main call another function with array
   myFunc(arr);

   ...
}

Se non avessi il codice sorgente, ma sapevo che l'array è passato da qualche parte (gueesable), come andrei a determinare la dimensione dell'array? Voglio dire, posso sempre provare a scrivere qualcosa come uno script in cui passo sempre argomenti più grandi e grossi al programma dalla riga di comando, e vedere dove fallisce, ma questo non è un approccio molto pratico (secondo me). Suppongo che il reverse engineering possa fornire alcune informazioni, ma in che modo esattamente? Gdb può anche fornire qualcosa di utile? Voglio dire quali sarebbero i metodi per determinare la dimensione della matrice se il codice sorgente non è noto?

    
posta ticket 16.05.2016 - 18:34
fonte

1 risposta

2

C'è una spiegazione abbastanza buona al seguente link su StackOverflow:

Risposta breve: Non c'è modo di ottenere esattamente lo stesso codice che hai su un programma scritto C .

Passa attraverso molte fasi fino a raggiungere il codice binario per una macchina specifica. È in qualche modo paragonato a un cubetto di ghiaccio che si scioglie, supponendo che tu non abbia perso acqua per evaporazione. Non c'è modo di ottenere la forma ESATTA del cubo di ghiaccio originale, a meno che tu non abbia uno stampo (e tuttavia, la formazione interna non sarà la stessa).

Avere un buon traduttore che potrebbe guardare pezzi di assemblaggio e capire ogni volta che potrebbe essere un array, sarebbe la soluzione migliore. Ma questo strumento non sembra esistere per quanto ne so.

Questo tizio di re.stackexchange ha alcuni suggerimenti su come guardare il codice smontato e ottenere le informazioni che vuoi sui C array:

risposta data 16.05.2016 - 19:28
fonte

Leggi altre domande sui tag