Integer Overflow
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
W sercu przepełnienia całkowitego leży ograniczenie narzucone przez rozmiar typów danych w programowaniu komputerowym oraz interpretację danych.
Na przykład, 8-bitowa liczba całkowita bez znaku może reprezentować wartości od 0 do 255. Jeśli spróbujesz przechować wartość 256 w 8-bitowej liczbie całkowitej bez znaku, zostanie ona zawinięta do 0 z powodu ograniczenia pojemności. Podobnie, dla 16-bitowej liczby całkowitej bez znaku, która może przechowywać wartości od 0 do 65,535, dodanie 1 do 65,535 spowoduje zawinięcie wartości z powrotem do 0.
Ponadto, 8-bitowa liczba całkowita ze znakiem może reprezentować wartości od -128 do 127. Dzieje się tak, ponieważ jeden bit jest używany do reprezentacji znaku (dodatniego lub ujemnego), pozostawiając 7 bitów do reprezentacji wartości. Najbardziej ujemna liczba jest reprezentowana jako -128 (binarne 10000000
), a najbardziej dodatnia liczba to 127 (binarne 01111111
).
Dla potencjalnych luk w zabezpieczeniach sieciowych bardzo interesujące jest poznanie maksymalnych wspieranych wartości:
Wydrukowany wynik będzie 0, ponieważ przepełniliśmy char:
Rozważ sytuację, w której liczba całkowita ze znakiem jest odczytywana z wejścia użytkownika, a następnie używana w kontekście, który traktuje ją jako liczbę całkowitą bez znaku, bez odpowiedniej walidacji:
W tym przykładzie, jeśli użytkownik wprowadzi liczbę ujemną, zostanie ona zinterpretowana jako duża liczba całkowita bez znaku z powodu sposobu interpretacji wartości binarnych, co może prowadzić do nieoczekiwanego zachowania.
Tylko 1B jest używane do przechowywania rozmiaru hasła, więc możliwe jest jego przepełnienie i sprawienie, że myśli, że ma długość 4, podczas gdy w rzeczywistości ma 260, aby obejść ochronę sprawdzania długości
Mając kilka liczb, znajdź za pomocą z3 nową liczbę, która pomnożona przez pierwszą da drugą:
Tylko 1B jest używane do przechowywania rozmiaru hasła, więc możliwe jest jego przepełnienie i sprawienie, że myśli, że ma długość 4, podczas gdy w rzeczywistości ma 260, aby obejść ochronę sprawdzania długości i nadpisać w stosie następną zmienną lokalną oraz obejść obie ochrony
To nie zmienia się w ARM64, jak można zobaczyć w tym wpisie na blogu.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)