mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 14:08:26 +00:00
141 lines
5.8 KiB
Markdown
141 lines
5.8 KiB
Markdown
|
# Integer Overflow
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
|
||
|
Other ways to support HackTricks:
|
||
|
|
||
|
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||
|
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||
|
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||
|
|
||
|
</details>
|
||
|
|
||
|
## Basic Information
|
||
|
|
||
|
At the heart of an integer overflow is the limitation imposed by the **size** of data types in computer programming and the **interpretation** of the data.
|
||
|
|
||
|
For example, an **8-bit unsigned integer** can represent values from **0 to 255**. If you attempt to store the value 256 in an 8-bit unsigned integer, it wraps around to 0 due to the limitation of its storage capacity. Similarly, for a **16-bit unsigned integer**, which can hold values from **0 to 65,535**, adding 1 to 65,535 will wrap the value back to 0.
|
||
|
|
||
|
Moreover, an **8-bit signed integer** can represent values from **-128 to 127**. This is because one bit is used to represent the sign (positive or negative), leaving 7 bits to represent the magnitude. The most negative number is represented as **-128** (binary `10000000`), and the most positive number is **127** (binary `01111111`).
|
||
|
|
||
|
### Max values
|
||
|
|
||
|
For potential **web vulnerabilities** it's very interesting to know the maximum supported values:
|
||
|
|
||
|
{% tabs %}
|
||
|
{% tab title="Rust" %}
|
||
|
```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" %}
|
||
|
```c
|
||
|
#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;
|
||
|
}
|
||
|
```
|
||
|
{% endtab %}
|
||
|
{% endtabs %}
|
||
|
|
||
|
## Examples
|
||
|
|
||
|
### Pure overflow
|
||
|
|
||
|
The printed result will be 0 as we overflowed the char:
|
||
|
|
||
|
```c
|
||
|
#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;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Signed to Unsigned Conversion
|
||
|
|
||
|
Consider a situation where a signed integer is read from user input and then used in a context that treats it as an unsigned integer, without proper validation:
|
||
|
|
||
|
```c
|
||
|
#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;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
In this example, if a user inputs a negative number, it will be interpreted as a large unsigned integer due to the way binary values are interpreted, potentially leading to unexpected behavior.
|
||
|
|
||
|
### Other Examples
|
||
|
|
||
|
* [https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/int\_overflow\_post/index.html)
|
||
|
* The program is only validating the lastbyte of a number to check for the size of the input, therefore it's possible to add any zie as long as the last byte is inside the allowed range. Then, the input creates a buffer overflow exploited with a ret2win.
|
||
|
* [https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html](https://guyinatuxedo.github.io/35-integer\_exploitation/puzzle/index.html)
|
||
|
* Given a couple of numbers find out using z3 a new number that multiplied by the first one will give the second one: 
|
||
|
|
||
|
```
|
||
|
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
|
||
|
```
|
||
|
|
||
|
\
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
<details>
|
||
|
|
||
|
<summary><strong>Learn AWS hacking from zero to hero with</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||
|
|
||
|
Other ways to support HackTricks:
|
||
|
|
||
|
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||
|
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||
|
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||
|
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||
|
|
||
|
</details>
|