2011-01-31 13 views
7

Podejmuję kurs bezpieczeństwa, który wymaga od nas wykonania atrybutu ciąg znaków na maszynie wirtualnej unix. Luka w zabezpieczeniach to ciąg formatujący wykorzystujący argument wiersza poleceń.Jak zapisać wartość w adresie w ataku z ciągiem formatowym

Moje pytanie brzmi: jak mogę zapisać wartość w adresie w postaci ciągu znaków (np. Wpisać adres kodu powłoki do adresu zwrotnego funkcji)?

Na przykład próbuję zapisać wartość 987654 w lokalizacji adresu powrotu 0xaabbccdd. Próbowałem niektórych ciągów takich jak "AAAA_%10$x", a to może prowadzić program do drukowania AAAA_41414141.

Następnie zastępuję litery moim adresem i próbuję je zastąpić.

\xdd\xcc\xbb\xaa_%10$x_%54321x_%n" 

Ale to nie działa. Widzę artykuł mówi, że powinienem użyć mniejszej liczby w %54321x, ponieważ istnieje kilka znaków, które już napisałem, ale nie wiem, ile znaków napisałem przed %54321x, albo.

uwaga: Środowisko ma starą wersję gcc, więc nie trzeba martwić się, że wartość jest zbyt duża. Jakieś sugestie? Dzięki.

Odpowiedz

3

printf nie można pisać w dowolnym miejscu bez użycia specyfikatora formatu %n. To jest ten, którego brakuje. Coś takiego jak %.987654d%n zapisze numer 987654 (liczbę dotychczas wyprowadzonych znaków) na adres określony przez drugi argument, gdzie pierwszym argumentem jest int. To powinno wystarczyć, aby zacząć.

+0

'sprintf' zapisując do bufora znaków na stosie może być również użyty do szkodliwego uszkodzenia ... –

+0

@Oli: tak, ale to nie jest atak na ciąg formatowy, którego przypisanie OP wydaje się być o ... –

+0

A podany przez użytkownika ciąg znaków może zostać użyty do uszkodzenia. –

0

Luka w łańcuchach formatu jest wykorzystywana przez zmianę formatu drukowania ciągów funkcji printf i zapisanie pewnych wartości w pożądanej lokalizacji adresowej w pamięci. Proszę przeczytać this blog stanowiska do nauki, jak to zrobić

0

należy określić Wich przesunięcia stosu napisać wz% n formater jak %[offset]\$n

przykład: %23\$n

należy prawidłowo uzyskać prawo adres przez cheking wynik \ xDD \ XCC \xbb\xaa_%54321x_%[offset]\$x "można to zrobić z python lub bash skryptu

należy pobierać adres aabbccdd

Powiązane problemy