Integer Overflow
Last updated
Last updated
Impara e pratica Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Al centro di un overflow di interi c'è la limitazione imposta dalla dimensione dei tipi di dati nella programmazione informatica e dall'interpretazione dei dati.
Ad esempio, un intero senza segno a 8 bit può rappresentare valori da 0 a 255. Se tenti di memorizzare il valore 256 in un intero senza segno a 8 bit, si riavvolge a 0 a causa della limitazione della sua capacità di memorizzazione. Allo stesso modo, per un intero senza segno a 16 bit, che può contenere valori da 0 a 65.535, aggiungere 1 a 65.535 riporterà il valore a 0.
Inoltre, un intero con segno a 8 bit può rappresentare valori da -128 a 127. Questo perché un bit è utilizzato per rappresentare il segno (positivo o negativo), lasciando 7 bit per rappresentare la grandezza. Il numero più negativo è rappresentato come -128 (binario 10000000
), e il numero più positivo è 127 (binario 01111111
).
Per le potenziali vulnerabilità web è molto interessante conoscere i valori massimi supportati:
Il risultato stampato sarà 0 poiché abbiamo sovraccaricato il char:
Considera una situazione in cui un intero firmato viene letto dall'input dell'utente e poi utilizzato in un contesto che lo tratta come un intero non firmato, senza una corretta validazione:
In questo esempio, se un utente inserisce un numero negativo, verrà interpretato come un grande intero senza segno a causa del modo in cui i valori binari vengono interpretati, portando potenzialmente a comportamenti imprevisti.
Solo 1B è utilizzato per memorizzare la dimensione della password, quindi è possibile sovraccaricarlo e farlo pensare che la sua lunghezza sia 4 mentre in realtà è 260 per bypassare la protezione del controllo della lunghezza
Dati un paio di numeri, scopri usando z3 un nuovo numero che moltiplicato per il primo darà il secondo:
Solo 1B è utilizzato per memorizzare la dimensione della password, quindi è possibile sovraccaricarlo e farlo pensare che la sua lunghezza sia 4 mentre in realtà è 260 per bypassare la protezione del controllo della lunghezza e sovrascrivere nello stack la successiva variabile locale e bypassare entrambe le protezioni
Questo non cambia in ARM64 come puoi vedere in questo post del blog.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)