Integer Overflow
Last updated
Last updated
Вивчайте та практикуйте хакінг AWS: Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте хакінг GCP: Навчання HackTricks GCP Red Team Expert (GRTE)
У центрі переповнення цілочисельних значень лежить обмеження, накладене розміром типів даних у програмуванні для комп'ютерів та інтерпретацією даних.
Наприклад, 8-бітне беззнакове ціле число може представляти значення від 0 до 255. Якщо ви спробуєте зберегти значення 256 у 8-бітному беззнаковому цілому числі, воно обертається до 0 через обмеження його місткості. Так само для 16-бітного беззнакового цілого числа, яке може утримувати значення від 0 до 65,535, додавання 1 до 65,535 призведе до обертання значення назад до 0.
Більше того, 8-бітне знакове ціле число може представляти значення від -128 до 127. Це тому, що один біт використовується для представлення знака (позитивний або від'ємний), залишаючи 7 біт для представлення величини. Найвід'ємніше число представлене як -128 (двійкове 10000000
), а найпозитивніше число - 127 (двійкове 01111111
).
Для потенційних вразливостей веб-додатків дуже цікаво знати максимально підтримувані значення:
```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; }
Розгляньте ситуацію, де знакове ціле число зчитується з введення користувача, а потім використовується в контексті, який розглядає його як беззнакове ціле число, без належної перевірки:
У цьому прикладі, якщо користувач вводить від'ємне число, воно буде інтерпретовано як велике беззнакове ціле через спосіб інтерпретації бінарних значень, що потенційно може призвести до непередбачуваної поведінки.
Лише 1B використовується для зберігання розміру пароля, тому можливе переповнення та змушення його вважати довжиною 4, хоча насправді вона 260, щоб обійти захист перевірки довжини
Задано кілька чисел, знайдіть за допомогою z3 нове число, яке помножене на перше, дасте друге:
Лише 1B використовується для зберігання розміру пароля, тому можливе переповнення та змушення його вважати довжиною 4, хоча насправді вона 260, щоб обійти захист перевірки довжини та перезаписати на стек наступну локальну змінну та обійти обидва захисти
Це не змінюється в ARM64, як можна побачити в цьому блозі.