SlideShare a Scribd company logo
1 of 51
Download to read offline
IDZ DO
         PRZYK£ADOWY ROZDZIA£

                           SPIS TRE CI   The Shellcoders Handbook.
                                         Edycja polska
           KATALOG KSI¥¯EK               Autorzy: J. Koziol, D. Litchfield, D. Aitel,
                                         Ch. Anley, S. Eren, N. Mehta, R. Hassell
                      KATALOG ONLINE     T³umaczenie: Jaromir Senczyk
                                         ISBN: 83-7361-597-0
       ZAMÓW DRUKOWANY KATALOG           Tytu³ orygina³u: The Shellcoders Handbook
                                         Format: B5, stron: 560
                                         Przyk³ady na ftp: 165 kB
              TWÓJ KOSZYK
                                            Usuñ luki w zabezpieczeniach programów i systemów operacyjnych
                    DODAJ DO KOSZYKA        • Poznaj przyczyny powstawania luk
                                            • Naucz siê sposobów w³amañ do systemów
                                            • Podejmij odpowiednie rodki zapobiegawcze
         CENNIK I INFORMACJE             Niemal co tydzieñ dowiadujemy siê o nowych „³atach” usuwaj¹cych luki
                                         w zabezpieczeniach systemów operacyjnych i programów. Niestety — czêsto, zanim ³ata
                   ZAMÓW INFORMACJE      zostanie rozpowszechniona i zainstalowana na komputerach, kto wykorzysta „dziurê”
                     O NOWO CIACH        w systemie i w³amie siê do niego. Có¿ wiêc zrobiæ, aby zabezpieczyæ swoje dane przez
                                         atakiem hakera? Jak znale æ s³abe punkty zabezpieczeñ i usun¹æ je? W jaki sposób
                       ZAMÓW CENNIK      zaimplementowaæ odpowiednie zabezpieczenia w tworzonym przez siebie
                                         oprogramowaniu?
                                         Ksi¹¿ka „The Shellcoder’s handbook. Edycja polska” zawiera odpowiedzi na wszystkie
                 CZYTELNIA               te pytania. Ksi¹¿ka bêd¹ca efektem pracy zespo³u z³o¿onego ze specjalistów w zakresie
                                         bezpieczeñstwa systemów komputerowych, analityków i hakerów przedstawia sposoby
          FRAGMENTY KSI¥¯EK ONLINE
                                         wykrywania s³abych punktów oprogramowania tworzonego w jêzyku C i sprawdzenia
                                         mo¿liwo ci ich wykorzystania. Opisuje luki w istniej¹cych systemach i programach
                                         oraz sposoby ich zabezpieczenia. Zawarte w niej wiadomo ci pozwol¹ na tworzenie
                                         w³asnych systemów wykrywania b³êdów i pomog¹ ustaliæ, czy b³êdy te stanowi¹
                                         potencjalne zagro¿enie.
                                            • Podstawowe metody w³amañ do ró¿nych systemów operacyjnych
                                            • Techniki przepe³niania stosu, wykorzystywania kodu pow³oki
                                              i b³êdów ³añcuchów formatuj¹cych
                                            • Kontrola s³abych punktów programów metodami wstrzykiwania kodu i fuzzingu
                                            • Kontrola kodu ród³owego programów
                                            • Klasy b³êdów
Wydawnictwo Helion                          • Sposoby ledzenia s³abych punktów
ul. Chopina 6                               • Analiza kodu binarnego
44-100 Gliwice                              • Tworzenie eksploitów
tel. (32)230-98-63                          • Ataki na systemy zarz¹dzania bazami danych
e-mail: helion@helion.pl
Spis treści
                O Autorach ...................................................................................... 13

Część I         Wprowadzenie do metod włamań:
                Linux na procesorach x86 ..............................................15
Rozdział 1. Wprowadzenie ................................................................................. 17
                Podstawowe pojęcia ........................................................................................................ 17
                   Zarządzanie pamięcią................................................................................................ 18
                   Asembler ................................................................................................................... 20
                Rozpoznawanie przekładu kodu C++ w języku asemblera.............................................. 21
                Podsumowanie ................................................................................................................ 23
Rozdział 2. Przepełnienia stosu.......................................................................... 25
                Bufory ............................................................................................................................. 25
                Stos.................................................................................................................................. 27
                    Wywołania funkcji i stos........................................................................................... 28
                Przepełnianie buforów na stosie ...................................................................................... 31
                    Wykorzystanie rejestru EIP....................................................................................... 32
                Zdobywanie uprawnień root............................................................................................ 34
                    Problem adresu.......................................................................................................... 36
                    Metoda rozkazów NOP ............................................................................................. 39
                Stos zabraniający wykonywania rozkazów ..................................................................... 41
                    Metoda powrotu do biblioteki libc ............................................................................ 41
                Podsumowanie ................................................................................................................ 44
Rozdział 3. Kod powłoki..................................................................................... 45
                Wywołania systemowe.................................................................................................... 46
                Kod powłoki u ywający wywołania systemowego exit()................................................ 48
                Wstrzykiwanie kodu powłoki.......................................................................................... 51
                Tworzenie nowej powłoki ............................................................................................... 53
                Podsumowanie ................................................................................................................ 61
Rozdział 4. Błędy łańcuchów formatujących ....................................................... 63
                Warunki wstępne............................................................................................................. 63
                Łańcuchy formatujące ..................................................................................................... 63
                Błędy łańcuchów formatujących ..................................................................................... 65
6                                                                              The Shellcoder's Handbook. Edycja polska


               Włamania za pomocą łańcuchów formatujących............................................................. 69
                   Atak na usługę........................................................................................................... 70
                   Ujawnianie informacji............................................................................................... 71
               Przejęcie sterowania ........................................................................................................ 76
               Jak to mo liwe? ............................................................................................................... 85
               Przegląd technik łańcucha formatującego ....................................................................... 85
               Podsumowanie ................................................................................................................ 88
Rozdział 5. Wprowadzenie do metod przepełnienia sterty.................................... 89
               Sterta ............................................................................................................................... 89
                   Zarządzanie stertą...................................................................................................... 91
               Wyszukiwanie przepełnień sterty .................................................................................... 91
                   Podstawowe metody przepełniania sterty.................................................................. 92
                   Średnio zaawansowane metody przepełniania stosu ................................................. 98
                   Zaawansowane przepełnienia sterty ........................................................................ 104
               Podsumowanie .............................................................................................................. 105

Część II       Włamania na platformach Windows, Solaris i Tru64.......107
Rozdział 6. Wprowadzenie do systemu Windows............................................... 109
               Ró nice między systemami Linux i Windows............................................................... 109
                   Win32 i PE-COFF................................................................................................... 110
               Sterty ............................................................................................................................. 112
                   Wątki....................................................................................................................... 113
               Zalety i wady DCOM i DCE-RPC ................................................................................ 114
                   Rozpoznanie............................................................................................................ 116
                   Włamania ................................................................................................................ 117
                   Tokeny i podszywanie............................................................................................. 118
                   Obsługa wyjątków w Win32 ................................................................................... 120
               Śledzenie działania programów w systemie Windows .................................................. 121
                   Błędy w Win32 ....................................................................................................... 122
                   Tworzenie kodu powłoki w systemie Windows...................................................... 122
                   Przewodnik hakera po funkcjach Win32................................................................. 123
                   Rodzina systemów Windows z punktu widzenia hakera......................................... 123
               Podsumowanie .............................................................................................................. 124
Rozdział 7. Kody powłoki w Windows ............................................................... 125
               Składnia i filtry.............................................................................................................. 125
               Przygotowywanie kodu powłoki ................................................................................... 126
               Parsowanie bloków PEB ............................................................................................... 127
                   Analiza kodu heapoverflow.c.................................................................................. 128
               Przeszukiwanie z u yciem obsługi wyjątków................................................................ 143
               Tworzenie nowej powłoki ............................................................................................. 146
                   Dlaczego nie warto tworzyć nowej powłoki w Windows ....................................... 147
               Podsumowanie .............................................................................................................. 148
Rozdział 8. Przepełnienia w systemie Windows................................................. 149
               Przepełnienia buforów na stosie .................................................................................... 149
                   Procedury obsługi wyjątków dla ramek wywołań funkcji....................................... 150
                   Wykorzystanie procedur obsługi wyjątków na platformie Windows 2003 Server.. 154
                   Końcowe uwagi na temat nadpisań procedur obsługi wyjątków ............................. 158
               Ochrona stosu i Windows 2003 Server ......................................................................... 159
               Przepełnienia sterty ....................................................................................................... 164
                   Sterta procesu.......................................................................................................... 164
                   Sterty dynamiczne................................................................................................... 165
Spis treści                                                                                                                                       7


                     Korzystanie ze sterty ............................................................................................... 165
                     Jak działa sterta ....................................................................................................... 165
                 Wykorzystanie przepełnień sterty.................................................................................. 168
                     Nadpisanie wskaźnika funkcji RtlEnterCriticalSection w bloku PEB..................... 169
                     Nadpisanie wskaźnika pierwszej wektoryzowanej procedury obsługi wyjątków
                       pod adresem 77FC3210 ........................................................................................ 171
                     Nadpisanie wskaźnika filtra nieobsłu onych wyjątków .......................................... 174
                     Nadpisanie wskaźnika procedury obsługi wyjątków w bloku TEB ........................ 179
                     Naprawa sterty ........................................................................................................ 180
                     Inne aspekty przepełnień sterty ............................................................................... 182
                     Podsumowanie przepełnień sterty ........................................................................... 183
                 Inne przepełnienia ......................................................................................................... 183
                     Przepełnienia sekcji .data ........................................................................................ 183
                     Przepełnienia bloków TEB i PEB ........................................................................... 185
                 Przepełnienie buforów i stosy zabraniające wykonania kodu........................................ 185
                 Podsumowanie .............................................................................................................. 190
Rozdział 9. Filtry ............................................................................................. 191
                 Tworzenie eksploitów i filtry alfanumeryczne .............................................................. 191
                 Tworzenie eksploitów i filtry Unicode .......................................................................... 195
                    Unicode................................................................................................................... 195
                    Konwersja z ASCII na Unicode .............................................................................. 196
                 Wykorzystanie słabych punktów związanych z kodem Unicode .................................. 196
                    Zbiór rozkazów dostępnych dla eksploitów Unicode.............................................. 197
                 Metoda wenecka............................................................................................................ 198
                    Implementacja metody weneckiej dla kodu ASCII ................................................. 199
                 Dekoder i dekodowanie................................................................................................. 202
                    Kod dekodera .......................................................................................................... 203
                    Ustalenie adresu bufora........................................................................................... 204
                 Podsumowanie .............................................................................................................. 205
Rozdział 10. Wprowadzenie do włamań w systemie Solaris ................................. 207
                 Wprowadzenie do architektury SPARC ........................................................................ 208
                     Rejestry i okna rejestrów......................................................................................... 208
                     Szczelina zwłoki ..................................................................................................... 210
                     Rozkazy zło one ..................................................................................................... 211
                 Kody powłoki na platformie Solaris/SPARC ................................................................ 211
                     Kod powłoki i określanie własnego poło enia ........................................................ 212
                     Prosty kod powłoki dla platformy SPARC.............................................................. 212
                     Przydatne wywołania systemu Solaris .................................................................... 213
                     Rozkaz NOP i rozkazy wypełniające ...................................................................... 214
                 Ramki na stosie platformy Solaris/SPARC ................................................................... 214
                 Techniki przepełnień stosu ............................................................................................ 215
                     Przepełnienia o dowolnym rozmiarze ..................................................................... 215
                     Okna rejestrów komplikują przepełnienia stosu...................................................... 216
                     Inne czynniki utrudniające przepełnienia stosu....................................................... 216
                     Mo liwe rozwiązania .............................................................................................. 217
                     Przepełnienia jednym bajtem .................................................................................. 217
                     Poło enie kodu powłoki .......................................................................................... 218
                 Przykłady przepełnień stosu .......................................................................................... 219
                     Atakowany program................................................................................................ 219
                     Eksploit ................................................................................................................... 221
                 Przepełnienia sterty na platformie Solaris/SPARC........................................................ 224
                     Wprowadzenie do sterty systemu Solaris................................................................ 224
                     Struktura drzewa sterty............................................................................................ 225
8                                                                            The Shellcoder's Handbook. Edycja polska


               Metoda podstawowa (t_delete)...................................................................................... 243
                   Ograniczenia standardowych przepełnień sterty ..................................................... 246
                   Cele nadpisań .......................................................................................................... 247
               Inne słabe punkty sterty................................................................................................. 249
                   Przepełnienia jednym bajtem .................................................................................. 250
                   Podwójne zwolnienie .............................................................................................. 250
                   Inne błędy funkcji free().......................................................................................... 250
               Przykład przepełnienia sterty......................................................................................... 251
                   Atakowany program................................................................................................ 251
               Inne techniki włamań w systemie Solaris...................................................................... 255
                   Przepełnienia danych statycznych........................................................................... 255
                   Obejście zabezpieczenia stosu................................................................................. 255
               Podsumowanie .............................................................................................................. 256
Rozdział 11. Zaawansowane metody włamań w systemie Solaris........................ 257
               Śledzenie modułu dynamicznej konsolidacji krok po kroku ......................................... 258
               Sztuczki przepełnień sterty Solaris/SPARC .................................................................. 271
               Zaawansowany kod powłoki na platformie Solaris/SPARC ......................................... 273
               Podsumowanie .............................................................................................................. 284
Rozdział 12. Włamania w systemie HP Tru64 Unix ............................................. 285
               Architektura procesorów Alpha..................................................................................... 286
                   Rejestry procesorów Alpha ..................................................................................... 286
                   Zbiór rozkazów ....................................................................................................... 287
                   Konwencje wywołań............................................................................................... 287
               Pobieranie licznika rozkazów (GetPC).......................................................................... 289
               Wywołania systemowe.................................................................................................. 291
               Dekoder XOR dla kodu powłoki ................................................................................... 291
               Kod powłoki setuid + execve ........................................................................................ 293
                   Wywołania systemowe setuid(0) i execve("/bin/sh", ...) ......................................... 293
                   Kompilacja kodu w asemblerze i wyodrębnienie kodu powłoki ............................. 294
                   Kodowanie uzyskanych kodów powłoki funkcją XOR........................................... 295
                   Dołączenie zakodowanego kodu do dekodera XOR ............................................... 296
                   Kompilacja i wyodrębnienie ostatecznej postaci kodu powłoki.............................. 297
               Kod powłoki zestawiający połączenie zwrotne ............................................................. 299
               Kod powłoki wyszukujący gniazdo sieciowe ................................................................ 300
               Kod powłoki dowiązujący gniazdo sieciowe................................................................. 301
               Przepełnienia stosu........................................................................................................ 303
                   Obejście ochrony stosu ........................................................................................... 303
               Włamanie do usługi rpc.ttdbserver ................................................................................ 304
               Podsumowanie .............................................................................................................. 311

Część III Wykrywanie słabych punktów .......................................313
Rozdział 13. Tworzenie środowiska pracy........................................................... 315
               Źródła informacji........................................................................................................... 316
               Narzędzia do tworzenia kodu ........................................................................................ 316
                  gcc........................................................................................................................... 316
                  gdb .......................................................................................................................... 317
                  NASM ..................................................................................................................... 317
                  WinDbg................................................................................................................... 317
                  OllyDbg................................................................................................................... 317
                  SoftICE ................................................................................................................... 318
                  Visual C++.............................................................................................................. 318
                  Python ..................................................................................................................... 318
Spis treści                                                                                                                                        9


                 Narzędzia śledzenia kodu .............................................................................................. 318
                    Własne skrypty........................................................................................................ 318
                    Wszystkie platformy ............................................................................................... 320
                    Unix ........................................................................................................................ 320
                    Windows ................................................................................................................. 321
                 Artykuły, które powinieneś przeczytać ......................................................................... 322
                    Archiwa artykułów.................................................................................................. 324
                 Optymalizacja procesu tworzenia kodu powłoki ........................................................... 325
                    Plan eksploitu.......................................................................................................... 325
                    Tworzenie kodu powłoki za pomocą asemblera wbudowanego w kompilator........ 325
                    Biblioteka kodów powłoki ...................................................................................... 327
                    Kontynuacja działania atakowanego procesu.......................................................... 327
                    Zwiększanie stabilności eksploitu ........................................................................... 328
                    Wykorzystanie istniejącego połączenia................................................................... 329
                 Podsumowanie .............................................................................................................. 330
Rozdział 14. Wstrzykiwanie błędów.................................................................... 331
                 Ogólny projekt systemu................................................................................................. 332
                    Generowanie danych wejściowych ......................................................................... 332
                    Wstrzykiwanie błędów............................................................................................ 335
                    Moduł modyfikacji.................................................................................................. 335
                    Dostarczanie błędów do aplikacji............................................................................ 339
                    Algorytm Nagla....................................................................................................... 340
                    Zale ności czasowe................................................................................................. 340
                    Heurystyki............................................................................................................... 340
                    Protokoły ze stanem i bez........................................................................................ 341
                 Monitorowanie błędów.................................................................................................. 341
                    Wykorzystanie programu uruchomieniowego......................................................... 341
                    FaultMon................................................................................................................. 342
                 Kompletna aplikacja testująca ....................................................................................... 342
                 Podsumowanie .............................................................................................................. 343
Rozdział 15. Fuzzing.......................................................................................... 345
                 Ogólna teoria fuzzingu .................................................................................................. 345
                     Analiza statyczna kontra fuzzing............................................................................. 349
                     Fuzzing jest skalowalny .......................................................................................... 349
                 Wady fuzzerów ............................................................................................................. 351
                 Modelowanie dowolnych protokołów sieciowych ........................................................ 352
                 Inne technologie fuzzerów ............................................................................................ 352
                     Migotanie bitów ...................................................................................................... 353
                     Modyfikacja programów open source ..................................................................... 353
                     Fuzzing i analiza dynamiczna ................................................................................. 353
                 SPIKE............................................................................................................................ 354
                     Jak działa SPIKE?................................................................................................... 354
                     Zalety stosowania struktur programu SPIKE
                       do modelowania protokołów sieciowych.............................................................. 355
                 Inne fuzzery................................................................................................................... 362
                 Podsumowanie .............................................................................................................. 362
Rozdział 16. Kontrola kodu źródłowego .............................................................. 363
                 Narzędzia....................................................................................................................... 364
                    Cscope..................................................................................................................... 364
                    Ctags ....................................................................................................................... 365
                    Edytory.................................................................................................................... 365
                    Cbrowser ................................................................................................................. 365
10                                                                            The Shellcoder's Handbook. Edycja polska


               Zautomatyzowane narzędzia kontroli kodu źródłowego ............................................... 366
               Metodologia .................................................................................................................. 367
                   Metoda zstępująca................................................................................................... 367
                   Metoda wstępująca.................................................................................................. 367
                   Metoda selektywna.................................................................................................. 367
               Klasy błędów................................................................................................................. 368
                   Ogólne błędy logiki................................................................................................. 368
                   (Prawie) wymarłe klasy błędów .............................................................................. 368
                   Błędy łańcuchów formatujących ............................................................................. 369
                   Ogólne błędy określenia zakresu............................................................................. 370
                   Pętle ........................................................................................................................ 371
                   Przepełnienia jednym bajtem .................................................................................. 372
                   Błędy braku zakończenia łańcucha ......................................................................... 373
                   Błędy przeskoczenia bajtu zerowego ...................................................................... 374
                   Błędy porównania wartości ze znakiem .................................................................. 375
                   Błędy związane z wartościami całkowitymi............................................................ 376
                   Konwersje wartości całkowitych o ró nej reprezentacji ......................................... 378
                   Błędy podwójnego zwolnienia ................................................................................ 379
                   U ycie obszarów pamięci poza okresem ich wa ności ........................................... 380
                   U ycie niezainicjowanych zmiennych .................................................................... 380
                   Błędy u ycia po zwolnieniu .................................................................................... 381
                   Wielowątkowość i kod wielobie ny........................................................................ 382
               Słabe punkty i zwykłe błędy.......................................................................................... 382
               Podsumowanie .............................................................................................................. 383
Rozdział 17. Ręczne wykrywanie błędów ............................................................ 385
               Filozofia ........................................................................................................................ 385
               Przepełnienie extproc systemu Oracle........................................................................... 386
               Typowe błędy architektury............................................................................................ 390
                   Problemy pojawiają się na granicach ...................................................................... 390
                   Problemy pojawiają się podczas przekładu danych................................................. 391
                   Problemy występują w obszarach asymetrii............................................................ 393
                   Problemy uwierzytelniania i autoryzacji ................................................................. 393
                   Problemy występują w najbardziej oczywistych miejscach .................................... 394
               Obejście kontroli danych wejściowych i wykrywanie ataku ......................................... 394
                   Filtrowanie niedozwolonych danych....................................................................... 395
                   Zastosowanie alternatywnego kodowania ............................................................... 395
                   Dostęp do plików .................................................................................................... 396
                   Unikanie sygnatur ataków ....................................................................................... 398
                   Pokonywanie ograniczeń długości .......................................................................... 398
               Atak typu DOS na implementację SNMP w Windows 2000 ........................................ 400
               Wykrywanie ataków typu DOS..................................................................................... 401
               SQL-UDP...................................................................................................................... 402
               Podsumowanie .............................................................................................................. 403
