6.8 KiB
Estouro de Inteiro
Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, verifique os PLANOS DE ASSINATURA!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.
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 possíveis vulnerabilidades web, é muito interessante saber os valores máximos suportados:
{% 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" %}
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
#include <stdio.h>
int main() {
unsigned int x = 4294967295; // Maximum value for an unsigned int
x = x + 1;
printf("Value of x: %u\n", x);
return 0;
}
In this example, adding 1 to the maximum value of an unsigned integer results in an integer overflow, causing x
to wrap around to 0.
Impact
Integer overflow can be exploited by attackers to manipulate the behavior of a program, potentially leading to security vulnerabilities such as buffer overflows, code execution, or denial of service.
To prevent integer overflow, developers should carefully validate input, use data types that can accommodate the expected range of values, and implement proper error handling mechanisms.
{% 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;
}
Exemplos
Overflow puro
O resultado impresso será 0, pois ocorreu um estouro no char:
#include <stdio.h>
int main() {
unsigned char max = 255; // 8-bit unsigned integer
unsigned char result = max + 1;
printf("Result: %d\n", result); // Expected to overflow
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 utilizado em um contexto que o trata como um inteiro não assinado, sem uma validação adequada:
#include <stdio.h>
int main() {
int userInput; // Signed integer
printf("Enter a number: ");
scanf("%d", &userInput);
// Treating the signed input as unsigned without validation
unsigned int processedInput = (unsigned int)userInput;
// A condition that might not work as intended if userInput is negative
if (processedInput > 1000) {
printf("Processed Input is large: %u\n", processedInput);
} else {
printf("Processed Input is within range: %u\n", processedInput);
}
return 0;
}
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
- https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html
- O programa está validando apenas o último byte de um número para verificar o tamanho da entrada, portanto é possível adicionar qualquer tamanho desde que o último byte esteja dentro da faixa permitida. Em seguida, a entrada cria um estouro de buffer explorado com um ret2win.
- https://guyinatuxedo.github.io/35-integer_exploitation/puzzle/index.html
- Dados um par de números, descubra usando z3 um novo número que, multiplicado pelo primeiro, resultará no segundo:
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
\
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, verifique os PLANOS DE ASSINATURA!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou nos siga no Twitter 🐦 @hacktricks_live.
- Compartilhe seus truques de hacking enviando PRs para os repositórios HackTricks e HackTricks Cloud.