hacktricks/pentesting-web/integer-overflow.md

4.4 KiB

Estouro de Inteiro

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

{% tabs %} {% tab title="Rust" %}

fn main() {

let mut quantity = 2147483647;

let (mul_result, _) = i32::overflowing_mul(32767, quantity);
let (add_result, _) = i32::overflowing_add(1, quantity);

println!("{}", mul_result);
println!("{}", add_result);
}

{% endtab %}

{% tab title="C" %}

Transbordamento de Inteiro

Transbordamento de inteiro ocorre quando uma operação matemática resulta em um valor maior do que o máximo que pode ser representado pelo tipo de dado utilizado. Isso pode levar a comportamentos inesperados e potencialmente vulnerabilidades de segurança, como a possibilidade de alterar variáveis importantes na aplicação.

Exemplo

#include <stdio.h>

int main() {
    int a = 2147483647; // maior valor positivo que um int pode armazenar
    a = a + 1; // ocorre transbordamento de inteiro
    printf("Valor de a: %d\n", a);
    return 0;
}

Neste exemplo, a variável a atinge o valor máximo que um int pode armazenar e, ao adicionar 1, ocorre um transbordamento de inteiro, resultando em um valor negativo inesperado.

Mitigação

Para mitigar o transbordamento de inteiro, é importante validar entradas de usuário, verificar limites de variáveis e utilizar tipos de dados apropriados para as operações matemáticas necessárias. {% endtab %}

#include <stdio.h>
#include <limits.h>

int main() {
int a = INT_MAX;
int b = 0;
int c = 0;

b = a * 100;
c = a + 1;

printf("%d\n", INT_MAX);
printf("%d\n", b);
printf("%d\n", c);
return 0;
}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