Rozdział 18. Śledzenie słabych punktów ............................................................ 405
               Wprowadzenie............................................................................................................... 406
                  Przykładowy program zawierający słaby punkt ...................................................... 406
                  Projekt komponentów ............................................................................................. 409
                  Budujemy VulnTrace .............................................................................................. 416
                  Posługiwanie się biblioteką VulnTrace ................................................................... 421
                  Techniki zaawansowane.......................................................................................... 424
               Podsumowanie .............................................................................................................. 425
Spis treści                                                                                                                                    11


Rozdział 19. Audyt kodu binarnego .................................................................... 427
               Audyt kodu binarnego i kontrola kodu źródłowego — podobieństwa i ró nice............ 427
               IDA Pro ......................................................................................................................... 428
                  Krótki kurs obsługi.................................................................................................. 429
                  Symbole uruchomieniowe....................................................................................... 430
               Wprowadzenie do audytu kodu binarnego .................................................................... 430
                  Ramki stosu............................................................................................................. 430
                  Konwencje wywołań............................................................................................... 432
                  Kod generowany przez kompilator ......................................................................... 433
                  Konstrukcje typu memcpy ...................................................................................... 436
                  Konstrukcje typu strlen ........................................................................................... 437
                  Konstrukcje języka C++.......................................................................................... 438
                  Wskaźnik this.......................................................................................................... 438
               Odtwarzanie definicji klas............................................................................................. 438
                  Tablice funkcji wirtualnych .................................................................................... 439
                  Proste, ale przydatne wskazówki............................................................................. 440
               Ręczna analiza kodu binarnego ..................................................................................... 440
                  Szybka weryfikacja wywołań bibliotecznych ......................................................... 440
                  Podejrzane pętle i rozkazy zapisu ........................................................................... 440
                  Błędy logiki............................................................................................................. 441
                  Graficzna analiza kodu binarnego........................................................................... 442
                  Ręczna dekompilacja .............................................................................................. 442
               Przykłady analizy kodu binarnego ................................................................................ 443
                  Błędy serwera Microsoft SQL................................................................................. 443
                  Błąd RPC-DCOM wykryty przez grupę LSD ......................................................... 444
                  Błąd IIS WebDAV .................................................................................................. 444
               Podsumowanie .............................................................................................................. 446

Część IV Techniki zaawansowane ...............................................447
Rozdział 20. Alternatywne strategie eksploitów ................................................. 449
               Modyfikacja programu .................................................................................................. 450
               Modyfikacja 3 bajtów kodu systemu SQL Server ......................................................... 450
               MySQL i modyfikacja 1 bitu......................................................................................... 454
               Modyfikacja uwierzytelniania RSA w OpenSSH.......................................................... 456
               Inne koncepcje modyfikacji działającego kodu............................................................. 457
                   Modyfikacja generatora losowego w GPG 1.2.2..................................................... 458
               Serwer progletów .......................................................................................................... 459
               Proxy wywołań systemowych ....................................................................................... 459
               Problemy związane z proxy wywołań systemowych..................................................... 461
               Podsumowanie .............................................................................................................. 470
Rozdział 21. Eksploity działające w rzeczywistym środowisku ............................. 471
               Czynniki wpływające na niezawodność ........................................................................ 471
                  Magiczne adresy...................................................................................................... 471
                  Problem wersji ........................................................................................................ 472
                  Problemy kodu powłoki .......................................................................................... 473
               Środki zaradcze ............................................................................................................. 475
                  Przygotowanie......................................................................................................... 476
                  Metoda pełnego przeglądu ...................................................................................... 476
                  Lokalny eksploit...................................................................................................... 477
                  Sygnatury systemów i aplikacji............................................................................... 477
                  Wycieki informacji.................................................................................................. 479
               Podsumowanie .............................................................................................................. 479
12                                                                            The Shellcoder's Handbook. Edycja polska


Rozdział 22. Ataki na systemy baz danych ......................................................... 481
                Ataki w warstwie sieciowej........................................................................................... 482
                Ataki w warstwie aplikacji ............................................................................................ 491
                Wykonywanie poleceń systemu operacyjnego .............................................................. 491
                   Microsoft SQL Server ............................................................................................. 492
                   Oracle...................................................................................................................... 492
                   IBM DB2 ................................................................................................................ 493
                Wykorzystanie przepełnień na poziomie języka SQL ................................................... 495
                   Funkcje języka SQL................................................................................................ 496
                Podsumowanie .............................................................................................................. 497
Rozdział 23. Przepełnienia jądra......................................................................... 499
                Typy słabych punktów jądra ......................................................................................... 499
                Słabe punkty jądra ......................................................................................................... 507
                    Przepełnienie stosu przez wywołanie exec_ibcs2_coff_prep_zmagic()
                     w systemie OpenBSD ........................................................................................... 507
                    Słaby punkt ............................................................................................................. 508
                Funkcja vfs_getvfssw() i mo liwość przeglądania modułów jądra w systemie Solaris .. 512
                    Wywołanie systemowe sysfs() ................................................................................ 514
                    Wywołanie systemowe mount().............................................................................. 514
                Podsumowanie .............................................................................................................. 515
Rozdział 24. Wykorzystanie słabych punktów jądra ............................................ 517
                Słaby punkt funkcji exec_ibcs2_coff_prep_zmagic().................................................... 517
                    Wyznaczenie przesunięć i adresów pułapek ........................................................... 522
                    Nadpisanie adresu powrotu i przejęcie sterowania.................................................. 523
                    Wyszukiwanie deskryptora procesu (lub struktury proc) ........................................ 524
                    Kod eksploitu wykonywany w trybie jądra............................................................. 526
                    Powrót kodu wykonywanego na poziomie jądra..................................................... 528
                    Uzyskanie uprawnień root (uid=0).......................................................................... 533
                Eksploit słabego punktu funkcji vfs_getvfssw() systemu Solaris.................................. 538
                    Eksploit ................................................................................................................... 539
                    Moduł jądra............................................................................................................. 540
                    Uzyskanie uprawnień root (uid=0).......................................................................... 543
                Podsumowanie .............................................................................................................. 544

Dodatki .......................................................................................545
                Skorowidz ..................................................................................... 547
Rozdział 8.
Przepełnienia
w systemie Windows
   Zakładamy, e Czytelnik przystępujący do lektury tego rozdziału posiada przynajmniej
   podstawową znajomość systemu Windows NT lub jego późniejszych wersji, a tak e
   zna sposoby wykorzystywania przepełnień buforów na tej platformie. W rozdziale omó-
   wimy bardziej zaawansowane aspekty przepełnień w systemie Windows, na przykład
   związane z obchodzeniem zabezpieczeń stosu zastosowanych w systemie Windows
   2003 Server czy przepełnieniami sterty. Zrozumienie tych zagadnień wymagać będzie
   znajomości kluczowych rozwiązań zastosowanych na platformie Windows, takich jak
   bloki TEB (Thread Environment Block) i PEB (Process Environment Block), a tak e
   struktury pamięci procesów, plików wykonywalnych oraz nagłówków PE. Jeśli któreś
   z tych pojęć są obce Czytelnikowi, to przed przystąpieniem do lektury tego rozdziału
   powinien uzupełnić wiadomości w tym zakresie.

   W rozdziale będziemy korzystać z narzędzi wchodzących w skład pakietu Visual Studio 6
   firmy Microsoft, w szczególności z programu uruchomieniowego MSDEV, kompilatora
   języka C wywoływanego z wiersza poleceń (cl) oraz programu dumpbin. Program
   dumpbin jest doskonałym narzędziem uruchamianym z wiersza poleceń — wyświetla
   wszelkie informacje o plikach binarnych, tabelach importu i eksportu, sekcjach pli-
   ków oraz kodzie w asemblerze. Czytelnikom, którzy wolą posługiwać się narzędziem
   wyposa onym w graficzny interfejs u ytkownika, proponujemy doskonały deasembler
   firmy Datarescue o nazwie IDA Pro. Tworząc kod eksploitów na platformie Windows,
   mo emy korzystać ze składni asemblera zgodnej z przyjętą przez firmę Intel bądź za-
   proponowanej przez AT&T. Wybór zale y od indywidualnych upodobań i preferencji.



Przepełnienia buforów na stosie
   Metoda przepełniania buforów znana jest ju od wielu lat i z pewnością będzie wykorzy-
   stywana równie w przyszłości. I nadal za ka dym razem, gdy jest wykrywana w nowo-
   czesnym oprogramowaniu, nie wiadomo, czy śmiać się, czy płakać. Tak czy owak, błędy
150                            Część II ♦ Włamania na platformach Windows, Solaris i Tru64


        te stanowią doskonałą po ywkę dla początkujących hakerów. W sieci Internet dostęp-
        nych jest wiele dokumentów szczegółowo opisujących sposoby wykorzystywania prze-
        pełnień buforów. Omówiliśmy je równie w pierwszych rozdziałach tej ksią ki, dlate-
        go teraz nie będziemy ju powtarzać tych informacji.

        Typowy eksploit bazujący na przepełnieniu stosu doprowadza do nadpisania adresu po-
        wrotu zapisanego na stosie adresem, który wskazuje rozkaz lub blok kodu przekazujący
        sterowanie do kodu umieszczonego w buforze u ytkownika. Zanim zajmiemy się po-
        głębieniem tego zagadnienia, krótko omówimy procedury obsługi wyjątków bazujących
        na ramkach stosu. Następnie przyjrzymy się sposobom nadpisywania struktur rejestracji
        wyjątków na stosie i poka emy, w jaki sposób technika taka mo e prowadzić do obej-
        ścia zabezpieczeń stosu wbudowanych w system Windows 2003 Server.


Procedury obsługi wyjątków
dla ramek wywołań funkcji
        Procedura obsługi wyjątków jest fragmentem kodu, który zostaje wywołany na
        skutek pojawienia się problemu podczas wykonania procesu, na przykład naruszenia
        uprawnień dostępu bądź wykonania dzielenia przez zero. Procedury obsługi wyjątków
        mogą być powiązane z konkretnymi funkcjami. Wywołanie ka dej funkcji prowadzi
        do utworzenia na stosie odpowiadającej jej ramki wywołania. Informacja o procedurze
        obsługi wyjątków mo e zostać umieszczona w ramce wywołania w strukturze ':%'26+10A
        4')+564#6+10. Struktura taka składa się z dwóch elementów: wskaźnika następnej
        struktury ':%'26+10A4')+564#6+10 oraz wskaźnika właściwej procedury obsługi wy-
        jątków. W ten sposób procedury obsługi wyjątków mogą tworzyć listę przedstawioną
        na rysunku 8.1.

