Come altri hanno già detto, la lettura / stampa è la principale area di rischio per i buffer overflow.
Tuttavia, è possibile utilizzare la libreria bignum per spruzzare l'heap. Ad esempio, MPIR / GMP usa una struttura bignum che assomiglia un po 'a questo:
typedef struct
{
off_t count;
mpn_limb_t* limbs;
} mpz+t;
Dove off_t
descrive il numero di arti e il suo segno descrive il segno del numero complessivo. Quindi ogni mpn_limb_t
viene tipizzato in dimensioni appropriate per la tua piattaforma.
Chiaramente, questo non può essere e non è assegnato allo stack, quindi stai praticamente scrivendo tutti questi numeri ( mpn_limb_t
) nell'heap, permettendoti di heap spray che non sfrutterà direttamente la libreria, ma potrebbe facilitare un altro exploit.
Il processo di sanitizzazione per questo è quello di non fidarsi di una serializzazione binaria del tuo numero, poiché ogni bit è usato per memorizzare il numero in forma grezza e metterlo in memoria che ti offre l'intera gamma di codici operativi. Hai davvero bisogno di leggere il numero da un formato leggibile dall'uomo, che sebbene meno efficiente, rende un po 'più difficile la produzione di shellcode utili (a meno che tu non possa scrivere qualcosa con gli opcode rappresentati dall'asci di 0-9, che dubito ).
L'aggiunta, la moltiplicazione ecc. "non possono" eccedere, nel senso che gmp / mpir almeno non riuscirà ad allocare memoria sufficiente per il% target% di co_de e si fermerà qui.
Ci dovrebbe essere (c'è sicuramente una funzione di stampa) una funzione per leggere gli interi dalla rappresentazione del testo. Mi piacerebbe che tu lo usassi e usassi la corrispondente funzione di stampa per l'output. Sarai quindi in grado di gestire numeri fino ai limiti imposti dalla tua memoria mentre non scrivi assurdità arbitrarie alla memoria. Potresti voler controllare la documentazione di queste funzioni per verificare il loro comportamento su caratteri non interi / decimali.
Le eccezioni a virgola mobile non dovrebbero essere causate da alcuna libreria float mp, perché la dimensione interna / rappresentazione del float in questione non può comunque essere gestita dal processore. Se dai un'occhiata agli algoritmi (vedi algoritmi per APFPA usati in questo tipo di codice, vedrai che usano le normali operazioni di virgola mobile di precisione. Qualsiasi libreria decente dovrebbe davvero garantire che non causino un'eccezione di virgola mobile quando si lavora su "arti".