ACMM-033 <valhalla@interia.pl> napisał(a):
To dlaczego się uruchamia? Błąd programisty, że przepuścił dziurę?
Jak najbardziej. Generalnie chodzi o to, że może dojść do nadpisania miejsc
w pamięci kontrolujących sekwencje wykonywanych czynności (flow) programu.
Przykładowo przy wywołaniu funkcji program musi umieć z niej wrócić. Odkłada
więc na stosie adres powrotu. Na stosie mogą znaleźć się też bufory
alokowane przez program. Błąd programisty może spowodować, że dane np. z
pliku zostaną zapisane poza granicą bufora (nastąpi jego przepełnienie) i
zostanie nadpisany adres powrotu. Gdy funkcja się zakończy, program nie
wróci do miejsca z którego została wywołana funkcja, tylko skoczy gdzieś
indziej. A konkretnie pod adres, który został wczytany z pliku. Adres ten
może wskazywać na bufor i w buforze tym może być wczytany przez program kod
wykonywalny z otwartego pliku. Czyli atakujący musi stworzyć taki plik, że
po jego wczytaniu w pamięci programu znajdzie się kod wykonywalny i program
do niego skoczy i wykona go. Można też atakować inne miejsca, np. wskaźniki
na metody obiektu. Umieszczając w pamięci swój kod i napisując jeden ze
wskaźników tak, aby na ten kod pokazywał, można spowodować że zostanie on
wykonany. Tutaj wykorzystywany jest często błąd user after free, czyli
odwołania do obiektu, który niby został zniszczony, ale program nadal się do
niego odwołuje. Zniszczenie obiektu powoduje, że zajmowana przez niego
pamięć zostaje oznaczona jako wolna i atakujący może w tym miejscu umieścić
swój kod, np. technik heap spray. Przy próbie wywołania metody obiektu
zostanie wykonany kod atakującego.
Trudno to jasno opisać w krótki poście, odsyłam do mojego tekstu, do którego
link już dziś podawałem w tym wątku.
--
Grzegorz Niemirowski
http://www.grzegorz.net/
OE PowerTool i Outlook Express: http://www.grzegorz.net/oe/
Uptime: 51 days, 4 hours, 32 minutes and 24 seconds
|