Rysunek 8.1.
Procedury obsługi
wyjątków dla ramek
wywołań funkcji
Rozdział 8. ♦ Przepełnienia w systemie Windows                                          151


       Ka dy wątek procesu Win32 posiada przynajmniej jedną procedurę obsługi wyjątków.
       Procedura ta tworzona jest podczas uruchamiania wątku. Adres pierwszej struktury
       ':%'26+10A4')+564#6+10 znajduje się w ka dym bloku TEB pod adresem HU=?. W mo-
       mencie wystąpienia wyjątków lista procedur obsługi przeglądana jest do momentu zna-
       lezienia właściwej procedury obsługi wyjątku (czyli takiej, która zajmie się obsługą
       wyjątku). Obsługa wyjątków w oparciu o ramki na stosie odbywa się na poziomie ję-
       zyka C za pomocą słów kluczowych VT[ i GZEGRV. Przypominamy, e większość kodów
       przedstawionych w tej ksią ce dostępna jest pod adresem ftp://ftp.helion.pl/przyklady/
       hell.zip
              KPENWFG UVFKQJ
              KPENWFG YKPFQYUJ

          FYQTF /['ZEGRVKQP*CPFNGT
XQKF
          ]
                       RTKPVH
 +P GZEGRVKQP JCPFNGT 
                       'ZKV2TQEGUU

                       TGVWTP 
          _

          KPV OCKP

          ]
                          VT[
                          ]
                                   AACUO
          ]
                  RQYQFWLG Y[LæVGM
                                           ZQT GCZGCZ
                                           ECNN GCZ
          _

                        _
                        AAGZEGRV
/['ZEGRVKQP*CPFNGT

                        ]
                                 RTKPVH
 QQRU 
                          _
                          TGVWTP 
          _

       Jeśli w bloku umieszczonym wewnątrz VT[ wystąpi wyjątek, to wywołana zostanie
       funkcja /['ZEGRVKQP*CPFNGT. W przykładzie tym celowo wywołujemy wyjątek, zeru-
       jąc zawartość rejestru '#:, a następnie wykonując rozkaz ECNN GCZ.

       Podczas przepełniania bufora na stosie i nadpisywania adresu powrotu mogą równie
       ulec nadpisaniu inne zmienne, co mo e być przyczyną komplikacji podczas włama-
       nia. Załó my na przykład, e funkcja odwołuje się do pewnej struktury za pomocą
       rejestru '#:, który wskazuje początek tej struktury. Niech zmienna lokalna tej funkcji
       reprezentuje przesunięcie wewnątrz wspomnianej struktury. Jeśli zmienna ta zostanie
       nadpisana przy okazji nadpisywania adresu powrotu, a następnie załadowana do reje-
       stru '5+ i wykonany będzie na przykład rozkaz
          OQX FYQTF RVT=GCZ
GUK? GFZ

       to musimy zapewnić, e wartość, którą nadpisaliśmy tą zmienną, w połączeniu z za-
       wartością rejestru '#: reprezentuje adres, pod którym dozwolony jest zapis danych.
152                         Część II ♦ Włamania na platformach Windows, Solaris i Tru64


      W przeciwnym bowiem razie nastąpi naruszenie ochrony pamięci, wywołane zostaną
      odpowiednie procedury obsługi wyjątków, a działanie procesu zostanie najprawdopo-
      dobniej zakończone i stracimy szansę wykonania naszego kodu. Nawet jeśli skory-
      gujemy odpowiednio adres reprezentowany przez '#: 
 '5+, to musimy liczyć się z wy-
      stąpieniem wielu innych podobnych problemów, którym nale y zaradzić, zanim
      funkcja zwróci sterowanie. W niektórych przypadkach mo e to nawet być niemo liwe.
      Najprostsza metoda rozwiązania tego problemu polega na nadpisaniu struktury
      ':%'26+10A4')+564#6+10 w taki sposób, aby zapewnić sobie kontrolę nad wskaźni-
      kiem procedury obsługi wyjątku. Dzięki temu w momencie wystąpienia wyjątku mo-
       emy przejąć kontrolę nad procesem — na przykład przez zastąpienie wskaźnika proce-
      dury obsługi wyjątków adresem kodu, który przeka e sterowanie z powrotem do
      naszego bufora.

      Zastanówmy się teraz, w jaki sposób nadpisać wskaźnik procedury obsługi wyjątku,
      abyśmy mogli wykonać dowolny kod umieszczony w buforze. Rozwiązanie zale y od
      konkretnej wersji systemu i zainstalowanych pakietów serwisowych. W systemach
      Windows 2000 i Windows XP bez zainstalowanych pakietów serwisowych rejestr '$:
      wskazuje bie ącą strukturę ':%'26+10A4')+564#6+10, czyli właśnie tą, którą nadpi-
      sujemy. Mo emy wtedy nadpisać wskaźnik procedury obsługi wyjątków za pomocą
      adresu, pod którym znajduje się rozkaz LOR GDZ lub ECNN GDZ. W ten sposób na skutek
      wystąpienia wyjątków powrócimy zawsze do nadpisanej struktury ':%'26+10A4')+
      564#6+10. Wtedy nadpiszemy wskaźnik następnej struktury ':%'26+10A4')+564#6+10
      adresem kodu, który wykona krótki skok ponad adresem rozkazu LOR GDZ. Sposób
      nadpisania struktury ':%'26+10A4')+564#6+10 ilustruje rysunek 8.2.

Rysunek 8.2.
Nadpisywanie
struktury
EXCEPTION_
REGISTRATION




      W systemach Windows 2003 Server oraz Windows XP Service Pack 1 sytuacja wy-
      gląda jednak inaczej. Rejestr '$: nie wskazuje ju struktury ':%'26+10A4')+564#6+10.
      Wszystkie rejestry, które dotąd wskazywały przydatne informacje, teraz zostają wyze-
      rowane przed wywołaniem procedury obsługi wyjątków. Zmiany tej firma Microsoft
      dokonała prawdopodobnie w odpowiedzi na sposób działania robaka Code Worm, który
      u ywał tego mechanizmu do przejęcia kontroli nad serwerami IIS. Poni ej przedsta-
      wiamy kod odpowiedzialny za wspomnianą modyfikację (dla systemu Windows XP
      Professional SP1).
Rozdział 8. ♦ Przepełnienia w systemie Windows                                          153

          ($   ZQT GCZGCZ
          ($   ZQT GDZGDZ
          ($$   ZQT GUKGUK
          ($   ZQT GFKGFK
          ($(   RWUJ FYQTF RVT =GUR
J?
          ($   RWUJ FYQTF RVT =GUR
J?
          ($   RWUJ FYQTF RVT =GUR
J?
          ($$   RWUJ FYQTF RVT =GUR
J?
          ($(   RWUJ FYQTF RVT =GUR
J?
          ($   ECNN ($'
          ($   RQR GFK
          ($   RQR GUK
          ($#   RQR GDZ
          ($$   TGV J
          ($'   RWUJ GDR
          ($(   OQX GDRGUR
          ($   RWUJ FYQTF RVT =GDR
%J?
          ($   RWUJ GFZ
          ($   RWUJ FYQTF RVT HU=?
          ($%   OQX FYQTF RVT HU=?GUR
          ($   RWUJ FYQTF RVT =GDR
J?
          ($   RWUJ FYQTF RVT =GDR
J?
          ($   RWUJ FYQTF RVT =GDR
%J?
          ($%   RWUJ FYQTF RVT =GDR
?
          ($(   OQX GEZFYQTF RVT =GDR
J?
          ($#   ECNN GEZ

       Począwszy od adresu Z($, rejestry '#:, '$:, '5+ i '+ są kolejno zerowane za
       pomocą rozkazu :14. Następnie pod adresem Z($ wykonywany jest rozkaz ECNN,
       który powoduje przejście do adresu Z($'. Rozkaz znajdujący się pod adresem
       Z($( umieszcza w rejestrze '%: wskaźnik procedury obsługi wyjątku, którą
       wywołuje następny rozkaz.

       Nawet mimo tej modyfikacji haker mo e przejąć kontrolę nad działaniem systemu. Jed-
       nak nie dysponując wartościami rejestrów, które wskazywałyby wa ne dane procesu
       u ytkownika, musi odnaleźć je na własną rękę. A to zmniejsza szansę powodzenia ataku.

       Ale czy rzeczywiście? Zaraz po wywołaniu procedury obsługi wyjątku zawartość stosu
       będzie wyglądać następująco:
          '52            CFTGU RQYTQVW 
Z($#
          '52 
         YUMC PKM V[RW Y[LæVMW 
Z%
          '52 
         CFTGU UVTWMVWT[ ':%'26+10A4')+564#6+10

       Zamiast nadpisywać wskaźnik procedury obsługi wyjątków adresem rozkazu LOR GDZ
       lub ECNN GDZ, wystarczy nadpisać go adresem kodu zawierającego następujące rozkazy:
          RQR TGI
          RQR TGI
          TGV

       Wykonanie ka dego rozkazu 212 zwiększa wartość rejestru '52 o 4, wobec czego w mo-
       mencie wykonania rozkazu 4'6 rejestr '52 wskazuje dane procesu u ytkownika. Przypo-
       mnijmy, e rozkaz 4'6 pobiera adres znajdujący się na wierzchołku stosu (wskazywany
       przez '52) i powoduje przekazanie sterowania na ten adres. Dzięki temu haker nie
       potrzebuje ju rejestru wskazującego bufor ani nie musi domyślać się jego poło enia.
154                          Część II ♦ Włamania na platformach Windows, Solaris i Tru64


      Gdzie znajdziemy blok potrzebnych do tego rozkazów? Praktycznie na końcu kodu
      ka dej funkcji. Paradoksalnie najlepszym miejscem okazuje się blok rozkazów w kodzie,
      który zeruje rejestry przed wywołaniem procedury obsługi wyjątku. Blok ten znajduje
      się pod adresem Z($.
        ($ RQR GUK
        ($# RQR GDZ
        ($$ TGV J

      To, e zamiast rozkazu TGV znajduje się tam rozkaz TGV , nie ma większego znaczenia.
      Zwiększy on zawartość rejestru '52 o Z zamiast o Z. Wykonanie tych rozkazów
      przeniesie nas z powrotem do struktury ':%'26+10A4')+564#6+10 na stosie. Konieczne
      będzie te zastąpienie wskaźnika następnej struktury ':%'26+10A4')+564#6+10 kodem
      rozkazu krótkiego skoku oraz dwóch rozkazów 012 EQ RQYQNK PCO QOKPæè CFTGU YUMC
      WLæE[ DNQM TQMCÎY RQR RQR K TGV.

      Ka dy proces Win32 i ka dy wątek takiego procesu posiada przynajmniej jedną pro-
      cedurę obsługi wyjątków bazującą na ramce na stosie. Procedurę tę otrzymuje w mo-
      mencie jego uruchamiania. Jeśli stosujemy metodę przepełnień buforów na platformie
      Windows 2003 Server, to wykorzystanie takich procedur obsługi wyjątków umo liwi
      nam obejście zabezpieczeń stosu zastosowanych na tej platformie.


Wykorzystanie procedur obsługi wyjątków
na platformie Windows 2003 Server
      Wykorzystanie procedur obsługi wyjątków umo liwia obejście zabezpieczeń stosu
      zastosowanych na platformie Windows 2003 Server. (Omówienie tego zagadnienia
      zawiera punkt „Ochrona stosu i Windows 2003 Server”). W momencie wystąpienia wy-
      jątku na platformie Windows 2003 Server sprawdzana jest poprawność pierwszej pro-
      cedury obsługi skonfigurowanej dla tego wyjątku. W ten sposób Microsoft chce za-
      bezpieczyć się przed atakami na zasadzie przepełnienia stosu, które powodują
      nadpisanie adresu procedury obsługi wyjątków.

      W jaki sposób sprawdzana jest poprawność procedury obsługi wyjątków? Za kontrolę tę
      odpowiedzialny jest kod funkcji -K7UGT'ZEGRVKQPKURCVEJGT znajdującej się w bi-
      bliotece 06..... Najpierw sprawdza ona, czy wskaźnik procedury obsługi wyjątku nie
      wskazuje adresu na stosie. W tym celu u ywane są wartości w bloku TEB określające
      zakres adresów stosu i znajdujące się pod adresami (5=? i (5=?. Jeśli adres proce-
      dury obsługi wyjątku wypada w tym zakresie, to nie zostanie ona wywołana. Jeśli adres
      procedury obsługi wyjątku nie jest adresem stosu, to następnie adres ten porównywany
      jest z listą załadowanych modułów (zarówno wykonywalnych, jak i DLL). Co ciekawe,
      jeśli adres procedury obsługi wyjątków nie przypada w przestrzeni adresowej adnego
      z tych modułów, to uwa any jest za bezpieczny i procedura zostaje wywołana. W prze-
      ciwnym razie adres procedury obsługi wyjątków porównywany jest jeszcze z listą za-
      rejestrowanych procedur obsługi wyjątków.

      Następnie pobierany jest wskaźnik nagłówka PE za pomocą wywołania funkcji 4V
      N+OCIG0V*GCFGT. Jeśli bajt przesunięty Z( względem początku nagłówka (jest to naj-
      starszy bajt pola charakterystyki DLL w nagłówku PE) jest równy Z, to moduł ten
Rozdział 8. ♦ Przepełnienia w systemie Windows                                          155


       jest niedozwolony. Jeśli adres procedury obsługi wyjątku nale y do zakresu adresów
       tego modułu, to procedura nie zostanie wywołana. Wskaźnik nagłówka PE zostaje
       przekazany jako parametr funkcji 4VN+OCIGKTGEVQT['PVT[6QCVC. W tym przypadku
       wywołanie tej funkcji dotyczy katalogu Load Configuration Directory i zwraca adres
       oraz rozmiar tego katalogu. Jeśli moduł nie dysponuje tym katalogiem, to funkcja
       zwraca wartość 0 i na tym kończy się kontrola poprawności procedury obsługi wyjątków,
       która zostaje wywołana. Jeśli moduł posiada taki katalog, to sprawdzany jest jego
       rozmiar. Gdy nale y on do zakresu od  do Z, to procedura obsługi wyjątku zostaje
       wywołana. W odległości Z bajtów od początku katalogu znajduje się wskaźnik tabeli
       adresów RVA (Relative Virtual Address) zarejestrowanych procedur obsługi wyjątków.
       Jeśli wskaźnik ten jest równy NULL, to procedura obsługi wyjątku zostaje wywołana.
       Przesunięta o Z bajtów względem początku katalogu jest liczba elementów tabeli
       adresów RVA. Jeśli równa się ona 0, to procedura obsługi wyjątku zostaje wywołana.
       Jeśli wszystkie dotychczasowe kontrole powiodły się, adres bazowy modułu zostaje
       odjęty od adresu procedury obsługi wyjątków i w wyniku tej operacji otrzymujemy
       adres RVA tej procedury. Adres RVA jest następnie porównywany z adresami RVA
       w tabeli zarejestrowanych procedur obsługi wyjątków. Jeśli zostanie tam odnaleziony,
       to procedura zostanie wywołana. W przeciwnym razie procedura zostanie odrzucona.

       Stosując przepełnienia buforów na stosie w systemie Windows 2003 Server i nadpi-
       sując wskaźnik procedury obsługi wyjątków, mamy do wyboru następujące mo liwości:
         1. Wykorzystać istniejącą procedurę obsługi wyjątku w taki sposób, by
            przekazała sterowanie do naszego bufora.
         2. Znaleźć blok kodu spoza zakresu adresów danego modułu, który przeka e
            sterowanie do naszego bufora.
         3. Znaleźć blok kodu nale ący do zakresu adresów danego modułu, który nie
            posiada katalogu Load Configuration Directory.

       Przyjrzymy się im na przykładzie wykorzystania przepełnienia bufora przez funkcję
       DCOM o nazwie +4GOQVG#EVKXCVKQP.

Wykorzystanie istniejącej procedury obsługi wyjątków
       Adres Z(# wskazuje zarejestrowaną procedurę obsługi wyjątków w 06.....
       Jeśli przeanalizujemy działanie tej procedury, to dojdziemy do wniosku, e mo na ją
       wykorzystać do wykonania własnego kodu. Wskaźnik naszej struktury ':%'26+10A
       4')+564#6+10 znajduje się pod adresem '$2
%J.
          (#(   OQX GDZFYQTF RVT =GDR
%J?
          
          (#   OQX GUKFYQTF RVT =GDZ
%J?
          (#   OQX GFKFYQTF RVT =GDZ
?
          
          (#   NGC GEZ=GUK
GUK
?
          (#   OQX GCZFYQTF RVT =GFK
GEZ
?
          
          (#(   ECNN GCZ

       Wskaźnik naszej struktury ':%'26+10A4')+564#6+10 został umieszczony w rejestrze '$:.
       Następnie wartość typu FYQTF znajdująca się Z% bajtów za adresem umieszczonym
       w rejestrze '$: zostaje załadowana do rejestru '5+. Poniewa wcześniej przepełniliśmy
156                          Część II ♦ Włamania na platformach Windows, Solaris i Tru64


      strukturę ':%'26+10A4')+564#6+10, to posiadamy kontrolę nad tą wartością, a w konse-
      kwencji nad zawartością rejestru '5+. W podobny sposób kontrolowana przez nas wartość
      typu dword o przesunięciu 0x08 względem adresu znajdującego się w rejestrze '$:
      zostaje umieszczona w rejestrze '+. Następnie do rejestru '%: zostaje załadowany
      adres efektywny '5+ 
 '5+
(czyli '5+
). Poniewa kontrolujemy zawartość reje-
      stru '5+, to równie mo emy zagwarantować odpowiednią wartość tego adresu. Kolejny
      rozkaz umieszcza w rejestrze '#: wartość FYQTF znajdującą się pod adresem stanowiącym
      sumę zawartości kontrolowanego przez nas rejestru '+ oraz '%:
. Następnie
      wywołana zostaje procedura znajdująca się pod adresem umieszczonym w rejestrze '#:.

      Podczas pierwszego włamania do modułu UXEJQUV poło enie bloku TEB oraz poło enie
      stosu są łatwe do określenia. Sytuacja mo e się zmienić w przypadku mocno obcią o-
      nego serwera. Zakładając, e jest stabilna, mo emy odnaleźć wskaźnik naszej struktury
      ':%'26+10A4')+564#6+10 pod adresem 6'$
 (Z(($) i u yć go jako wskaźnika
      naszego kodu. Jednak tu przed wywołaniem procedury obsługi wyjątków wskaźnik
      ten zostanie zaktualizowany, wobec czego nie mo emy zastosować takiej metody.
      Struktura ':%'26+10A4')+564#6+10 wskazywana przez 6'$
 posiada pod adresem
      Z%(( wskaźnik do naszej struktury ':%'26+10A4')+564#6+10, a poniewa poło enie
      stosu jest zawsze znane podczas pierwszego ataku, mo emy wykorzystać ten
      wskaźnik. Inny wskaźnik naszej struktury ':%'26+10A4')+564#6+10 znajduje się równie
      pod adresem Z%('. Jeśli chcemy u yć tego adresu, musimy zapisać wartość
      Z (która zostanie następnie załadowana do rejestru '5+) Z% bajtów za naszą
      strukturą ':%'26+10A4')+564#6+10 oraz wartość Z$(( Z bajtów za tą strukturą
      (wartość ta zostanie następnie załadowana do rejestru '+). Po odpowiednim wymno e-
      niu i dodaniu otrzymamy właśnie adres Z%('. Do rejestru '#: zostanie następnie
      załadowany wskaźnik znajdujący się pod tym adresem i wywołana odpowiednia proce-
      dura. Wywołanie to spowoduje, e trafimy do naszej struktury ':%'26+10A4')+564#6+10
      w miejscu, w którym znajduje się wskaźnik następnej takiej struktury. Jeśli umieści-
      my tam kod, który wykona skok o 14 bajtów, to przeskoczymy kod, który był nam
      wcześniej potrzebny, by sterowanie dotarło w obecne miejsce.

      Rozwiązanie to przetestowaliśmy na czterech maszynach działających pod kontrolą
      systemu Windows 2003 Server, z których trzy działały z wersją Enterprise Edition,
      a czwarta ze Standard Edition. Wszystkie próby zakończyły się sukcesem. Musimy jed-
      nak zawsze mieć pewność, e włamanie tą metodą przeprowadzane jest po raz pierw-
      szy. W przeciwnym razie jest wielce prawdopodobne, e zakończy się ono niepowo-
      dzeniem. Na marginesie warto równie zauwa yć, e opisana mo liwość wykorzystania
      procedury obsługi wyjątków wynika prawdopodobnie z tego, e jest ona przewidziana
      do współpracy z wektoryzowanym mechanizmem obsługi wyjątków, a nie u ywającym
      ramek na stosie.

      Do włamań mo emy wykorzystać równie inne moduły, które u ywają tej samej proce-
      dury obsługi wyjątków. Inne procedury obsługi wyjątków zarejestrowane w tej samej
      przestrzeni adresowej zwykle przekazują obsługę do funkcji AAGZEGRVAJCPFNGT eks-
      portowanej przez bibliotekę OUXETVFNN lub jej odpowiednik.
Rozdział 8. ♦ Przepełnienia w systemie Windows                                              157


Wykorzystanie bloku kodu o adresie,
który nie należy do żadnego modułu
       Podobnie jak w innych wersjach systemu Windows pod adresem '52 
  mo emy
       odnaleźć wskaźnik do naszej struktury ':%'26+10A4')+564#6+10. Jeśli potrafimy od-
       naleźć blok rozkazów
          RQR TGI
          RQR TGI
          TGV

       pod adresem, który nie jest związany z adnym z załadowanych modułów, to mo emy
       przejąć sterowanie. Ka dy proces działający w systemie Windows 2003 Server zawiera
       pod adresem Z((%#% taki blok rozkazów. Poniewa adres ten nie jest związany
       z adnym modułem, zostanie uznany za bezpieczny, a znajdujący się pod nim kod wyko-
       nany jako procedura obsługi wyjątków. Istnieje jednak pewien problem. Na innej ma-
       szynie działającej pod kontrolą systemu Windows 2003 Server Standard Edition ten
       sam blok rozkazów znajduje się w pobli u podanego adresu, ale nie jest to ten sam
       adres. Skoro nie mo emy zagwarantować poło enia bloku rozkazów RQR, RQR, TGV, to
       nie jest to właściwe rozwiązanie. Zamiast tego bloku mo emy poszukać rozkazu:
          ECNN FYQTF RVT=GUR
?

       albo:
          LOR FYQTF RVT=GUR
?

       w przestrzeni adresowej atakowanego procesu. Chocia aden z tych rozkazów nie ist-
       nieje pod odpowiednim adresem, to jednak wiele wskaźników naszej struktury ':%'2
       6+10A4')+564#6+10 znajduje się w otoczeniu wskazywanym przez rejestry '52 i '$2.
       Wskaźnik naszej struktury mo emy znaleźć pod jednym z następujących adresów:
          GUR

          GUR

          GUR
%
          GUR
%
          GUR

          GUR


          GDR
%
          GDR

          GDR

          GDR
          GDR%
          GDR

       Ka dego z nich mo emy u yć dla rozkazu LOR lub ECNN. Jeśli sprawdzimy przestrzeń
       adresową UXEJQUV, to pod adresem Z$$$ znajdziemy rozkaz:
          ECNN FYQTF RVT=GDR
Z?

       Pod adresem '$2 
  znajduje się wskaźnik naszej struktury ':%'26+10A4')+564#6+10.
       Adres ten nie jest związany z adnym modułem, i co więcej, wydaje się, e prawie
       ka dy proces działający w systemie Windows 2003 Server (jak równie wiele pro-
       cesów w systemie Windows XP) ma te same bajty właśnie pod tym adresem. Proce-
       sy, które są wyjątkiem od tej reguły, posiadają natomiast te bajty pod adresem Z%$$.
158                          Część II ♦ Włamania na platformach Windows, Solaris i Tru64


      Jeśli nadpiszemy wskaźnik procedury obsługi wyjątków adresem Z$$$, to po-
      wrócimy do naszego bufora i uzyskamy mo liwość wykonania dowolnego kodu. Adres
      Z$$$ sprawdziliśmy na wszystkich czterech maszynach z systemem Windows
      2003 Server i we wszystkich przypadkach zawierał on właściwe bajty reprezentujące
      rozkaz ECNN FYQTF RVT=GDR
Z?. Wydaje się więc, e opisana metoda powinna być
      stosunkowo niezawodna na platformie Windows 2003 Server.

Wykorzystanie bloku kodu należącego do modułu,
który nie posiada katalogu Load Configuration Directory
      Plik wykonywalny UXEJQUVGZG nie posiada katalogu Load Configuration Directory.
      Kod z przestrzeni adresowej tego procesu zostałby zaakceptowany jako procedura ob-
      sługi wyjątku, gdyby nie wyjątek wskaźnika 07.. występujący podczas wykonania funkcji
      -K7UGT'ZEGRVKQPKURCVEJGT
. Funkcja 4VN+OCIG0V*GCFGT zwraca bowiem wartość 0 ja-
      ko wskaźnik nagłówka PE dla UXEJQUV. Funkcja -K7UGT'ZEGRVKQPKURCVEJGT
 nie
      sprawdza, czy wykorzystywany przez nią wskaźnik jest ró ny od 07...
        ECNN 4VN+OCIG0V*GCFGT
        VGUV D[VG RVT=GCZ
(J?
        LP Z(#

      Na skutek wystąpienia wyjątku działanie procesu zostaje zakończone. Dlatego te nie
      uda nam się wykorzystać adnego kodu nale ącego do UXEJQUVFNN. Plik EQORTGUFNN
      równie nie posiada katalogu Load Configuration Directory. Jednak poniewa pole
      charakterystyki DLL znajdujące się w nagłówku PE ma wartość Z, to test wyko-
      nywany po wywołaniu funkcji 4VN+OCIG0V*GCFGT zakończy się niepowodzeniem i ste-
      rowanie zostanie przekazane pod adres Z(# z dala od naszego kodu. Jeśli
      przejrzymy wszystkie moduły załadowane w przestrzeni adresowej procesu, to oka e
      się, e aden z nich nie spełnia naszych wymagań. Większość posiada katalog Load
      Configuration Directory i zarejestrowane procedury obsługi wyjątków. Natomiast po-
      zostałe moduły, które nie mają tego katalogu, nie są odpowiednie z tego samego po-
      wodu co EQORTGUUFNN. W tym przypadku metoda ta nie jest więc przydatna.

      Poniewa w większości przypadków mo emy spowodować wyjątek, próbując wyko-
      nać operację zapisu za końcem stosu, to przepełniając bufor, mo emy u yć takiego
      sposobu jako ogólnej metody obejścia ochrony stosu w systemie Windows 2003 Se-
      rver. Nale y jednak pamiętać, e metoda ta jest skuteczna w chwili obecnej. Nie ma
      wątpliwości, e kolejne wersje systemu lub nawet pakiety serwisowe usuną ten słaby
      punkt i sprawią, e metoda przestanie być skuteczna. Wtedy pozostanie nam odkurzyć
      program uruchomieniowy i asembler i zabrać się za projektowanie nowej metody.
      Firmie Microsoft mo emy natomiast polecić wykonywanie wyłącznie zarejestrowa-
      nych procedur obsługi wyjątków i doło enie starań, by nie mogły one zostać u yte
      przez hakerów w taki sposób, jaki przedstawiliśmy w tym podrozdziale.


Końcowe uwagi
na temat nadpisań procedur obsługi wyjątków
      Gdy słaby punkt występuje w wielu systemach operacyjnych — tak jak ma to miejsce
      w przypadku przepełnienia bufora DCOM +4GOQVG#EVKXCVKQP odkrytego przez polską
      grupę badawczą The Last Stage of Delirium — to najlepszym sposobem poprawy
Rozdział 8. ♦ Przepełnienia w systemie Windows                                              159


       przenośności eksploitu jest zaatakowanie procedur obsługi wyjątków. Przesunięcie
       początku bufora względem poło enia struktury ':%'26+10A4')+564#6+10 mo e bowiem
       być ró ne dla poszczególnych systemów. I tak w przypadku wspomnianego słabego
       punktu DCOM struktura ta znajduje się 1412 bajtów od początku bufora w systemie
       Windows 2003 Server, 1472 bajty w systemie Windows XP i 1540 bajtów w systemie
       Windows 2000. Mimo tych ró nic mo liwe jest napisanie pojedynczego eksploitu dla
       wszystkich tych systemów. Wystarczy jedynie umieścić w odpowiednich miejscach
       pseudoprocedury obsługi wyjątków.



Ochrona stosu i Windows 2003 Server
       System Windows 2003 Server posiada wbudowaną ochronę stosu. Zastosowanie tego
       samego mechanizmu umo liwia Microsoft Visual C++ .NET. Opcja kompilatora )5
       (która jest domyślnie włączona) sprawia, e podczas generowania kodu na stosie
       umieszczane są znaczniki bezpieczeństwa, których zadaniem jest ochrona adresu powrotu
       przed nadpisaniem. Znaczniki te stanowią odpowiednik rozwiązania zastosowanego
       przez Crispina Cowana w kompilatorze StackGuard. Po wywołaniu procedury na sto-
       sie umieszczane są 4 bajty (FYQTF), które są sprawdzane, zanim procedura zwróci
       sterowanie. W ten sposób chroniony jest adres powrotu oraz zawartość rejestru '$2 za-
       pisana na stosie. Logika działania tego mechanizmu jest prosta: jeśli lokalny bufor został
       przepełniony i spowodował nadpisanie adresu powrotu, to po drodze musiał równie nad-
       pisać znacznik bezpieczeństwa. W ten sposób proces mo e rozpoznać sytuację,
       w której nastąpiło przepełnienie bufora i podjąć działania zapobiegające wykonaniu
       niewłaściwego kodu. Zwykle działania te sprowadzają się do zakończenie pracy procesu.
       Chocia mo e wydawać się, e rozwiązanie takie zapewnia skuteczną ochronę przed
       atakami wykorzystującymi przepełnienie, to jednak na przykładzie wykorzystania
       procedur obsługi wyjątków pokazaliśmy ju , e tak nie jest. Ochrona za pomocą
       znaczników bezpieczeństwa utrudnia takie włamania, ale nie eliminuje ich.

       Przyjrzyjmy się bli ej sposobowi działania mechanizmu ochrony stosu i spróbujmy
       znaleźć jeszcze inne metody jego obejścia. Znaczniki bezpieczeństwa generowane są
       w wystarczająco losowy sposób, aby próbować odgadnąć ich wartość. Przedstawiony
       poni ej kod w języku C naśladuje mechanizm generowania znaczników w momencie
       uruchamiania procesu.
           KPENWFG UVFKQJ
           KPENWFG YKPFQYUJ

          KPV OCKP

          ]
                       (+.'6+/' HV
                       WPUKIPGF KPV %QQMKG
                       WPUKIPGF KPV VOR
                       WPUKIPGF KPV
RVT
                       .#4)'A+06')'4 RGTHEQWPV

                       )GV5[UVGO6KOG#U(KNG6KOG
 HV
                       %QQMKG  HVFY*KIJCVG6KOG @ HVFY.QYCVG6KOG
                       %QQMKG  %QQMKG @ )GV%WTTGPV2TQEGUU+F
160                           Część II ♦ Włamania na platformach Windows, Solaris i Tru64


                     %QQMKG  %QQMKG @ )GV%WTTGPV6JTGCF+F

                     %QQMKG  %QQMKG @ )GV6KEM%QWPV

                     3WGT[2GTHQTOCPEG%QWPVGT
 RGTHEQWPV
                     RVT  
WPUKIPGF KPV RGTHEQWPV
                     VOR
RVT
 @
RVT
                     %QQMKG  %QQMKG @ VOR
                     RTKPVH
 %QQMKG :P %QQMKG
                     TGVWTP 
        _

      Najpierw wywołana zostaje funkcja )GV5[UVGO6KOG#U(KNG6KOG. Wypełnia ona dwa
      elementy struktury (+.'6+/' — FY*KIJCVG6KOG i FY.QYCVG6KOG. Te dwie wartości są
      następnie poddawane operacji ró nicy symetrycznej. Otrzymany wynik poddawany
      jest tej samej operacji, której drugim argumentem są kolejno: identyfikator procesu,
      identyfikator wątku oraz liczba milisekund, które upłynęły od momentu startu systemu
      (wartość tę zwraca funkcja )GV6KEM%QWPV
). Na końcu wywoływana jest funkcja 3WGT[
      2GTHQTOCPEG%QWPVGT, której parametrem jest wskaźnik wartości 64-bitowej. Wartość ta
      jest następnie dzielona na dwie wartości 32-bitowe, na których wykonywana jest
      operacja :14. Uzyskany wynik jest jeszcze raz poddawany operacji :14 ze znacznikiem
      bezpieczeństwa. Uzyskana wartość znacznika bezpieczeństwa umieszczana jest w pliku
      w sekcji FCVC.

      Zastosowanie opcji )5 powoduje równie zmianę układu zmiennych lokalnych podczas
      generowania kodu przez kompilator. Porządek zmiennych lokalnych pozostaje w zgodzie
      z kolejnością ich definicji w programie w języku C, ale wszystkie tablice zostają przesu-
      nięte na koniec listy zmiennych lokalnych i w efekcie znajdą się w pobli u adresu powrotu
      na stosie. W ten sposób zapobiega się nadpisaniu zmiennych lokalnych na skutek prze-
      pełnienia. Zadaniem tego rozwiązania jest przede wszystkim ochrona zmiennych lo-
      gicznych decydujących o przepływie sterowania oraz wskaźników funkcji.

      Aby zilustrować pierwszą z wymienionych korzyści, wyobraźmy sobie program, któ-
      ry uwierzytelnia u ytkowników, a procedura uwierzytelniania podatna jest na atak na
      skutek przepełnienia. Jeśli uwierzytelni ona u ytkownika, to nadaje zmiennej typu
      dword wartość 1, a w przeciwnym razie 0. Jeśli zmienna taka znajdowałaby się za bu-
      forem, to haker mógłby go przepełnić i nadać w ten sposób zmiennej wartość 1, mimo
       e nie uwierzytelnił się za pomocą nazwy i odpowiedniego hasła.

      Gdy funkcja chroniona za pomocą znaczników bezpieczeństwa zwraca sterowanie, to
      sprawdza, czy znacznik bezpieczeństwa jest taki sam jak w momencie jej wywołania.
      Kopia znacznika zapamiętywana jest w sekcji FCVC pliku zawierającego daną funkcję.
      I to jest pierwszy powa ny problem takiego rozwiązania — wyjaśnimy to za chwilę.

      Jeśli wartość znacznika bezpieczeństwa się nie zgadza, to wywołana zostaje procedu-
      ra bezpieczeństwa (jeśli została zdefiniowana). Wskaźnik tej procedury przechowy-
      wany jest równie w sekcji FCVC. Jeśli wskaźnik ten jest ró ny od 07.., to zostaje zała-
      dowany do rejestru '#: i wykonywany jest rozkaz ECNN GCZ. Stanowi on drugą słabość
      tego rozwiązania. Jeśli nie została zdefiniowana procedura bezpieczeństwa, to wy-
      woływana jest funkcja 7PJCPFNGF'ZEGRVKQP(KNVGT. Funkcja ta nie powoduje zakoń-
      czenia procesu, lecz wykonuje szereg operacji i wywołuje wiele ró nych funkcji.
Rozdział 8. ♦ Przepełnienia w systemie Windows                                            161


       Czytelnikowi zalecamy przeanalizowanie działania funkcji 7PJCPFNGF'ZEGRVKQP(KNVGT
       za pomocą IDA Pro. W skrócie działanie tej funkcji polega na załadowaniu biblioteki
       HCWNVTGRFNN, a następnie wykonaniu funkcji 4GRQTV(CWNV eksportowanej przez tę bi-
       bliotekę. Funkcja ta odpowiedzialna jest między innymi za wyświetlenie okna dialo-
       gowego, które umo liwia poinformowanie firmy Microsoft o zaistniałym błędzie.
       Funkcja 4GRQTV(CWNV wykorzystuje potoki 2%**CPI4GR'ZGE2KRG i 2%*(CWNV4GR'ZGE2KRG.

       Zajmijmy się teraz wspomnianymi problemami omawianego rozwiązania. Najlepiej
       będzie zilustrować je przykładowym kodem.
           KPENWFG UVFKQJ
           KPENWFG YKPFQYUJ

               *#0.' JR07..
               KPV 4GVWTP*QUV(TQO7TN
EJCT
EJCT
KPV OCKP

               ]
                      EJCT
RVT  07..
                      JR  *GCR%TGCVG
ZZ
                      4GVWTP*QUV(TQO7TN
 RVT JVVRYYYPIUUQHVYCTGEQOKPFGZJVON 
                      RTKPVH
 *QUV KU U RVT
                      *GCR(TGG
JRRVT
                      TGVWTP 

               _

               KPV 4GVWTP*QUV(TQO7TN
EJCT
DWH EJCT
WTN
               ]
                      KPV EQWPV  
                      EJCT
R  07..
                      EJCT DWHHGT=? 

                      YUMC PKM RQEæVMW CFTGUW 74.
                     R  UVTUVT
WTN JVVR 
                     KH
 R
                             TGVWTP 
                     R  R 
 
                      RTGVYCTC NQMCNPæ MQRKú
                     UVTER[
DWHHGTR   79#)# 
                      Y[UWMWLG RKGTYU[ WMQ PKM
                     YJKNG
DWHHGT=EQWPV?   
                             EQWPV 


                      K CUVúRWLG IQ DCLVGO GTQY[O
                     DWHHGT=EQWPV?  
                      6GTC Y DWHQTG PCLFWLG UKú PCYC JQUVC
                      6YQT[O[ LGL MQRKú PC UVGTEKG
                     R  
EJCT
*GCR#NNQE
JRUVTNGP
DWHHGT

                     KH
 R
                             TGVWTP 
                     UVTER[
RDWHHGT
DWH  R   79#)# 
                     TGVWTP 
               _
162                             Część II ♦ Włamania na platformach Windows, Solaris i Tru64


         Program ten wyodrębnia nazwę hosta z adresu URL. Funkcja 4GVWTP*QUV(TQO7TN
         nara ona jest na przepełnienie bufora na stosie w miejscu oznaczonym komentarzem
         79#)# . Pozostawmy na chwilę omówienie tego problemu i przyjrzyjmy się prototy-
         powi tej funkcji. Posiada ona dwa parametry — pierwszy jest wskaźnikiem wskaźni-
         ka 
EJCT
, a drugi wskaźnikiem adresu URL. Komentarzem 79#)#  opatrzyliśmy
         instrukcję, która pierwszemu parametrowi nadaje wartość wskazującą nazwę hosta
         umieszczoną na stercie. Przyjrzyjmy się reprezentacji tej instrukcji na poziomie roz-
         kazów asemblera.
            $% OQX GEZFYQTF RVT =GDR
?
            $( OQX GFZFYQTF RVT =GDR?
            % OQX FYQTF RVT =GEZ?GFZ

         Pierwszy z rozkazów umieszcza adres wskaźnika przekazanego jako parametr w reje-
         strze '%:. Następnie do rejestru ': zostaje załadowany wskaźnik nazwy hosta znaj-
         dującej się na stercie. Ostatni z rozkazów umieszcza ten wskaźnik pod adresem wska-
         zywanym przez rejestr '%:. I tutaj pojawia się jeden ze wspomnianych problemów.
         Jeśli przepełnimy bufor na stosie, nadpiszemy znacznik bezpieczeństwa oraz adres
         powrotu, to kolejnymi nadpisywanymi wartościami będą parametry funkcji. Ilustruje
         to rysunek 8.3.

Rysunek 8.3.
Stos przed
i po przepełnieniu
bufora




         Na skutek przepełnienia bufora haker mo e więc uzyskać kontrolę nad parametrami
         przekazanymi funkcji. Z tego powodu wykonanie rozkazów znajdujących się w pamięci
         począwszy od adresu Z$% (nale ących do rozwinięcia instrukcji
DWH  R),
         mo e zostać u yte do nadpisania dowolnej wartości w pamięci bądź mo e spowodować
         naruszenie ochrony pamięci. Druga z tych mo liwości wystąpi na przykład w sytuacji,
         gdy nadpiszemy parametr znajdujący się pod adresem '$2 
  wartością Z.
         Następnie proces spróbuje zapisać wskaźnik pod adresem reprezentowanym przez tę
         wartość, co spowoduje naruszenie ochrony pamięci. Jednocześnie sytuacja taka pozwoli
         nam wykorzystać mechanizm struktur opisujących procedury obsługi wyjątków do
         obejścia mechanizmu zabezpieczeń stosu. A co w przypadku, gdy nie chcemy spowo-
         dować wyjątku? Poniewa obecnie zastanawiamy się nad innymi sposobami obejścia
         zabezpieczeń stosu, to przyjrzyjmy się dokładnie pierwszej z wymienionych mo li-
         wości (zapisowi dowolnej wartości w pamięci).

         Wróćmy zatem do problemów wskazanych w procesie sprawdzania wartości znaczni-
         ka bezpieczeństwa. Pierwszy z nich pojawia się na skutek przechowania oryginalnej
         wartości znacznika w sekcji FCVC. Dla określonej wersji pliku znacznik ten znajduje
Rozdział 8. ♦ Przepełnienia w systemie Windows                                          163


       się zawsze w tym samym miejscu (mo e to być prawdą nawet dla ró nych wersji pli-
       ku). Jeśli adres wskaźnika nazwy naszego hosta na stosie jest zawsze taki sam, mo-
        emy nadpisać nim oryginalną wartość znacznika znajdującą się w sekcji FCVC, a na-
       stępnie wartość znacznika umieszczoną na stosie. W ten sposób obie wartości będą
       takie same w momencie ich kontroli. Po pomyślnym wyniku kontroli znaczników
       przejmiemy kontrolę nad działaniem programu i przeka emy sterowanie do wybrane-
       go przez nas adresu — tak jak w klasycznym przepełnieniu bufora na stosie.

       Jednak metoda ta nie jest wcale najlepszym rozwiązaniem w naszym przypadku. Kod
       eksploitu mo emy umieścić w buforze i nadpisać adres pewnej funkcji adresem tego
       bufora. Gdy funkcja ta zostanie wywołana, to zostanie wykonany nasz kod znajdujący
       się w buforze. Jednak kontrola znaczników bezpieczeństwa da wynik negatywny. I w ten
       sposób dochodzimy do drugiego ze wspomnianych problemów. Przypomnijmy jednak,
        e gdy kontrola znaczników bezpieczeństwa nie powiedzie się i zdefiniowana została
       procedura bezpieczeństwa, to procedura ta zostanie wywołana. Stanowi to dla nas do-
       skonałą okazję, poniewa mo emy nadpisać wskaźnik procedury bezpieczeństwa
       (który umieszczony jest w sekcji FCVC) wskaźnikiem naszego bufora. W ten sposób
       przejmiemy sterowanie w momencie, gdy kontrola znaczników da wynik negatywny.

       Przyjrzyjmy się zatem innemu sposobowi. Przypomnijmy, e jeśli kontrola znaczników
       wypadnie negatywnie i nie jest zdefiniowana adna procedura bezpieczeństwa, to
       wywołana zostanie funkcja 7PJCPFNGF'ZEGRVKQP(KNVGT (przy zało eniu, e równie
       wskaźnik właściwej procedury obsługi wyjątków posiada wartość 07..). Funkcja ta
       wykonuje tak wiele kodu, e stanowi dla hakera doskonałe pole do popisu. Na przykład
       funkcja ta wywołuje funkcję )GV5[UVGOKTGEVQT[9, a następnie z uzyskanego katalogu
       systemowego ładuje bibliotekę HCWNVTGRFNN. W przypadku przepełnienia posługującego
       się kodem Unicode moglibyśmy nadpisać wskaźnik katalogu systemowego przecho-
       wywany w sekcji FCVC modułu MGTPGNFNN za pomocą wskaźnika naszego własnego
       katalogu i w rezultacie spowodować załadowanie własnej wersji biblioteki HCWNVTGRFNN
       zamiast wersji systemowej. Wystarczy, e wersja ta będzie eksportować funkcję 4G
       RQTV(CWNV, która zostanie automatycznie wywołana.

       Kolejną interesującą mo liwość (na razie tylko teoretyczną, poniewa nie mieliśmy
       jeszcze czasu jej sprawdzić) stanowi koncepcja wtórnego, zagnie d onego przepełnienia.
       Większość funkcji wywoływanych przez 7PJCPFNGF'ZEGRVKQP(KNVGT nie jest chroniona
       znacznikami. Załó my na przykład, e funkcja )GV5[UVGOKTGEVQT[9 jest nara ona na
       przepełnienie, poniewa zakłada, e długość łańcucha katalogowego nie przekracza nigdy
       260 bajtów i pochodzi on zawsze z zaufanego źródła. Jeśli nadpiszemy wskaźnik ka-
       talogu systemowego wskaźnikiem naszego bufora, to mo emy spowodować kolejne
       przepełnienie i w momencie powrotu funkcji uzyskać sterowanie. W praktyce okazuje
       się, e funkcja )GV5[UVGOKTGEVQT[9 jest odporna na tego rodzaju atak. Jednak taki
       słaby punkt mo e kryć się w innych fragmentach kodu wykonywanego przez 7PJCP
       FNGF'ZEGRVKQP(KNVGT. Pozostaje tylko go odnaleźć.

       W naturalny sposób nasuwa się pytanie, czy scenariusz, w którym uzyskujemy mo -
       liwość modyfikacji dowolnego miejsca w pamięci, zanim dokonana zostanie kontrola
       znaczników, mo e zdarzyć się w praktyce. Odpowiedź na to pytanie jest pozytyw-
       na, a sytuacja taka występuje dość często. Przykładem mo e być słaby punkt DCOM
       wykryty przez grupę The Last Stage of Delirium. W tym przypadku parametr jednej
164                          Część II ♦ Włamania na platformach Windows, Solaris i Tru64


      z funkcji posiada typ YEJCT
The Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polska

More Related Content

What's hot

Java. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie koduJava. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie koduWydawnictwo Helion
 
Perl. Zaawansowane programowanie
Perl. Zaawansowane programowaniePerl. Zaawansowane programowanie
Perl. Zaawansowane programowanieWydawnictwo Helion
 
Wykrywanie włamań i aktywna ochrona danych
Wykrywanie włamań i aktywna ochrona danychWykrywanie włamań i aktywna ochrona danych
Wykrywanie włamań i aktywna ochrona danychWydawnictwo Helion
 
Apache. Zabezpieczenia aplikacji i serwerów WWW
Apache. Zabezpieczenia aplikacji i serwerów WWWApache. Zabezpieczenia aplikacji i serwerów WWW
Apache. Zabezpieczenia aplikacji i serwerów WWWWydawnictwo Helion
 
101 zabezpieczeń przed atakami w sieci komputerowej
101 zabezpieczeń przed atakami w sieci komputerowej101 zabezpieczeń przed atakami w sieci komputerowej
101 zabezpieczeń przed atakami w sieci komputerowejWydawnictwo Helion
 
Bezpieczeństwo w sieciach Windows
Bezpieczeństwo w sieciach WindowsBezpieczeństwo w sieciach Windows
Bezpieczeństwo w sieciach WindowsWydawnictwo Helion
 
To tylko awaria, czyli katastrofy i wpadki z pecetem
To tylko awaria, czyli katastrofy i wpadki z pecetemTo tylko awaria, czyli katastrofy i wpadki z pecetem
To tylko awaria, czyli katastrofy i wpadki z pecetemWydawnictwo Helion
 
Asembler dla procesorów Intel. Vademecum profesjonalisty
Asembler dla procesorów Intel. Vademecum profesjonalistyAsembler dla procesorów Intel. Vademecum profesjonalisty
Asembler dla procesorów Intel. Vademecum profesjonalistyWydawnictwo Helion
 
Hardware Hacking. Edycja polska
Hardware Hacking. Edycja polskaHardware Hacking. Edycja polska
Hardware Hacking. Edycja polskaWydawnictwo Helion
 
ABC ochrony komputera przed atakami hakera
ABC ochrony komputera przed atakami hakeraABC ochrony komputera przed atakami hakera
ABC ochrony komputera przed atakami hakeraWydawnictwo Helion
 
Znajdź błąd. Sztuka analizowania kodu
Znajdź błąd. Sztuka analizowania koduZnajdź błąd. Sztuka analizowania kodu
Znajdź błąd. Sztuka analizowania koduWydawnictwo Helion
 
Kryptografia w Javie. Od podstaw
Kryptografia w Javie. Od podstawKryptografia w Javie. Od podstaw
Kryptografia w Javie. Od podstawWydawnictwo Helion
 
Flash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowyFlash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowyWydawnictwo Helion
 
Strażnik bezpieczeństwa danych
Strażnik bezpieczeństwa danychStrażnik bezpieczeństwa danych
Strażnik bezpieczeństwa danychWydawnictwo Helion
 
Diagnostyka sprzętu komputerowego
Diagnostyka sprzętu komputerowegoDiagnostyka sprzętu komputerowego
Diagnostyka sprzętu komputerowegoWydawnictwo Helion
 

What's hot (20)

Java. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie koduJava. Obsługa wyjątków, usuwanie błędów i testowanie kodu
Java. Obsługa wyjątków, usuwanie błędów i testowanie kodu
 
Perl. Zaawansowane programowanie
Perl. Zaawansowane programowaniePerl. Zaawansowane programowanie
Perl. Zaawansowane programowanie
 
Cisza w sieci
Cisza w sieciCisza w sieci
Cisza w sieci
 
Wykrywanie włamań i aktywna ochrona danych
Wykrywanie włamań i aktywna ochrona danychWykrywanie włamań i aktywna ochrona danych
Wykrywanie włamań i aktywna ochrona danych
 
Apache. Zabezpieczenia aplikacji i serwerów WWW
Apache. Zabezpieczenia aplikacji i serwerów WWWApache. Zabezpieczenia aplikacji i serwerów WWW
Apache. Zabezpieczenia aplikacji i serwerów WWW
 
101 zabezpieczeń przed atakami w sieci komputerowej
101 zabezpieczeń przed atakami w sieci komputerowej101 zabezpieczeń przed atakami w sieci komputerowej
101 zabezpieczeń przed atakami w sieci komputerowej
 
Bezpieczeństwo w sieciach Windows
Bezpieczeństwo w sieciach WindowsBezpieczeństwo w sieciach Windows
Bezpieczeństwo w sieciach Windows
 
To tylko awaria, czyli katastrofy i wpadki z pecetem
To tylko awaria, czyli katastrofy i wpadki z pecetemTo tylko awaria, czyli katastrofy i wpadki z pecetem
To tylko awaria, czyli katastrofy i wpadki z pecetem
 
Uczta programistów
Uczta programistówUczta programistów
Uczta programistów
 
Praktyczny kurs asemblera
Praktyczny kurs asembleraPraktyczny kurs asemblera
Praktyczny kurs asemblera
 
Cracking bez tajemnic
Cracking bez tajemnicCracking bez tajemnic
Cracking bez tajemnic
 
Asembler dla procesorów Intel. Vademecum profesjonalisty
Asembler dla procesorów Intel. Vademecum profesjonalistyAsembler dla procesorów Intel. Vademecum profesjonalisty
Asembler dla procesorów Intel. Vademecum profesjonalisty
 
Hardware Hacking. Edycja polska
Hardware Hacking. Edycja polskaHardware Hacking. Edycja polska
Hardware Hacking. Edycja polska
 
ABC ochrony komputera przed atakami hakera
ABC ochrony komputera przed atakami hakeraABC ochrony komputera przed atakami hakera
ABC ochrony komputera przed atakami hakera
 
Znajdź błąd. Sztuka analizowania kodu
Znajdź błąd. Sztuka analizowania koduZnajdź błąd. Sztuka analizowania kodu
Znajdź błąd. Sztuka analizowania kodu
 
ABC ochrony przed wirusami
ABC ochrony przed wirusamiABC ochrony przed wirusami
ABC ochrony przed wirusami
 
Kryptografia w Javie. Od podstaw
Kryptografia w Javie. Od podstawKryptografia w Javie. Od podstaw
Kryptografia w Javie. Od podstaw
 
Flash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowyFlash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowy
 
Strażnik bezpieczeństwa danych
Strażnik bezpieczeństwa danychStrażnik bezpieczeństwa danych
Strażnik bezpieczeństwa danych
 
Diagnostyka sprzętu komputerowego
Diagnostyka sprzętu komputerowegoDiagnostyka sprzętu komputerowego
Diagnostyka sprzętu komputerowego
 

Viewers also liked

C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówWydawnictwo Helion
 
PC hardware. Almanach. Wydanie III
PC hardware. Almanach. Wydanie IIIPC hardware. Almanach. Wydanie III
PC hardware. Almanach. Wydanie IIIWydawnictwo Helion
 
STL w praktyce. 50 sposobów efektywnego wykorzystania
STL w praktyce. 50 sposobów efektywnego wykorzystaniaSTL w praktyce. 50 sposobów efektywnego wykorzystania
STL w praktyce. 50 sposobów efektywnego wykorzystaniaWydawnictwo Helion
 
Adobe After Effects 6.0. Oficjalny podręcznik
Adobe After Effects 6.0. Oficjalny podręcznikAdobe After Effects 6.0. Oficjalny podręcznik
Adobe After Effects 6.0. Oficjalny podręcznikWydawnictwo Helion
 
Bezpieczeństwo w Linuksie. Podręcznik administratora
Bezpieczeństwo w Linuksie. Podręcznik administratoraBezpieczeństwo w Linuksie. Podręcznik administratora
Bezpieczeństwo w Linuksie. Podręcznik administratoraWydawnictwo Helion
 
PowerPoint 2003 PL. Ćwiczenia
PowerPoint 2003 PL. ĆwiczeniaPowerPoint 2003 PL. Ćwiczenia
PowerPoint 2003 PL. ĆwiczeniaWydawnictwo Helion
 
C++. Strategie i taktyki. Vademecum profesjonalisty
C++. Strategie i taktyki. Vademecum profesjonalistyC++. Strategie i taktyki. Vademecum profesjonalisty
C++. Strategie i taktyki. Vademecum profesjonalistyWydawnictwo Helion
 
Flash MX 2004. Skuteczne rozwiązania
Flash MX 2004. Skuteczne rozwiązaniaFlash MX 2004. Skuteczne rozwiązania
Flash MX 2004. Skuteczne rozwiązaniaWydawnictwo Helion
 
INTERsoft IntelliCAD 4.0 PL. Pierwsze kroki
INTERsoft IntelliCAD 4.0 PL. Pierwsze krokiINTERsoft IntelliCAD 4.0 PL. Pierwsze kroki
INTERsoft IntelliCAD 4.0 PL. Pierwsze krokiWydawnictwo Helion
 

Viewers also liked (16)

Contribute 2. Szybki start
Contribute 2. Szybki startContribute 2. Szybki start
Contribute 2. Szybki start
 
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programówC++. 50 efektywnych sposobów na udoskonalenie Twoich programów
C++. 50 efektywnych sposobów na udoskonalenie Twoich programów
 
Cisco. Receptury
Cisco. RecepturyCisco. Receptury
Cisco. Receptury
 
PC hardware. Almanach. Wydanie III
PC hardware. Almanach. Wydanie IIIPC hardware. Almanach. Wydanie III
PC hardware. Almanach. Wydanie III
 
STL w praktyce. 50 sposobów efektywnego wykorzystania
STL w praktyce. 50 sposobów efektywnego wykorzystaniaSTL w praktyce. 50 sposobów efektywnego wykorzystania
STL w praktyce. 50 sposobów efektywnego wykorzystania
 
Adobe After Effects 6.0. Oficjalny podręcznik
Adobe After Effects 6.0. Oficjalny podręcznikAdobe After Effects 6.0. Oficjalny podręcznik
Adobe After Effects 6.0. Oficjalny podręcznik
 
Bezpieczeństwo w Linuksie. Podręcznik administratora
Bezpieczeństwo w Linuksie. Podręcznik administratoraBezpieczeństwo w Linuksie. Podręcznik administratora
Bezpieczeństwo w Linuksie. Podręcznik administratora
 
PowerPoint 2003 PL. Ćwiczenia
PowerPoint 2003 PL. ĆwiczeniaPowerPoint 2003 PL. Ćwiczenia
PowerPoint 2003 PL. Ćwiczenia
 
Mandrake Linux
Mandrake LinuxMandrake Linux
Mandrake Linux
 
C++. Strategie i taktyki. Vademecum profesjonalisty
C++. Strategie i taktyki. Vademecum profesjonalistyC++. Strategie i taktyki. Vademecum profesjonalisty
C++. Strategie i taktyki. Vademecum profesjonalisty
 
Linux. Leksykon kieszonkowy
Linux. Leksykon kieszonkowyLinux. Leksykon kieszonkowy
Linux. Leksykon kieszonkowy
 
Red Hat Linux 9. Biblia
Red Hat Linux 9. BibliaRed Hat Linux 9. Biblia
Red Hat Linux 9. Biblia
 
Flash MX 2004. Skuteczne rozwiązania
Flash MX 2004. Skuteczne rozwiązaniaFlash MX 2004. Skuteczne rozwiązania
Flash MX 2004. Skuteczne rozwiązania
 
Optymalizacja systemu Windows
Optymalizacja systemu WindowsOptymalizacja systemu Windows
Optymalizacja systemu Windows
 
INTERsoft IntelliCAD 4.0 PL. Pierwsze kroki
INTERsoft IntelliCAD 4.0 PL. Pierwsze krokiINTERsoft IntelliCAD 4.0 PL. Pierwsze kroki
INTERsoft IntelliCAD 4.0 PL. Pierwsze kroki
 
Złóż własny komputer
Złóż własny komputerZłóż własny komputer
Złóż własny komputer
 

Similar to The Shellcoders Handbook. Edycja polska

Hack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polskaHack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polskaWydawnictwo Helion
 
Czytanie kodu. Punkt widzenia twórców oprogramowania open source
Czytanie kodu. Punkt widzenia twórców oprogramowania open sourceCzytanie kodu. Punkt widzenia twórców oprogramowania open source
Czytanie kodu. Punkt widzenia twórców oprogramowania open sourceWydawnictwo Helion
 
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktykJęzyk C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktykWydawnictwo Helion
 
Vademecum hakera. Zabezpieczenia w Windows
Vademecum hakera. Zabezpieczenia w WindowsVademecum hakera. Zabezpieczenia w Windows
Vademecum hakera. Zabezpieczenia w WindowsWydawnictwo Helion
 
PHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czasPHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czasWydawnictwo Helion
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programistyWydawnictwo Helion
 
Bezpieczeństwo w Windows Server 2003. Kompendium
Bezpieczeństwo w Windows Server 2003. KompendiumBezpieczeństwo w Windows Server 2003. Kompendium
Bezpieczeństwo w Windows Server 2003. KompendiumWydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
Programowanie w języku C. Szybki start
Programowanie w języku C. Szybki startProgramowanie w języku C. Szybki start
Programowanie w języku C. Szybki startWydawnictwo Helion
 
.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemnice.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemniceWydawnictwo Helion
 
OpenBSD. Podstawy administracji systemem
OpenBSD. Podstawy administracji systememOpenBSD. Podstawy administracji systemem
OpenBSD. Podstawy administracji systememWydawnictwo Helion
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Wydawnictwo Helion
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanieWydawnictwo Helion
 
Profesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputerProfesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputerWydawnictwo Helion
 
Perl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programistyPerl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programistyWydawnictwo Helion
 
Strukturalna organizacja systemów komputerowych. Wydanie V
Strukturalna organizacja systemów komputerowych. Wydanie VStrukturalna organizacja systemów komputerowych. Wydanie V
Strukturalna organizacja systemów komputerowych. Wydanie VWydawnictwo Helion
 

Similar to The Shellcoders Handbook. Edycja polska (19)

Hack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polskaHack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polska
 
Win32ASM. Asembler w Windows
Win32ASM. Asembler w WindowsWin32ASM. Asembler w Windows
Win32ASM. Asembler w Windows
 
Czytanie kodu. Punkt widzenia twórców oprogramowania open source
Czytanie kodu. Punkt widzenia twórców oprogramowania open sourceCzytanie kodu. Punkt widzenia twórców oprogramowania open source
Czytanie kodu. Punkt widzenia twórców oprogramowania open source
 
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktykJęzyk C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
Język C++. Standardy kodowania. 101 zasad, wytycznych i zalecanych praktyk
 
Vademecum hakera. Zabezpieczenia w Windows
Vademecum hakera. Zabezpieczenia w WindowsVademecum hakera. Zabezpieczenia w Windows
Vademecum hakera. Zabezpieczenia w Windows
 
PHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czasPHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czas
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programisty
 
Bezpieczeństwo w Windows Server 2003. Kompendium
Bezpieczeństwo w Windows Server 2003. KompendiumBezpieczeństwo w Windows Server 2003. Kompendium
Bezpieczeństwo w Windows Server 2003. Kompendium
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
Programowanie w języku C. Szybki start
Programowanie w języku C. Szybki startProgramowanie w języku C. Szybki start
Programowanie w języku C. Szybki start
 
.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemnice.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemnice
 
OpenBSD. Podstawy administracji systemem
OpenBSD. Podstawy administracji systememOpenBSD. Podstawy administracji systemem
OpenBSD. Podstawy administracji systemem
 
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0Struktury danych i techniki obiektowe na przykładzie Javy 5.0
Struktury danych i techniki obiektowe na przykładzie Javy 5.0
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie
 
Windows XP. Rejestr systemu
Windows XP. Rejestr systemuWindows XP. Rejestr systemu
Windows XP. Rejestr systemu
 
Profesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputerProfesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputer
 
Perl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programistyPerl. Testowanie. Zapiski programisty
Perl. Testowanie. Zapiski programisty
 
Linux. Komendy i polecenia
Linux. Komendy i poleceniaLinux. Komendy i polecenia
Linux. Komendy i polecenia
 
Strukturalna organizacja systemów komputerowych. Wydanie V
Strukturalna organizacja systemów komputerowych. Wydanie VStrukturalna organizacja systemów komputerowych. Wydanie V
Strukturalna organizacja systemów komputerowych. Wydanie V
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

The Shellcoders Handbook. Edycja polska

  • 1. IDZ DO PRZYK£ADOWY ROZDZIA£ SPIS TRE CI The Shellcoders Handbook. Edycja polska KATALOG KSI¥¯EK Autorzy: J. Koziol, D. Litchfield, D. Aitel, Ch. Anley, S. Eren, N. Mehta, R. Hassell KATALOG ONLINE T³umaczenie: Jaromir Senczyk ISBN: 83-7361-597-0 ZAMÓW DRUKOWANY KATALOG Tytu³ orygina³u: The Shellcoders Handbook Format: B5, stron: 560 Przyk³ady na ftp: 165 kB TWÓJ KOSZYK Usuñ luki w zabezpieczeniach programów i systemów operacyjnych DODAJ DO KOSZYKA • Poznaj przyczyny powstawania luk • Naucz siê sposobów w³amañ do systemów • Podejmij odpowiednie rodki zapobiegawcze CENNIK I INFORMACJE Niemal co tydzieñ dowiadujemy siê o nowych „³atach” usuwaj¹cych luki w zabezpieczeniach systemów operacyjnych i programów. Niestety — czêsto, zanim ³ata ZAMÓW INFORMACJE zostanie rozpowszechniona i zainstalowana na komputerach, kto wykorzysta „dziurê” O NOWO CIACH w systemie i w³amie siê do niego. Có¿ wiêc zrobiæ, aby zabezpieczyæ swoje dane przez atakiem hakera? Jak znale æ s³abe punkty zabezpieczeñ i usun¹æ je? W jaki sposób ZAMÓW CENNIK zaimplementowaæ odpowiednie zabezpieczenia w tworzonym przez siebie oprogramowaniu? Ksi¹¿ka „The Shellcoder’s handbook. Edycja polska” zawiera odpowiedzi na wszystkie CZYTELNIA te pytania. Ksi¹¿ka bêd¹ca efektem pracy zespo³u z³o¿onego ze specjalistów w zakresie bezpieczeñstwa systemów komputerowych, analityków i hakerów przedstawia sposoby FRAGMENTY KSI¥¯EK ONLINE wykrywania s³abych punktów oprogramowania tworzonego w jêzyku C i sprawdzenia mo¿liwo ci ich wykorzystania. Opisuje luki w istniej¹cych systemach i programach oraz sposoby ich zabezpieczenia. Zawarte w niej wiadomo ci pozwol¹ na tworzenie w³asnych systemów wykrywania b³êdów i pomog¹ ustaliæ, czy b³êdy te stanowi¹ potencjalne zagro¿enie. • Podstawowe metody w³amañ do ró¿nych systemów operacyjnych • Techniki przepe³niania stosu, wykorzystywania kodu pow³oki i b³êdów ³añcuchów formatuj¹cych • Kontrola s³abych punktów programów metodami wstrzykiwania kodu i fuzzingu • Kontrola kodu ród³owego programów • Klasy b³êdów Wydawnictwo Helion • Sposoby ledzenia s³abych punktów ul. Chopina 6 • Analiza kodu binarnego 44-100 Gliwice • Tworzenie eksploitów tel. (32)230-98-63 • Ataki na systemy zarz¹dzania bazami danych e-mail: helion@helion.pl
  • 2. Spis treści O Autorach ...................................................................................... 13 Część I Wprowadzenie do metod włamań: Linux na procesorach x86 ..............................................15 Rozdział 1. Wprowadzenie ................................................................................. 17 Podstawowe pojęcia ........................................................................................................ 17 Zarządzanie pamięcią................................................................................................ 18 Asembler ................................................................................................................... 20 Rozpoznawanie przekładu kodu C++ w języku asemblera.............................................. 21 Podsumowanie ................................................................................................................ 23 Rozdział 2. Przepełnienia stosu.......................................................................... 25 Bufory ............................................................................................................................. 25 Stos.................................................................................................................................. 27 Wywołania funkcji i stos........................................................................................... 28 Przepełnianie buforów na stosie ...................................................................................... 31 Wykorzystanie rejestru EIP....................................................................................... 32 Zdobywanie uprawnień root............................................................................................ 34 Problem adresu.......................................................................................................... 36 Metoda rozkazów NOP ............................................................................................. 39 Stos zabraniający wykonywania rozkazów ..................................................................... 41 Metoda powrotu do biblioteki libc ............................................................................ 41 Podsumowanie ................................................................................................................ 44 Rozdział 3. Kod powłoki..................................................................................... 45 Wywołania systemowe.................................................................................................... 46 Kod powłoki u ywający wywołania systemowego exit()................................................ 48 Wstrzykiwanie kodu powłoki.......................................................................................... 51 Tworzenie nowej powłoki ............................................................................................... 53 Podsumowanie ................................................................................................................ 61 Rozdział 4. Błędy łańcuchów formatujących ....................................................... 63 Warunki wstępne............................................................................................................. 63 Łańcuchy formatujące ..................................................................................................... 63 Błędy łańcuchów formatujących ..................................................................................... 65
  • 3. 6 The Shellcoder's Handbook. Edycja polska Włamania za pomocą łańcuchów formatujących............................................................. 69 Atak na usługę........................................................................................................... 70 Ujawnianie informacji............................................................................................... 71 Przejęcie sterowania ........................................................................................................ 76 Jak to mo liwe? ............................................................................................................... 85 Przegląd technik łańcucha formatującego ....................................................................... 85 Podsumowanie ................................................................................................................ 88 Rozdział 5. Wprowadzenie do metod przepełnienia sterty.................................... 89 Sterta ............................................................................................................................... 89 Zarządzanie stertą...................................................................................................... 91 Wyszukiwanie przepełnień sterty .................................................................................... 91 Podstawowe metody przepełniania sterty.................................................................. 92 Średnio zaawansowane metody przepełniania stosu ................................................. 98 Zaawansowane przepełnienia sterty ........................................................................ 104 Podsumowanie .............................................................................................................. 105 Część II Włamania na platformach Windows, Solaris i Tru64.......107 Rozdział 6. Wprowadzenie do systemu Windows............................................... 109 Ró nice między systemami Linux i Windows............................................................... 109 Win32 i PE-COFF................................................................................................... 110 Sterty ............................................................................................................................. 112 Wątki....................................................................................................................... 113 Zalety i wady DCOM i DCE-RPC ................................................................................ 114 Rozpoznanie............................................................................................................ 116 Włamania ................................................................................................................ 117 Tokeny i podszywanie............................................................................................. 118 Obsługa wyjątków w Win32 ................................................................................... 120 Śledzenie działania programów w systemie Windows .................................................. 121 Błędy w Win32 ....................................................................................................... 122 Tworzenie kodu powłoki w systemie Windows...................................................... 122 Przewodnik hakera po funkcjach Win32................................................................. 123 Rodzina systemów Windows z punktu widzenia hakera......................................... 123 Podsumowanie .............................................................................................................. 124 Rozdział 7. Kody powłoki w Windows ............................................................... 125 Składnia i filtry.............................................................................................................. 125 Przygotowywanie kodu powłoki ................................................................................... 126 Parsowanie bloków PEB ............................................................................................... 127 Analiza kodu heapoverflow.c.................................................................................. 128 Przeszukiwanie z u yciem obsługi wyjątków................................................................ 143 Tworzenie nowej powłoki ............................................................................................. 146 Dlaczego nie warto tworzyć nowej powłoki w Windows ....................................... 147 Podsumowanie .............................................................................................................. 148 Rozdział 8. Przepełnienia w systemie Windows................................................. 149 Przepełnienia buforów na stosie .................................................................................... 149 Procedury obsługi wyjątków dla ramek wywołań funkcji....................................... 150 Wykorzystanie procedur obsługi wyjątków na platformie Windows 2003 Server.. 154 Końcowe uwagi na temat nadpisań procedur obsługi wyjątków ............................. 158 Ochrona stosu i Windows 2003 Server ......................................................................... 159 Przepełnienia sterty ....................................................................................................... 164 Sterta procesu.......................................................................................................... 164 Sterty dynamiczne................................................................................................... 165
  • 4. Spis treści 7 Korzystanie ze sterty ............................................................................................... 165 Jak działa sterta ....................................................................................................... 165 Wykorzystanie przepełnień sterty.................................................................................. 168 Nadpisanie wskaźnika funkcji RtlEnterCriticalSection w bloku PEB..................... 169 Nadpisanie wskaźnika pierwszej wektoryzowanej procedury obsługi wyjątków pod adresem 77FC3210 ........................................................................................ 171 Nadpisanie wskaźnika filtra nieobsłu onych wyjątków .......................................... 174 Nadpisanie wskaźnika procedury obsługi wyjątków w bloku TEB ........................ 179 Naprawa sterty ........................................................................................................ 180 Inne aspekty przepełnień sterty ............................................................................... 182 Podsumowanie przepełnień sterty ........................................................................... 183 Inne przepełnienia ......................................................................................................... 183 Przepełnienia sekcji .data ........................................................................................ 183 Przepełnienia bloków TEB i PEB ........................................................................... 185 Przepełnienie buforów i stosy zabraniające wykonania kodu........................................ 185 Podsumowanie .............................................................................................................. 190 Rozdział 9. Filtry ............................................................................................. 191 Tworzenie eksploitów i filtry alfanumeryczne .............................................................. 191 Tworzenie eksploitów i filtry Unicode .......................................................................... 195 Unicode................................................................................................................... 195 Konwersja z ASCII na Unicode .............................................................................. 196 Wykorzystanie słabych punktów związanych z kodem Unicode .................................. 196 Zbiór rozkazów dostępnych dla eksploitów Unicode.............................................. 197 Metoda wenecka............................................................................................................ 198 Implementacja metody weneckiej dla kodu ASCII ................................................. 199 Dekoder i dekodowanie................................................................................................. 202 Kod dekodera .......................................................................................................... 203 Ustalenie adresu bufora........................................................................................... 204 Podsumowanie .............................................................................................................. 205 Rozdział 10. Wprowadzenie do włamań w systemie Solaris ................................. 207 Wprowadzenie do architektury SPARC ........................................................................ 208 Rejestry i okna rejestrów......................................................................................... 208 Szczelina zwłoki ..................................................................................................... 210 Rozkazy zło one ..................................................................................................... 211 Kody powłoki na platformie Solaris/SPARC ................................................................ 211 Kod powłoki i określanie własnego poło enia ........................................................ 212 Prosty kod powłoki dla platformy SPARC.............................................................. 212 Przydatne wywołania systemu Solaris .................................................................... 213 Rozkaz NOP i rozkazy wypełniające ...................................................................... 214 Ramki na stosie platformy Solaris/SPARC ................................................................... 214 Techniki przepełnień stosu ............................................................................................ 215 Przepełnienia o dowolnym rozmiarze ..................................................................... 215 Okna rejestrów komplikują przepełnienia stosu...................................................... 216 Inne czynniki utrudniające przepełnienia stosu....................................................... 216 Mo liwe rozwiązania .............................................................................................. 217 Przepełnienia jednym bajtem .................................................................................. 217 Poło enie kodu powłoki .......................................................................................... 218 Przykłady przepełnień stosu .......................................................................................... 219 Atakowany program................................................................................................ 219 Eksploit ................................................................................................................... 221 Przepełnienia sterty na platformie Solaris/SPARC........................................................ 224 Wprowadzenie do sterty systemu Solaris................................................................ 224 Struktura drzewa sterty............................................................................................ 225
  • 5. 8 The Shellcoder's Handbook. Edycja polska Metoda podstawowa (t_delete)...................................................................................... 243 Ograniczenia standardowych przepełnień sterty ..................................................... 246 Cele nadpisań .......................................................................................................... 247 Inne słabe punkty sterty................................................................................................. 249 Przepełnienia jednym bajtem .................................................................................. 250 Podwójne zwolnienie .............................................................................................. 250 Inne błędy funkcji free().......................................................................................... 250 Przykład przepełnienia sterty......................................................................................... 251 Atakowany program................................................................................................ 251 Inne techniki włamań w systemie Solaris...................................................................... 255 Przepełnienia danych statycznych........................................................................... 255 Obejście zabezpieczenia stosu................................................................................. 255 Podsumowanie .............................................................................................................. 256 Rozdział 11. Zaawansowane metody włamań w systemie Solaris........................ 257 Śledzenie modułu dynamicznej konsolidacji krok po kroku ......................................... 258 Sztuczki przepełnień sterty Solaris/SPARC .................................................................. 271 Zaawansowany kod powłoki na platformie Solaris/SPARC ......................................... 273 Podsumowanie .............................................................................................................. 284 Rozdział 12. Włamania w systemie HP Tru64 Unix ............................................. 285 Architektura procesorów Alpha..................................................................................... 286 Rejestry procesorów Alpha ..................................................................................... 286 Zbiór rozkazów ....................................................................................................... 287 Konwencje wywołań............................................................................................... 287 Pobieranie licznika rozkazów (GetPC).......................................................................... 289 Wywołania systemowe.................................................................................................. 291 Dekoder XOR dla kodu powłoki ................................................................................... 291 Kod powłoki setuid + execve ........................................................................................ 293 Wywołania systemowe setuid(0) i execve("/bin/sh", ...) ......................................... 293 Kompilacja kodu w asemblerze i wyodrębnienie kodu powłoki ............................. 294 Kodowanie uzyskanych kodów powłoki funkcją XOR........................................... 295 Dołączenie zakodowanego kodu do dekodera XOR ............................................... 296 Kompilacja i wyodrębnienie ostatecznej postaci kodu powłoki.............................. 297 Kod powłoki zestawiający połączenie zwrotne ............................................................. 299 Kod powłoki wyszukujący gniazdo sieciowe ................................................................ 300 Kod powłoki dowiązujący gniazdo sieciowe................................................................. 301 Przepełnienia stosu........................................................................................................ 303 Obejście ochrony stosu ........................................................................................... 303 Włamanie do usługi rpc.ttdbserver ................................................................................ 304 Podsumowanie .............................................................................................................. 311 Część III Wykrywanie słabych punktów .......................................313 Rozdział 13. Tworzenie środowiska pracy........................................................... 315 Źródła informacji........................................................................................................... 316 Narzędzia do tworzenia kodu ........................................................................................ 316 gcc........................................................................................................................... 316 gdb .......................................................................................................................... 317 NASM ..................................................................................................................... 317 WinDbg................................................................................................................... 317 OllyDbg................................................................................................................... 317 SoftICE ................................................................................................................... 318 Visual C++.............................................................................................................. 318 Python ..................................................................................................................... 318
  • 6. Spis treści 9 Narzędzia śledzenia kodu .............................................................................................. 318 Własne skrypty........................................................................................................ 318 Wszystkie platformy ............................................................................................... 320 Unix ........................................................................................................................ 320 Windows ................................................................................................................. 321 Artykuły, które powinieneś przeczytać ......................................................................... 322 Archiwa artykułów.................................................................................................. 324 Optymalizacja procesu tworzenia kodu powłoki ........................................................... 325 Plan eksploitu.......................................................................................................... 325 Tworzenie kodu powłoki za pomocą asemblera wbudowanego w kompilator........ 325 Biblioteka kodów powłoki ...................................................................................... 327 Kontynuacja działania atakowanego procesu.......................................................... 327 Zwiększanie stabilności eksploitu ........................................................................... 328 Wykorzystanie istniejącego połączenia................................................................... 329 Podsumowanie .............................................................................................................. 330 Rozdział 14. Wstrzykiwanie błędów.................................................................... 331 Ogólny projekt systemu................................................................................................. 332 Generowanie danych wejściowych ......................................................................... 332 Wstrzykiwanie błędów............................................................................................ 335 Moduł modyfikacji.................................................................................................. 335 Dostarczanie błędów do aplikacji............................................................................ 339 Algorytm Nagla....................................................................................................... 340 Zale ności czasowe................................................................................................. 340 Heurystyki............................................................................................................... 340 Protokoły ze stanem i bez........................................................................................ 341 Monitorowanie błędów.................................................................................................. 341 Wykorzystanie programu uruchomieniowego......................................................... 341 FaultMon................................................................................................................. 342 Kompletna aplikacja testująca ....................................................................................... 342 Podsumowanie .............................................................................................................. 343 Rozdział 15. Fuzzing.......................................................................................... 345 Ogólna teoria fuzzingu .................................................................................................. 345 Analiza statyczna kontra fuzzing............................................................................. 349 Fuzzing jest skalowalny .......................................................................................... 349 Wady fuzzerów ............................................................................................................. 351 Modelowanie dowolnych protokołów sieciowych ........................................................ 352 Inne technologie fuzzerów ............................................................................................ 352 Migotanie bitów ...................................................................................................... 353 Modyfikacja programów open source ..................................................................... 353 Fuzzing i analiza dynamiczna ................................................................................. 353 SPIKE............................................................................................................................ 354 Jak działa SPIKE?................................................................................................... 354 Zalety stosowania struktur programu SPIKE do modelowania protokołów sieciowych.............................................................. 355 Inne fuzzery................................................................................................................... 362 Podsumowanie .............................................................................................................. 362 Rozdział 16. Kontrola kodu źródłowego .............................................................. 363 Narzędzia....................................................................................................................... 364 Cscope..................................................................................................................... 364 Ctags ....................................................................................................................... 365 Edytory.................................................................................................................... 365 Cbrowser ................................................................................................................. 365
  • 7. 10 The Shellcoder's Handbook. Edycja polska Zautomatyzowane narzędzia kontroli kodu źródłowego ............................................... 366 Metodologia .................................................................................................................. 367 Metoda zstępująca................................................................................................... 367 Metoda wstępująca.................................................................................................. 367 Metoda selektywna.................................................................................................. 367 Klasy błędów................................................................................................................. 368 Ogólne błędy logiki................................................................................................. 368 (Prawie) wymarłe klasy błędów .............................................................................. 368 Błędy łańcuchów formatujących ............................................................................. 369 Ogólne błędy określenia zakresu............................................................................. 370 Pętle ........................................................................................................................ 371 Przepełnienia jednym bajtem .................................................................................. 372 Błędy braku zakończenia łańcucha ......................................................................... 373 Błędy przeskoczenia bajtu zerowego ...................................................................... 374 Błędy porównania wartości ze znakiem .................................................................. 375 Błędy związane z wartościami całkowitymi............................................................ 376 Konwersje wartości całkowitych o ró nej reprezentacji ......................................... 378 Błędy podwójnego zwolnienia ................................................................................ 379 U ycie obszarów pamięci poza okresem ich wa ności ........................................... 380 U ycie niezainicjowanych zmiennych .................................................................... 380 Błędy u ycia po zwolnieniu .................................................................................... 381 Wielowątkowość i kod wielobie ny........................................................................ 382 Słabe punkty i zwykłe błędy.......................................................................................... 382 Podsumowanie .............................................................................................................. 383 Rozdział 17. Ręczne wykrywanie błędów ............................................................ 385 Filozofia ........................................................................................................................ 385 Przepełnienie extproc systemu Oracle........................................................................... 386 Typowe błędy architektury............................................................................................ 390 Problemy pojawiają się na granicach ...................................................................... 390 Problemy pojawiają się podczas przekładu danych................................................. 391 Problemy występują w obszarach asymetrii............................................................ 393 Problemy uwierzytelniania i autoryzacji ................................................................. 393 Problemy występują w najbardziej oczywistych miejscach .................................... 394 Obejście kontroli danych wejściowych i wykrywanie ataku ......................................... 394 Filtrowanie niedozwolonych danych....................................................................... 395 Zastosowanie alternatywnego kodowania ............................................................... 395 Dostęp do plików .................................................................................................... 396 Unikanie sygnatur ataków ....................................................................................... 398 Pokonywanie ograniczeń długości .......................................................................... 398 Atak typu DOS na implementację SNMP w Windows 2000 ........................................ 400 Wykrywanie ataków typu DOS..................................................................................... 401 SQL-UDP...................................................................................................................... 402 Podsumowanie .............................................................................................................. 403 Rozdział 18. Śledzenie słabych punktów ............................................................ 405 Wprowadzenie............................................................................................................... 406 Przykładowy program zawierający słaby punkt ...................................................... 406 Projekt komponentów ............................................................................................. 409 Budujemy VulnTrace .............................................................................................. 416 Posługiwanie się biblioteką VulnTrace ................................................................... 421 Techniki zaawansowane.......................................................................................... 424 Podsumowanie .............................................................................................................. 425
  • 8. Spis treści 11 Rozdział 19. Audyt kodu binarnego .................................................................... 427 Audyt kodu binarnego i kontrola kodu źródłowego — podobieństwa i ró nice............ 427 IDA Pro ......................................................................................................................... 428 Krótki kurs obsługi.................................................................................................. 429 Symbole uruchomieniowe....................................................................................... 430 Wprowadzenie do audytu kodu binarnego .................................................................... 430 Ramki stosu............................................................................................................. 430 Konwencje wywołań............................................................................................... 432 Kod generowany przez kompilator ......................................................................... 433 Konstrukcje typu memcpy ...................................................................................... 436 Konstrukcje typu strlen ........................................................................................... 437 Konstrukcje języka C++.......................................................................................... 438 Wskaźnik this.......................................................................................................... 438 Odtwarzanie definicji klas............................................................................................. 438 Tablice funkcji wirtualnych .................................................................................... 439 Proste, ale przydatne wskazówki............................................................................. 440 Ręczna analiza kodu binarnego ..................................................................................... 440 Szybka weryfikacja wywołań bibliotecznych ......................................................... 440 Podejrzane pętle i rozkazy zapisu ........................................................................... 440 Błędy logiki............................................................................................................. 441 Graficzna analiza kodu binarnego........................................................................... 442 Ręczna dekompilacja .............................................................................................. 442 Przykłady analizy kodu binarnego ................................................................................ 443 Błędy serwera Microsoft SQL................................................................................. 443 Błąd RPC-DCOM wykryty przez grupę LSD ......................................................... 444 Błąd IIS WebDAV .................................................................................................. 444 Podsumowanie .............................................................................................................. 446 Część IV Techniki zaawansowane ...............................................447 Rozdział 20. Alternatywne strategie eksploitów ................................................. 449 Modyfikacja programu .................................................................................................. 450 Modyfikacja 3 bajtów kodu systemu SQL Server ......................................................... 450 MySQL i modyfikacja 1 bitu......................................................................................... 454 Modyfikacja uwierzytelniania RSA w OpenSSH.......................................................... 456 Inne koncepcje modyfikacji działającego kodu............................................................. 457 Modyfikacja generatora losowego w GPG 1.2.2..................................................... 458 Serwer progletów .......................................................................................................... 459 Proxy wywołań systemowych ....................................................................................... 459 Problemy związane z proxy wywołań systemowych..................................................... 461 Podsumowanie .............................................................................................................. 470 Rozdział 21. Eksploity działające w rzeczywistym środowisku ............................. 471 Czynniki wpływające na niezawodność ........................................................................ 471 Magiczne adresy...................................................................................................... 471 Problem wersji ........................................................................................................ 472 Problemy kodu powłoki .......................................................................................... 473 Środki zaradcze ............................................................................................................. 475 Przygotowanie......................................................................................................... 476 Metoda pełnego przeglądu ...................................................................................... 476 Lokalny eksploit...................................................................................................... 477 Sygnatury systemów i aplikacji............................................................................... 477 Wycieki informacji.................................................................................................. 479 Podsumowanie .............................................................................................................. 479
  • 9. 12 The Shellcoder's Handbook. Edycja polska Rozdział 22. Ataki na systemy baz danych ......................................................... 481 Ataki w warstwie sieciowej........................................................................................... 482 Ataki w warstwie aplikacji ............................................................................................ 491 Wykonywanie poleceń systemu operacyjnego .............................................................. 491 Microsoft SQL Server ............................................................................................. 492 Oracle...................................................................................................................... 492 IBM DB2 ................................................................................................................ 493 Wykorzystanie przepełnień na poziomie języka SQL ................................................... 495 Funkcje języka SQL................................................................................................ 496 Podsumowanie .............................................................................................................. 497 Rozdział 23. Przepełnienia jądra......................................................................... 499 Typy słabych punktów jądra ......................................................................................... 499 Słabe punkty jądra ......................................................................................................... 507 Przepełnienie stosu przez wywołanie exec_ibcs2_coff_prep_zmagic() w systemie OpenBSD ........................................................................................... 507 Słaby punkt ............................................................................................................. 508 Funkcja vfs_getvfssw() i mo liwość przeglądania modułów jądra w systemie Solaris .. 512 Wywołanie systemowe sysfs() ................................................................................ 514 Wywołanie systemowe mount().............................................................................. 514 Podsumowanie .............................................................................................................. 515 Rozdział 24. Wykorzystanie słabych punktów jądra ............................................ 517 Słaby punkt funkcji exec_ibcs2_coff_prep_zmagic().................................................... 517 Wyznaczenie przesunięć i adresów pułapek ........................................................... 522 Nadpisanie adresu powrotu i przejęcie sterowania.................................................. 523 Wyszukiwanie deskryptora procesu (lub struktury proc) ........................................ 524 Kod eksploitu wykonywany w trybie jądra............................................................. 526 Powrót kodu wykonywanego na poziomie jądra..................................................... 528 Uzyskanie uprawnień root (uid=0).......................................................................... 533 Eksploit słabego punktu funkcji vfs_getvfssw() systemu Solaris.................................. 538 Eksploit ................................................................................................................... 539 Moduł jądra............................................................................................................. 540 Uzyskanie uprawnień root (uid=0).......................................................................... 543 Podsumowanie .............................................................................................................. 544 Dodatki .......................................................................................545 Skorowidz ..................................................................................... 547
  • 10. Rozdział 8. Przepełnienia w systemie Windows Zakładamy, e Czytelnik przystępujący do lektury tego rozdziału posiada przynajmniej podstawową znajomość systemu Windows NT lub jego późniejszych wersji, a tak e zna sposoby wykorzystywania przepełnień buforów na tej platformie. W rozdziale omó- wimy bardziej zaawansowane aspekty przepełnień w systemie Windows, na przykład związane z obchodzeniem zabezpieczeń stosu zastosowanych w systemie Windows 2003 Server czy przepełnieniami sterty. Zrozumienie tych zagadnień wymagać będzie znajomości kluczowych rozwiązań zastosowanych na platformie Windows, takich jak bloki TEB (Thread Environment Block) i PEB (Process Environment Block), a tak e struktury pamięci procesów, plików wykonywalnych oraz nagłówków PE. Jeśli któreś z tych pojęć są obce Czytelnikowi, to przed przystąpieniem do lektury tego rozdziału powinien uzupełnić wiadomości w tym zakresie. W rozdziale będziemy korzystać z narzędzi wchodzących w skład pakietu Visual Studio 6 firmy Microsoft, w szczególności z programu uruchomieniowego MSDEV, kompilatora języka C wywoływanego z wiersza poleceń (cl) oraz programu dumpbin. Program dumpbin jest doskonałym narzędziem uruchamianym z wiersza poleceń — wyświetla wszelkie informacje o plikach binarnych, tabelach importu i eksportu, sekcjach pli- ków oraz kodzie w asemblerze. Czytelnikom, którzy wolą posługiwać się narzędziem wyposa onym w graficzny interfejs u ytkownika, proponujemy doskonały deasembler firmy Datarescue o nazwie IDA Pro. Tworząc kod eksploitów na platformie Windows, mo emy korzystać ze składni asemblera zgodnej z przyjętą przez firmę Intel bądź za- proponowanej przez AT&T. Wybór zale y od indywidualnych upodobań i preferencji. Przepełnienia buforów na stosie Metoda przepełniania buforów znana jest ju od wielu lat i z pewnością będzie wykorzy- stywana równie w przyszłości. I nadal za ka dym razem, gdy jest wykrywana w nowo- czesnym oprogramowaniu, nie wiadomo, czy śmiać się, czy płakać. Tak czy owak, błędy
  • 11. 150 Część II ♦ Włamania na platformach Windows, Solaris i Tru64 te stanowią doskonałą po ywkę dla początkujących hakerów. W sieci Internet dostęp- nych jest wiele dokumentów szczegółowo opisujących sposoby wykorzystywania prze- pełnień buforów. Omówiliśmy je równie w pierwszych rozdziałach tej ksią ki, dlate- go teraz nie będziemy ju powtarzać tych informacji. Typowy eksploit bazujący na przepełnieniu stosu doprowadza do nadpisania adresu po- wrotu zapisanego na stosie adresem, który wskazuje rozkaz lub blok kodu przekazujący sterowanie do kodu umieszczonego w buforze u ytkownika. Zanim zajmiemy się po- głębieniem tego zagadnienia, krótko omówimy procedury obsługi wyjątków bazujących na ramkach stosu. Następnie przyjrzymy się sposobom nadpisywania struktur rejestracji wyjątków na stosie i poka emy, w jaki sposób technika taka mo e prowadzić do obej- ścia zabezpieczeń stosu wbudowanych w system Windows 2003 Server. Procedury obsługi wyjątków dla ramek wywołań funkcji Procedura obsługi wyjątków jest fragmentem kodu, który zostaje wywołany na skutek pojawienia się problemu podczas wykonania procesu, na przykład naruszenia uprawnień dostępu bądź wykonania dzielenia przez zero. Procedury obsługi wyjątków mogą być powiązane z konkretnymi funkcjami. Wywołanie ka dej funkcji prowadzi do utworzenia na stosie odpowiadającej jej ramki wywołania. Informacja o procedurze obsługi wyjątków mo e zostać umieszczona w ramce wywołania w strukturze ':%'26+10A 4')+564#6+10. Struktura taka składa się z dwóch elementów: wskaźnika następnej struktury ':%'26+10A4')+564#6+10 oraz wskaźnika właściwej procedury obsługi wy- jątków. W ten sposób procedury obsługi wyjątków mogą tworzyć listę przedstawioną na rysunku 8.1. Rysunek 8.1. Procedury obsługi wyjątków dla ramek wywołań funkcji
  • 12. Rozdział 8. ♦ Przepełnienia w systemie Windows 151 Ka dy wątek procesu Win32 posiada przynajmniej jedną procedurę obsługi wyjątków. Procedura ta tworzona jest podczas uruchamiania wątku. Adres pierwszej struktury ':%'26+10A4')+564#6+10 znajduje się w ka dym bloku TEB pod adresem HU=?. W mo- mencie wystąpienia wyjątków lista procedur obsługi przeglądana jest do momentu zna- lezienia właściwej procedury obsługi wyjątku (czyli takiej, która zajmie się obsługą wyjątku). Obsługa wyjątków w oparciu o ramki na stosie odbywa się na poziomie ję- zyka C za pomocą słów kluczowych VT[ i GZEGRV. Przypominamy, e większość kodów przedstawionych w tej ksią ce dostępna jest pod adresem ftp://ftp.helion.pl/przyklady/ hell.zip KPENWFG UVFKQJ KPENWFG YKPFQYUJ FYQTF /['ZEGRVKQP*CPFNGT XQKF ] RTKPVH +P GZEGRVKQP JCPFNGT 'ZKV2TQEGUU TGVWTP _ KPV OCKP ] VT[ ] AACUO ] RQYQFWLG Y[LæVGM ZQT GCZGCZ ECNN GCZ _ _ AAGZEGRV /['ZEGRVKQP*CPFNGT ] RTKPVH QQRU _ TGVWTP _ Jeśli w bloku umieszczonym wewnątrz VT[ wystąpi wyjątek, to wywołana zostanie funkcja /['ZEGRVKQP*CPFNGT. W przykładzie tym celowo wywołujemy wyjątek, zeru- jąc zawartość rejestru '#:, a następnie wykonując rozkaz ECNN GCZ. Podczas przepełniania bufora na stosie i nadpisywania adresu powrotu mogą równie ulec nadpisaniu inne zmienne, co mo e być przyczyną komplikacji podczas włama- nia. Załó my na przykład, e funkcja odwołuje się do pewnej struktury za pomocą rejestru '#:, który wskazuje początek tej struktury. Niech zmienna lokalna tej funkcji reprezentuje przesunięcie wewnątrz wspomnianej struktury. Jeśli zmienna ta zostanie nadpisana przy okazji nadpisywania adresu powrotu, a następnie załadowana do reje- stru '5+ i wykonany będzie na przykład rozkaz OQX FYQTF RVT=GCZ GUK? GFZ to musimy zapewnić, e wartość, którą nadpisaliśmy tą zmienną, w połączeniu z za- wartością rejestru '#: reprezentuje adres, pod którym dozwolony jest zapis danych.
  • 13. 152 Część II ♦ Włamania na platformach Windows, Solaris i Tru64 W przeciwnym bowiem razie nastąpi naruszenie ochrony pamięci, wywołane zostaną odpowiednie procedury obsługi wyjątków, a działanie procesu zostanie najprawdopo- dobniej zakończone i stracimy szansę wykonania naszego kodu. Nawet jeśli skory- gujemy odpowiednio adres reprezentowany przez '#: '5+, to musimy liczyć się z wy- stąpieniem wielu innych podobnych problemów, którym nale y zaradzić, zanim funkcja zwróci sterowanie. W niektórych przypadkach mo e to nawet być niemo liwe. Najprostsza metoda rozwiązania tego problemu polega na nadpisaniu struktury ':%'26+10A4')+564#6+10 w taki sposób, aby zapewnić sobie kontrolę nad wskaźni- kiem procedury obsługi wyjątku. Dzięki temu w momencie wystąpienia wyjątku mo- emy przejąć kontrolę nad procesem — na przykład przez zastąpienie wskaźnika proce- dury obsługi wyjątków adresem kodu, który przeka e sterowanie z powrotem do naszego bufora. Zastanówmy się teraz, w jaki sposób nadpisać wskaźnik procedury obsługi wyjątku, abyśmy mogli wykonać dowolny kod umieszczony w buforze. Rozwiązanie zale y od konkretnej wersji systemu i zainstalowanych pakietów serwisowych. W systemach Windows 2000 i Windows XP bez zainstalowanych pakietów serwisowych rejestr '$: wskazuje bie ącą strukturę ':%'26+10A4')+564#6+10, czyli właśnie tą, którą nadpi- sujemy. Mo emy wtedy nadpisać wskaźnik procedury obsługi wyjątków za pomocą adresu, pod którym znajduje się rozkaz LOR GDZ lub ECNN GDZ. W ten sposób na skutek wystąpienia wyjątków powrócimy zawsze do nadpisanej struktury ':%'26+10A4')+ 564#6+10. Wtedy nadpiszemy wskaźnik następnej struktury ':%'26+10A4')+564#6+10 adresem kodu, który wykona krótki skok ponad adresem rozkazu LOR GDZ. Sposób nadpisania struktury ':%'26+10A4')+564#6+10 ilustruje rysunek 8.2. Rysunek 8.2. Nadpisywanie struktury EXCEPTION_ REGISTRATION W systemach Windows 2003 Server oraz Windows XP Service Pack 1 sytuacja wy- gląda jednak inaczej. Rejestr '$: nie wskazuje ju struktury ':%'26+10A4')+564#6+10. Wszystkie rejestry, które dotąd wskazywały przydatne informacje, teraz zostają wyze- rowane przed wywołaniem procedury obsługi wyjątków. Zmiany tej firma Microsoft dokonała prawdopodobnie w odpowiedzi na sposób działania robaka Code Worm, który u ywał tego mechanizmu do przejęcia kontroli nad serwerami IIS. Poni ej przedsta- wiamy kod odpowiedzialny za wspomnianą modyfikację (dla systemu Windows XP Professional SP1).
  • 14. Rozdział 8. ♦ Przepełnienia w systemie Windows 153 ($ ZQT GCZGCZ ($ ZQT GDZGDZ ($$ ZQT GUKGUK ($ ZQT GFKGFK ($( RWUJ FYQTF RVT =GUR J? ($ RWUJ FYQTF RVT =GUR J? ($ RWUJ FYQTF RVT =GUR J? ($$ RWUJ FYQTF RVT =GUR J? ($( RWUJ FYQTF RVT =GUR J? ($ ECNN ($' ($ RQR GFK ($ RQR GUK ($# RQR GDZ ($$ TGV J ($' RWUJ GDR ($( OQX GDRGUR ($ RWUJ FYQTF RVT =GDR %J? ($ RWUJ GFZ ($ RWUJ FYQTF RVT HU=? ($% OQX FYQTF RVT HU=?GUR ($ RWUJ FYQTF RVT =GDR J? ($ RWUJ FYQTF RVT =GDR J? ($ RWUJ FYQTF RVT =GDR %J? ($% RWUJ FYQTF RVT =GDR ? ($( OQX GEZFYQTF RVT =GDR J? ($# ECNN GEZ Począwszy od adresu Z($, rejestry '#:, '$:, '5+ i '+ są kolejno zerowane za pomocą rozkazu :14. Następnie pod adresem Z($ wykonywany jest rozkaz ECNN, który powoduje przejście do adresu Z($'. Rozkaz znajdujący się pod adresem Z($( umieszcza w rejestrze '%: wskaźnik procedury obsługi wyjątku, którą wywołuje następny rozkaz. Nawet mimo tej modyfikacji haker mo e przejąć kontrolę nad działaniem systemu. Jed- nak nie dysponując wartościami rejestrów, które wskazywałyby wa ne dane procesu u ytkownika, musi odnaleźć je na własną rękę. A to zmniejsza szansę powodzenia ataku. Ale czy rzeczywiście? Zaraz po wywołaniu procedury obsługi wyjątku zawartość stosu będzie wyglądać następująco: '52 CFTGU RQYTQVW Z($# '52 YUMC PKM V[RW Y[LæVMW Z% '52 CFTGU UVTWMVWT[ ':%'26+10A4')+564#6+10 Zamiast nadpisywać wskaźnik procedury obsługi wyjątków adresem rozkazu LOR GDZ lub ECNN GDZ, wystarczy nadpisać go adresem kodu zawierającego następujące rozkazy: RQR TGI RQR TGI TGV Wykonanie ka dego rozkazu 212 zwiększa wartość rejestru '52 o 4, wobec czego w mo- mencie wykonania rozkazu 4'6 rejestr '52 wskazuje dane procesu u ytkownika. Przypo- mnijmy, e rozkaz 4'6 pobiera adres znajdujący się na wierzchołku stosu (wskazywany przez '52) i powoduje przekazanie sterowania na ten adres. Dzięki temu haker nie potrzebuje ju rejestru wskazującego bufor ani nie musi domyślać się jego poło enia.
  • 15. 154 Część II ♦ Włamania na platformach Windows, Solaris i Tru64 Gdzie znajdziemy blok potrzebnych do tego rozkazów? Praktycznie na końcu kodu ka dej funkcji. Paradoksalnie najlepszym miejscem okazuje się blok rozkazów w kodzie, który zeruje rejestry przed wywołaniem procedury obsługi wyjątku. Blok ten znajduje się pod adresem Z($. ($ RQR GUK ($# RQR GDZ ($$ TGV J To, e zamiast rozkazu TGV znajduje się tam rozkaz TGV , nie ma większego znaczenia. Zwiększy on zawartość rejestru '52 o Z zamiast o Z. Wykonanie tych rozkazów przeniesie nas z powrotem do struktury ':%'26+10A4')+564#6+10 na stosie. Konieczne będzie te zastąpienie wskaźnika następnej struktury ':%'26+10A4')+564#6+10 kodem rozkazu krótkiego skoku oraz dwóch rozkazów 012 EQ RQYQNK PCO QOKPæè CFTGU YUMC WLæE[ DNQM TQMCÎY RQR RQR K TGV. Ka dy proces Win32 i ka dy wątek takiego procesu posiada przynajmniej jedną pro- cedurę obsługi wyjątków bazującą na ramce na stosie. Procedurę tę otrzymuje w mo- mencie jego uruchamiania. Jeśli stosujemy metodę przepełnień buforów na platformie Windows 2003 Server, to wykorzystanie takich procedur obsługi wyjątków umo liwi nam obejście zabezpieczeń stosu zastosowanych na tej platformie. Wykorzystanie procedur obsługi wyjątków na platformie Windows 2003 Server Wykorzystanie procedur obsługi wyjątków umo liwia obejście zabezpieczeń stosu zastosowanych na platformie Windows 2003 Server. (Omówienie tego zagadnienia zawiera punkt „Ochrona stosu i Windows 2003 Server”). W momencie wystąpienia wy- jątku na platformie Windows 2003 Server sprawdzana jest poprawność pierwszej pro- cedury obsługi skonfigurowanej dla tego wyjątku. W ten sposób Microsoft chce za- bezpieczyć się przed atakami na zasadzie przepełnienia stosu, które powodują nadpisanie adresu procedury obsługi wyjątków. W jaki sposób sprawdzana jest poprawność procedury obsługi wyjątków? Za kontrolę tę odpowiedzialny jest kod funkcji -K7UGT'ZEGRVKQPKURCVEJGT znajdującej się w bi- bliotece 06..... Najpierw sprawdza ona, czy wskaźnik procedury obsługi wyjątku nie wskazuje adresu na stosie. W tym celu u ywane są wartości w bloku TEB określające zakres adresów stosu i znajdujące się pod adresami (5=? i (5=?. Jeśli adres proce- dury obsługi wyjątku wypada w tym zakresie, to nie zostanie ona wywołana. Jeśli adres procedury obsługi wyjątku nie jest adresem stosu, to następnie adres ten porównywany jest z listą załadowanych modułów (zarówno wykonywalnych, jak i DLL). Co ciekawe, jeśli adres procedury obsługi wyjątków nie przypada w przestrzeni adresowej adnego z tych modułów, to uwa any jest za bezpieczny i procedura zostaje wywołana. W prze- ciwnym razie adres procedury obsługi wyjątków porównywany jest jeszcze z listą za- rejestrowanych procedur obsługi wyjątków. Następnie pobierany jest wskaźnik nagłówka PE za pomocą wywołania funkcji 4V N+OCIG0V*GCFGT. Jeśli bajt przesunięty Z( względem początku nagłówka (jest to naj- starszy bajt pola charakterystyki DLL w nagłówku PE) jest równy Z, to moduł ten
  • 16. Rozdział 8. ♦ Przepełnienia w systemie Windows 155 jest niedozwolony. Jeśli adres procedury obsługi wyjątku nale y do zakresu adresów tego modułu, to procedura nie zostanie wywołana. Wskaźnik nagłówka PE zostaje przekazany jako parametr funkcji 4VN+OCIGKTGEVQT['PVT[6QCVC. W tym przypadku wywołanie tej funkcji dotyczy katalogu Load Configuration Directory i zwraca adres oraz rozmiar tego katalogu. Jeśli moduł nie dysponuje tym katalogiem, to funkcja zwraca wartość 0 i na tym kończy się kontrola poprawności procedury obsługi wyjątków, która zostaje wywołana. Jeśli moduł posiada taki katalog, to sprawdzany jest jego rozmiar. Gdy nale y on do zakresu od do Z, to procedura obsługi wyjątku zostaje wywołana. W odległości Z bajtów od początku katalogu znajduje się wskaźnik tabeli adresów RVA (Relative Virtual Address) zarejestrowanych procedur obsługi wyjątków. Jeśli wskaźnik ten jest równy NULL, to procedura obsługi wyjątku zostaje wywołana. Przesunięta o Z bajtów względem początku katalogu jest liczba elementów tabeli adresów RVA. Jeśli równa się ona 0, to procedura obsługi wyjątku zostaje wywołana. Jeśli wszystkie dotychczasowe kontrole powiodły się, adres bazowy modułu zostaje odjęty od adresu procedury obsługi wyjątków i w wyniku tej operacji otrzymujemy adres RVA tej procedury. Adres RVA jest następnie porównywany z adresami RVA w tabeli zarejestrowanych procedur obsługi wyjątków. Jeśli zostanie tam odnaleziony, to procedura zostanie wywołana. W przeciwnym razie procedura zostanie odrzucona. Stosując przepełnienia buforów na stosie w systemie Windows 2003 Server i nadpi- sując wskaźnik procedury obsługi wyjątków, mamy do wyboru następujące mo liwości: 1. Wykorzystać istniejącą procedurę obsługi wyjątku w taki sposób, by przekazała sterowanie do naszego bufora. 2. Znaleźć blok kodu spoza zakresu adresów danego modułu, który przeka e sterowanie do naszego bufora. 3. Znaleźć blok kodu nale ący do zakresu adresów danego modułu, który nie posiada katalogu Load Configuration Directory. Przyjrzymy się im na przykładzie wykorzystania przepełnienia bufora przez funkcję DCOM o nazwie +4GOQVG#EVKXCVKQP. Wykorzystanie istniejącej procedury obsługi wyjątków Adres Z(# wskazuje zarejestrowaną procedurę obsługi wyjątków w 06..... Jeśli przeanalizujemy działanie tej procedury, to dojdziemy do wniosku, e mo na ją wykorzystać do wykonania własnego kodu. Wskaźnik naszej struktury ':%'26+10A 4')+564#6+10 znajduje się pod adresem '$2 %J. (#( OQX GDZFYQTF RVT =GDR %J? (# OQX GUKFYQTF RVT =GDZ %J? (# OQX GFKFYQTF RVT =GDZ ? (# NGC GEZ=GUK GUK
  • 17. ? (# OQX GCZFYQTF RVT =GFK GEZ
  • 18. ? (#( ECNN GCZ Wskaźnik naszej struktury ':%'26+10A4')+564#6+10 został umieszczony w rejestrze '$:. Następnie wartość typu FYQTF znajdująca się Z% bajtów za adresem umieszczonym w rejestrze '$: zostaje załadowana do rejestru '5+. Poniewa wcześniej przepełniliśmy
  • 19. 156 Część II ♦ Włamania na platformach Windows, Solaris i Tru64 strukturę ':%'26+10A4')+564#6+10, to posiadamy kontrolę nad tą wartością, a w konse- kwencji nad zawartością rejestru '5+. W podobny sposób kontrolowana przez nas wartość typu dword o przesunięciu 0x08 względem adresu znajdującego się w rejestrze '$: zostaje umieszczona w rejestrze '+. Następnie do rejestru '%: zostaje załadowany adres efektywny '5+ '5+
  • 21. ). Poniewa kontrolujemy zawartość reje- stru '5+, to równie mo emy zagwarantować odpowiednią wartość tego adresu. Kolejny rozkaz umieszcza w rejestrze '#: wartość FYQTF znajdującą się pod adresem stanowiącym sumę zawartości kontrolowanego przez nas rejestru '+ oraz '%:
  • 22. . Następnie wywołana zostaje procedura znajdująca się pod adresem umieszczonym w rejestrze '#:. Podczas pierwszego włamania do modułu UXEJQUV poło enie bloku TEB oraz poło enie stosu są łatwe do określenia. Sytuacja mo e się zmienić w przypadku mocno obcią o- nego serwera. Zakładając, e jest stabilna, mo emy odnaleźć wskaźnik naszej struktury ':%'26+10A4')+564#6+10 pod adresem 6'$ (Z(($) i u yć go jako wskaźnika naszego kodu. Jednak tu przed wywołaniem procedury obsługi wyjątków wskaźnik ten zostanie zaktualizowany, wobec czego nie mo emy zastosować takiej metody. Struktura ':%'26+10A4')+564#6+10 wskazywana przez 6'$ posiada pod adresem Z%(( wskaźnik do naszej struktury ':%'26+10A4')+564#6+10, a poniewa poło enie stosu jest zawsze znane podczas pierwszego ataku, mo emy wykorzystać ten wskaźnik. Inny wskaźnik naszej struktury ':%'26+10A4')+564#6+10 znajduje się równie pod adresem Z%('. Jeśli chcemy u yć tego adresu, musimy zapisać wartość Z (która zostanie następnie załadowana do rejestru '5+) Z% bajtów za naszą strukturą ':%'26+10A4')+564#6+10 oraz wartość Z$(( Z bajtów za tą strukturą (wartość ta zostanie następnie załadowana do rejestru '+). Po odpowiednim wymno e- niu i dodaniu otrzymamy właśnie adres Z%('. Do rejestru '#: zostanie następnie załadowany wskaźnik znajdujący się pod tym adresem i wywołana odpowiednia proce- dura. Wywołanie to spowoduje, e trafimy do naszej struktury ':%'26+10A4')+564#6+10 w miejscu, w którym znajduje się wskaźnik następnej takiej struktury. Jeśli umieści- my tam kod, który wykona skok o 14 bajtów, to przeskoczymy kod, który był nam wcześniej potrzebny, by sterowanie dotarło w obecne miejsce. Rozwiązanie to przetestowaliśmy na czterech maszynach działających pod kontrolą systemu Windows 2003 Server, z których trzy działały z wersją Enterprise Edition, a czwarta ze Standard Edition. Wszystkie próby zakończyły się sukcesem. Musimy jed- nak zawsze mieć pewność, e włamanie tą metodą przeprowadzane jest po raz pierw- szy. W przeciwnym razie jest wielce prawdopodobne, e zakończy się ono niepowo- dzeniem. Na marginesie warto równie zauwa yć, e opisana mo liwość wykorzystania procedury obsługi wyjątków wynika prawdopodobnie z tego, e jest ona przewidziana do współpracy z wektoryzowanym mechanizmem obsługi wyjątków, a nie u ywającym ramek na stosie. Do włamań mo emy wykorzystać równie inne moduły, które u ywają tej samej proce- dury obsługi wyjątków. Inne procedury obsługi wyjątków zarejestrowane w tej samej przestrzeni adresowej zwykle przekazują obsługę do funkcji AAGZEGRVAJCPFNGT eks- portowanej przez bibliotekę OUXETVFNN lub jej odpowiednik.
  • 23. Rozdział 8. ♦ Przepełnienia w systemie Windows 157 Wykorzystanie bloku kodu o adresie, który nie należy do żadnego modułu Podobnie jak w innych wersjach systemu Windows pod adresem '52 mo emy odnaleźć wskaźnik do naszej struktury ':%'26+10A4')+564#6+10. Jeśli potrafimy od- naleźć blok rozkazów RQR TGI RQR TGI TGV pod adresem, który nie jest związany z adnym z załadowanych modułów, to mo emy przejąć sterowanie. Ka dy proces działający w systemie Windows 2003 Server zawiera pod adresem Z((%#% taki blok rozkazów. Poniewa adres ten nie jest związany z adnym modułem, zostanie uznany za bezpieczny, a znajdujący się pod nim kod wyko- nany jako procedura obsługi wyjątków. Istnieje jednak pewien problem. Na innej ma- szynie działającej pod kontrolą systemu Windows 2003 Server Standard Edition ten sam blok rozkazów znajduje się w pobli u podanego adresu, ale nie jest to ten sam adres. Skoro nie mo emy zagwarantować poło enia bloku rozkazów RQR, RQR, TGV, to nie jest to właściwe rozwiązanie. Zamiast tego bloku mo emy poszukać rozkazu: ECNN FYQTF RVT=GUR ? albo: LOR FYQTF RVT=GUR ? w przestrzeni adresowej atakowanego procesu. Chocia aden z tych rozkazów nie ist- nieje pod odpowiednim adresem, to jednak wiele wskaźników naszej struktury ':%'2 6+10A4')+564#6+10 znajduje się w otoczeniu wskazywanym przez rejestry '52 i '$2. Wskaźnik naszej struktury mo emy znaleźć pod jednym z następujących adresów: GUR GUR GUR % GUR % GUR GUR GDR % GDR GDR GDR GDR% GDR Ka dego z nich mo emy u yć dla rozkazu LOR lub ECNN. Jeśli sprawdzimy przestrzeń adresową UXEJQUV, to pod adresem Z$$$ znajdziemy rozkaz: ECNN FYQTF RVT=GDR Z? Pod adresem '$2 znajduje się wskaźnik naszej struktury ':%'26+10A4')+564#6+10. Adres ten nie jest związany z adnym modułem, i co więcej, wydaje się, e prawie ka dy proces działający w systemie Windows 2003 Server (jak równie wiele pro- cesów w systemie Windows XP) ma te same bajty właśnie pod tym adresem. Proce- sy, które są wyjątkiem od tej reguły, posiadają natomiast te bajty pod adresem Z%$$.
  • 24. 158 Część II ♦ Włamania na platformach Windows, Solaris i Tru64 Jeśli nadpiszemy wskaźnik procedury obsługi wyjątków adresem Z$$$, to po- wrócimy do naszego bufora i uzyskamy mo liwość wykonania dowolnego kodu. Adres Z$$$ sprawdziliśmy na wszystkich czterech maszynach z systemem Windows 2003 Server i we wszystkich przypadkach zawierał on właściwe bajty reprezentujące rozkaz ECNN FYQTF RVT=GDR Z?. Wydaje się więc, e opisana metoda powinna być stosunkowo niezawodna na platformie Windows 2003 Server. Wykorzystanie bloku kodu należącego do modułu, który nie posiada katalogu Load Configuration Directory Plik wykonywalny UXEJQUVGZG nie posiada katalogu Load Configuration Directory. Kod z przestrzeni adresowej tego procesu zostałby zaakceptowany jako procedura ob- sługi wyjątku, gdyby nie wyjątek wskaźnika 07.. występujący podczas wykonania funkcji -K7UGT'ZEGRVKQPKURCVEJGT . Funkcja 4VN+OCIG0V*GCFGT zwraca bowiem wartość 0 ja- ko wskaźnik nagłówka PE dla UXEJQUV. Funkcja -K7UGT'ZEGRVKQPKURCVEJGT nie sprawdza, czy wykorzystywany przez nią wskaźnik jest ró ny od 07... ECNN 4VN+OCIG0V*GCFGT VGUV D[VG RVT=GCZ (J? LP Z(# Na skutek wystąpienia wyjątku działanie procesu zostaje zakończone. Dlatego te nie uda nam się wykorzystać adnego kodu nale ącego do UXEJQUVFNN. Plik EQORTGUFNN równie nie posiada katalogu Load Configuration Directory. Jednak poniewa pole charakterystyki DLL znajdujące się w nagłówku PE ma wartość Z, to test wyko- nywany po wywołaniu funkcji 4VN+OCIG0V*GCFGT zakończy się niepowodzeniem i ste- rowanie zostanie przekazane pod adres Z(# z dala od naszego kodu. Jeśli przejrzymy wszystkie moduły załadowane w przestrzeni adresowej procesu, to oka e się, e aden z nich nie spełnia naszych wymagań. Większość posiada katalog Load Configuration Directory i zarejestrowane procedury obsługi wyjątków. Natomiast po- zostałe moduły, które nie mają tego katalogu, nie są odpowiednie z tego samego po- wodu co EQORTGUUFNN. W tym przypadku metoda ta nie jest więc przydatna. Poniewa w większości przypadków mo emy spowodować wyjątek, próbując wyko- nać operację zapisu za końcem stosu, to przepełniając bufor, mo emy u yć takiego sposobu jako ogólnej metody obejścia ochrony stosu w systemie Windows 2003 Se- rver. Nale y jednak pamiętać, e metoda ta jest skuteczna w chwili obecnej. Nie ma wątpliwości, e kolejne wersje systemu lub nawet pakiety serwisowe usuną ten słaby punkt i sprawią, e metoda przestanie być skuteczna. Wtedy pozostanie nam odkurzyć program uruchomieniowy i asembler i zabrać się za projektowanie nowej metody. Firmie Microsoft mo emy natomiast polecić wykonywanie wyłącznie zarejestrowa- nych procedur obsługi wyjątków i doło enie starań, by nie mogły one zostać u yte przez hakerów w taki sposób, jaki przedstawiliśmy w tym podrozdziale. Końcowe uwagi na temat nadpisań procedur obsługi wyjątków Gdy słaby punkt występuje w wielu systemach operacyjnych — tak jak ma to miejsce w przypadku przepełnienia bufora DCOM +4GOQVG#EVKXCVKQP odkrytego przez polską grupę badawczą The Last Stage of Delirium — to najlepszym sposobem poprawy
  • 25. Rozdział 8. ♦ Przepełnienia w systemie Windows 159 przenośności eksploitu jest zaatakowanie procedur obsługi wyjątków. Przesunięcie początku bufora względem poło enia struktury ':%'26+10A4')+564#6+10 mo e bowiem być ró ne dla poszczególnych systemów. I tak w przypadku wspomnianego słabego punktu DCOM struktura ta znajduje się 1412 bajtów od początku bufora w systemie Windows 2003 Server, 1472 bajty w systemie Windows XP i 1540 bajtów w systemie Windows 2000. Mimo tych ró nic mo liwe jest napisanie pojedynczego eksploitu dla wszystkich tych systemów. Wystarczy jedynie umieścić w odpowiednich miejscach pseudoprocedury obsługi wyjątków. Ochrona stosu i Windows 2003 Server System Windows 2003 Server posiada wbudowaną ochronę stosu. Zastosowanie tego samego mechanizmu umo liwia Microsoft Visual C++ .NET. Opcja kompilatora )5 (która jest domyślnie włączona) sprawia, e podczas generowania kodu na stosie umieszczane są znaczniki bezpieczeństwa, których zadaniem jest ochrona adresu powrotu przed nadpisaniem. Znaczniki te stanowią odpowiednik rozwiązania zastosowanego przez Crispina Cowana w kompilatorze StackGuard. Po wywołaniu procedury na sto- sie umieszczane są 4 bajty (FYQTF), które są sprawdzane, zanim procedura zwróci sterowanie. W ten sposób chroniony jest adres powrotu oraz zawartość rejestru '$2 za- pisana na stosie. Logika działania tego mechanizmu jest prosta: jeśli lokalny bufor został przepełniony i spowodował nadpisanie adresu powrotu, to po drodze musiał równie nad- pisać znacznik bezpieczeństwa. W ten sposób proces mo e rozpoznać sytuację, w której nastąpiło przepełnienie bufora i podjąć działania zapobiegające wykonaniu niewłaściwego kodu. Zwykle działania te sprowadzają się do zakończenie pracy procesu. Chocia mo e wydawać się, e rozwiązanie takie zapewnia skuteczną ochronę przed atakami wykorzystującymi przepełnienie, to jednak na przykładzie wykorzystania procedur obsługi wyjątków pokazaliśmy ju , e tak nie jest. Ochrona za pomocą znaczników bezpieczeństwa utrudnia takie włamania, ale nie eliminuje ich. Przyjrzyjmy się bli ej sposobowi działania mechanizmu ochrony stosu i spróbujmy znaleźć jeszcze inne metody jego obejścia. Znaczniki bezpieczeństwa generowane są w wystarczająco losowy sposób, aby próbować odgadnąć ich wartość. Przedstawiony poni ej kod w języku C naśladuje mechanizm generowania znaczników w momencie uruchamiania procesu. KPENWFG UVFKQJ KPENWFG YKPFQYUJ KPV OCKP ] (+.'6+/' HV WPUKIPGF KPV %QQMKG WPUKIPGF KPV VOR WPUKIPGF KPV
  • 26. RVT .#4)'A+06')'4 RGTHEQWPV )GV5[UVGO6KOG#U(KNG6KOG HV %QQMKG HVFY*KIJCVG6KOG @ HVFY.QYCVG6KOG %QQMKG %QQMKG @ )GV%WTTGPV2TQEGUU+F
  • 27. 160 Część II ♦ Włamania na platformach Windows, Solaris i Tru64 %QQMKG %QQMKG @ )GV%WTTGPV6JTGCF+F %QQMKG %QQMKG @ )GV6KEM%QWPV 3WGT[2GTHQTOCPEG%QWPVGT RGTHEQWPV RVT WPUKIPGF KPV RGTHEQWPV VOR
  • 28. RVT @
  • 29. RVT %QQMKG %QQMKG @ VOR RTKPVH %QQMKG :P %QQMKG TGVWTP _ Najpierw wywołana zostaje funkcja )GV5[UVGO6KOG#U(KNG6KOG. Wypełnia ona dwa elementy struktury (+.'6+/' — FY*KIJCVG6KOG i FY.QYCVG6KOG. Te dwie wartości są następnie poddawane operacji ró nicy symetrycznej. Otrzymany wynik poddawany jest tej samej operacji, której drugim argumentem są kolejno: identyfikator procesu, identyfikator wątku oraz liczba milisekund, które upłynęły od momentu startu systemu (wartość tę zwraca funkcja )GV6KEM%QWPV ). Na końcu wywoływana jest funkcja 3WGT[ 2GTHQTOCPEG%QWPVGT, której parametrem jest wskaźnik wartości 64-bitowej. Wartość ta jest następnie dzielona na dwie wartości 32-bitowe, na których wykonywana jest operacja :14. Uzyskany wynik jest jeszcze raz poddawany operacji :14 ze znacznikiem bezpieczeństwa. Uzyskana wartość znacznika bezpieczeństwa umieszczana jest w pliku w sekcji FCVC. Zastosowanie opcji )5 powoduje równie zmianę układu zmiennych lokalnych podczas generowania kodu przez kompilator. Porządek zmiennych lokalnych pozostaje w zgodzie z kolejnością ich definicji w programie w języku C, ale wszystkie tablice zostają przesu- nięte na koniec listy zmiennych lokalnych i w efekcie znajdą się w pobli u adresu powrotu na stosie. W ten sposób zapobiega się nadpisaniu zmiennych lokalnych na skutek prze- pełnienia. Zadaniem tego rozwiązania jest przede wszystkim ochrona zmiennych lo- gicznych decydujących o przepływie sterowania oraz wskaźników funkcji. Aby zilustrować pierwszą z wymienionych korzyści, wyobraźmy sobie program, któ- ry uwierzytelnia u ytkowników, a procedura uwierzytelniania podatna jest na atak na skutek przepełnienia. Jeśli uwierzytelni ona u ytkownika, to nadaje zmiennej typu dword wartość 1, a w przeciwnym razie 0. Jeśli zmienna taka znajdowałaby się za bu- forem, to haker mógłby go przepełnić i nadać w ten sposób zmiennej wartość 1, mimo e nie uwierzytelnił się za pomocą nazwy i odpowiedniego hasła. Gdy funkcja chroniona za pomocą znaczników bezpieczeństwa zwraca sterowanie, to sprawdza, czy znacznik bezpieczeństwa jest taki sam jak w momencie jej wywołania. Kopia znacznika zapamiętywana jest w sekcji FCVC pliku zawierającego daną funkcję. I to jest pierwszy powa ny problem takiego rozwiązania — wyjaśnimy to za chwilę. Jeśli wartość znacznika bezpieczeństwa się nie zgadza, to wywołana zostaje procedu- ra bezpieczeństwa (jeśli została zdefiniowana). Wskaźnik tej procedury przechowy- wany jest równie w sekcji FCVC. Jeśli wskaźnik ten jest ró ny od 07.., to zostaje zała- dowany do rejestru '#: i wykonywany jest rozkaz ECNN GCZ. Stanowi on drugą słabość tego rozwiązania. Jeśli nie została zdefiniowana procedura bezpieczeństwa, to wy- woływana jest funkcja 7PJCPFNGF'ZEGRVKQP(KNVGT. Funkcja ta nie powoduje zakoń- czenia procesu, lecz wykonuje szereg operacji i wywołuje wiele ró nych funkcji.
  • 30. Rozdział 8. ♦ Przepełnienia w systemie Windows 161 Czytelnikowi zalecamy przeanalizowanie działania funkcji 7PJCPFNGF'ZEGRVKQP(KNVGT za pomocą IDA Pro. W skrócie działanie tej funkcji polega na załadowaniu biblioteki HCWNVTGRFNN, a następnie wykonaniu funkcji 4GRQTV(CWNV eksportowanej przez tę bi- bliotekę. Funkcja ta odpowiedzialna jest między innymi za wyświetlenie okna dialo- gowego, które umo liwia poinformowanie firmy Microsoft o zaistniałym błędzie. Funkcja 4GRQTV(CWNV wykorzystuje potoki 2%**CPI4GR'ZGE2KRG i 2%*(CWNV4GR'ZGE2KRG. Zajmijmy się teraz wspomnianymi problemami omawianego rozwiązania. Najlepiej będzie zilustrować je przykładowym kodem. KPENWFG UVFKQJ KPENWFG YKPFQYUJ *#0.' JR07.. KPV 4GVWTP*QUV(TQO7TN EJCT
  • 31.
  • 32. EJCT
  • 33. KPV OCKP ] EJCT
  • 34. RVT 07.. JR *GCR%TGCVG ZZ 4GVWTP*QUV(TQO7TN RVT JVVRYYYPIUUQHVYCTGEQOKPFGZJVON RTKPVH *QUV KU U RVT *GCR(TGG JRRVT TGVWTP _ KPV 4GVWTP*QUV(TQO7TN EJCT
  • 35.
  • 37. WTN ] KPV EQWPV EJCT
  • 38. R 07.. EJCT DWHHGT=? YUMC PKM RQEæVMW CFTGUW 74. R UVTUVT WTN JVVR KH R TGVWTP R R RTGVYCTC NQMCNPæ MQRKú UVTER[ DWHHGTR 79#)# Y[UWMWLG RKGTYU[ WMQ PKM YJKNG DWHHGT=EQWPV? EQWPV K CUVúRWLG IQ DCLVGO GTQY[O DWHHGT=EQWPV? 6GTC Y DWHQTG PCLFWLG UKú PCYC JQUVC 6YQT[O[ LGL MQRKú PC UVGTEKG R EJCT
  • 39. *GCR#NNQE JRUVTNGP DWHHGT KH R TGVWTP UVTER[ RDWHHGT
  • 40. DWH R 79#)# TGVWTP _
  • 41. 162 Część II ♦ Włamania na platformach Windows, Solaris i Tru64 Program ten wyodrębnia nazwę hosta z adresu URL. Funkcja 4GVWTP*QUV(TQO7TN nara ona jest na przepełnienie bufora na stosie w miejscu oznaczonym komentarzem 79#)# . Pozostawmy na chwilę omówienie tego problemu i przyjrzyjmy się prototy- powi tej funkcji. Posiada ona dwa parametry — pierwszy jest wskaźnikiem wskaźni- ka EJCT
  • 42.
  • 43. , a drugi wskaźnikiem adresu URL. Komentarzem 79#)# opatrzyliśmy instrukcję, która pierwszemu parametrowi nadaje wartość wskazującą nazwę hosta umieszczoną na stercie. Przyjrzyjmy się reprezentacji tej instrukcji na poziomie roz- kazów asemblera. $% OQX GEZFYQTF RVT =GDR ? $( OQX GFZFYQTF RVT =GDR? % OQX FYQTF RVT =GEZ?GFZ Pierwszy z rozkazów umieszcza adres wskaźnika przekazanego jako parametr w reje- strze '%:. Następnie do rejestru ': zostaje załadowany wskaźnik nazwy hosta znaj- dującej się na stercie. Ostatni z rozkazów umieszcza ten wskaźnik pod adresem wska- zywanym przez rejestr '%:. I tutaj pojawia się jeden ze wspomnianych problemów. Jeśli przepełnimy bufor na stosie, nadpiszemy znacznik bezpieczeństwa oraz adres powrotu, to kolejnymi nadpisywanymi wartościami będą parametry funkcji. Ilustruje to rysunek 8.3. Rysunek 8.3. Stos przed i po przepełnieniu bufora Na skutek przepełnienia bufora haker mo e więc uzyskać kontrolę nad parametrami przekazanymi funkcji. Z tego powodu wykonanie rozkazów znajdujących się w pamięci począwszy od adresu Z$% (nale ących do rozwinięcia instrukcji
  • 44. DWH R), mo e zostać u yte do nadpisania dowolnej wartości w pamięci bądź mo e spowodować naruszenie ochrony pamięci. Druga z tych mo liwości wystąpi na przykład w sytuacji, gdy nadpiszemy parametr znajdujący się pod adresem '$2 wartością Z. Następnie proces spróbuje zapisać wskaźnik pod adresem reprezentowanym przez tę wartość, co spowoduje naruszenie ochrony pamięci. Jednocześnie sytuacja taka pozwoli nam wykorzystać mechanizm struktur opisujących procedury obsługi wyjątków do obejścia mechanizmu zabezpieczeń stosu. A co w przypadku, gdy nie chcemy spowo- dować wyjątku? Poniewa obecnie zastanawiamy się nad innymi sposobami obejścia zabezpieczeń stosu, to przyjrzyjmy się dokładnie pierwszej z wymienionych mo li- wości (zapisowi dowolnej wartości w pamięci). Wróćmy zatem do problemów wskazanych w procesie sprawdzania wartości znaczni- ka bezpieczeństwa. Pierwszy z nich pojawia się na skutek przechowania oryginalnej wartości znacznika w sekcji FCVC. Dla określonej wersji pliku znacznik ten znajduje
  • 45. Rozdział 8. ♦ Przepełnienia w systemie Windows 163 się zawsze w tym samym miejscu (mo e to być prawdą nawet dla ró nych wersji pli- ku). Jeśli adres wskaźnika nazwy naszego hosta na stosie jest zawsze taki sam, mo- emy nadpisać nim oryginalną wartość znacznika znajdującą się w sekcji FCVC, a na- stępnie wartość znacznika umieszczoną na stosie. W ten sposób obie wartości będą takie same w momencie ich kontroli. Po pomyślnym wyniku kontroli znaczników przejmiemy kontrolę nad działaniem programu i przeka emy sterowanie do wybrane- go przez nas adresu — tak jak w klasycznym przepełnieniu bufora na stosie. Jednak metoda ta nie jest wcale najlepszym rozwiązaniem w naszym przypadku. Kod eksploitu mo emy umieścić w buforze i nadpisać adres pewnej funkcji adresem tego bufora. Gdy funkcja ta zostanie wywołana, to zostanie wykonany nasz kod znajdujący się w buforze. Jednak kontrola znaczników bezpieczeństwa da wynik negatywny. I w ten sposób dochodzimy do drugiego ze wspomnianych problemów. Przypomnijmy jednak, e gdy kontrola znaczników bezpieczeństwa nie powiedzie się i zdefiniowana została procedura bezpieczeństwa, to procedura ta zostanie wywołana. Stanowi to dla nas do- skonałą okazję, poniewa mo emy nadpisać wskaźnik procedury bezpieczeństwa (który umieszczony jest w sekcji FCVC) wskaźnikiem naszego bufora. W ten sposób przejmiemy sterowanie w momencie, gdy kontrola znaczników da wynik negatywny. Przyjrzyjmy się zatem innemu sposobowi. Przypomnijmy, e jeśli kontrola znaczników wypadnie negatywnie i nie jest zdefiniowana adna procedura bezpieczeństwa, to wywołana zostanie funkcja 7PJCPFNGF'ZEGRVKQP(KNVGT (przy zało eniu, e równie wskaźnik właściwej procedury obsługi wyjątków posiada wartość 07..). Funkcja ta wykonuje tak wiele kodu, e stanowi dla hakera doskonałe pole do popisu. Na przykład funkcja ta wywołuje funkcję )GV5[UVGOKTGEVQT[9, a następnie z uzyskanego katalogu systemowego ładuje bibliotekę HCWNVTGRFNN. W przypadku przepełnienia posługującego się kodem Unicode moglibyśmy nadpisać wskaźnik katalogu systemowego przecho- wywany w sekcji FCVC modułu MGTPGNFNN za pomocą wskaźnika naszego własnego katalogu i w rezultacie spowodować załadowanie własnej wersji biblioteki HCWNVTGRFNN zamiast wersji systemowej. Wystarczy, e wersja ta będzie eksportować funkcję 4G RQTV(CWNV, która zostanie automatycznie wywołana. Kolejną interesującą mo liwość (na razie tylko teoretyczną, poniewa nie mieliśmy jeszcze czasu jej sprawdzić) stanowi koncepcja wtórnego, zagnie d onego przepełnienia. Większość funkcji wywoływanych przez 7PJCPFNGF'ZEGRVKQP(KNVGT nie jest chroniona znacznikami. Załó my na przykład, e funkcja )GV5[UVGOKTGEVQT[9 jest nara ona na przepełnienie, poniewa zakłada, e długość łańcucha katalogowego nie przekracza nigdy 260 bajtów i pochodzi on zawsze z zaufanego źródła. Jeśli nadpiszemy wskaźnik ka- talogu systemowego wskaźnikiem naszego bufora, to mo emy spowodować kolejne przepełnienie i w momencie powrotu funkcji uzyskać sterowanie. W praktyce okazuje się, e funkcja )GV5[UVGOKTGEVQT[9 jest odporna na tego rodzaju atak. Jednak taki słaby punkt mo e kryć się w innych fragmentach kodu wykonywanego przez 7PJCP FNGF'ZEGRVKQP(KNVGT. Pozostaje tylko go odnaleźć. W naturalny sposób nasuwa się pytanie, czy scenariusz, w którym uzyskujemy mo - liwość modyfikacji dowolnego miejsca w pamięci, zanim dokonana zostanie kontrola znaczników, mo e zdarzyć się w praktyce. Odpowiedź na to pytanie jest pozytyw- na, a sytuacja taka występuje dość często. Przykładem mo e być słaby punkt DCOM wykryty przez grupę The Last Stage of Delirium. W tym przypadku parametr jednej
  • 46. 164 Część II ♦ Włamania na platformach Windows, Solaris i Tru64 z funkcji posiada typ YEJCT