Integer Overflow
Informações Básicas
No cerne de um estouro de inteiro está a limitação imposta pelo tamanho dos tipos de dados na programação de computadores e a interpretação dos dados.
Por exemplo, um inteiro sem sinal de 8 bits pode representar valores de 0 a 255. Se você tentar armazenar o valor 256 em um inteiro sem sinal de 8 bits, ele volta a 0 devido à limitação de sua capacidade de armazenamento. Da mesma forma, para um inteiro sem sinal de 16 bits, que pode conter valores de 0 a 65.535, adicionar 1 a 65.535 fará com que o valor volte a 0.
Além disso, um inteiro com sinal de 8 bits pode representar valores de -128 a 127. Isso ocorre porque um bit é usado para representar o sinal (positivo ou negativo), deixando 7 bits para representar a magnitude. O número mais negativo é representado como -128 (binário 10000000
), e o número mais positivo é 127 (binário 01111111
).
Valores Máximos
Para potenciais vulnerabilidades web, é muito interessante saber os valores máximos suportados:
Integer Overflow
Integer overflow occurs when an arithmetic operation results in a value that exceeds the maximum size that the data type can hold. This can lead to unexpected behavior and security vulnerabilities in software.
Example
In this example, x
is an unsigned integer with a maximum value of 4294967295. When 1 is added to x
, it overflows and the value becomes 0 due to the limited size of the data type.
Mitigation
To prevent integer overflow, always check the result of arithmetic operations to ensure that the value does not exceed the maximum limit of the data type. Using larger data types or libraries that handle overflow conditions can also help mitigate this issue.
```c #include #include
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; }
Conversão de Assinado para Não Assinado
Considere uma situação em que um inteiro assinado é lido a partir da entrada do usuário e depois usado em um contexto que o trata como um inteiro não assinado, sem uma validação adequada:
Neste exemplo, se um usuário inserir um número negativo, ele será interpretado como um grande inteiro não assinado devido à forma como os valores binários são interpretados, potencialmente levando a comportamentos inesperados.
Outros Exemplos
Apenas 1B é usado para armazenar o tamanho da senha, então é possível estourá-lo e fazer com que ele pense que tem um comprimento de 4, enquanto na verdade é 260 para burlar a proteção de verificação de comprimento.
Dados alguns números, descubra usando z3 um novo número que, multiplicado pelo primeiro, resultará no segundo:
Apenas 1B é usado para armazenar o tamanho da senha, então é possível estourá-lo e fazer com que ele pense que tem um comprimento de 4, enquanto na verdade é 260 para burlar a proteção de verificação de comprimento e sobrescrever na pilha a próxima variável local e burlar ambas as proteções
ARM64
Isso não muda no ARM64 como você pode ver neste post de blog.
Last updated