Spis treści
O autorach (13)
O korektorze merytorycznym (15)
Podziękowania (17)
Wprowadzenie (19)
- Omówienie książki i technologii (20)
- Jak podzielona jest ta książka (20)
- Kto powinien przeczytać tę książkę (22)
- Potrzebne narzędzia (22)
- Co znajduje się na stronie internetowej (23)
- Powodzenia! (23)
Rozdział 1. Rzut oka na ekosystem (25)
- Korzenie Androida (25)
- Historia firmy (25)
- Historia wersji (26)
- Dostępne urządzenia (28)
- Otwarte (najczęściej) źródła (29)
- Udziałowcy Androida (31)
- Google (32)
- Producenci sprzętu (33)
- Operatorzy (35)
- Programiści (35)
- Użytkownicy (36)
- Obraz złożoności ekosystemu (38)
- Fragmentacja (38)
- Kompatybilność (40)
- Problemy związane z aktualizacją (41)
- Bezpieczeństwo kontra otwartość (43)
- Upublicznienie informacji (44)
- Podsumowanie (45)
Rozdział 2. Projekt i architektura bezpieczeństwa Androida (47)
- Architektura systemu Android (47)
- Ograniczenia i zabezpieczenia (49)
- Środowisko izolowane Androida (49)
- Uprawnienia Androida (52)
- Dokładniejsza analiza warstw (55)
- Aplikacje Androida (55)
- Android Framework (59)
- Wirtualna maszyna Dalvik (60)
- Kod natywny przestrzeni użytkownika (62)
- Jądro (67)
- Skomplikowane zabezpieczenia, skomplikowany exploit (74)
- Podsumowanie (75)
Rozdział 3. Odblokowanie urządzenia (77)
- Układ partycji (78)
- Ustalenie układu partycji (79)
- Proces uruchamiania systemu (80)
- Dostęp do trybu pobierania (81)
- Zablokowane i odblokowane programy ładujące (82)
- Oryginalne oraz zmodyfikowane obrazy ratunkowe (83)
- Uzyskiwanie pełnego dostępu z odblokowanym programem ładującym (85)
- Uzyskiwanie pełnego dostępu przy zablokowanym programie ładującym (87)
- Uzyskiwanie dostępu na uruchomionym systemie (88)
- Blokady NAND, tymczasowy root, trwały root (89)
- Utrwalanie programowego roota (91)
- Historie znanych ataków (92)
- Jądro: Wunderbar/asroot (92)
- Tryb ratunkowy: Volez (93)
- Udev: Exploid (93)
- Adbd: RageAgainstTheCage (94)
- Zygote: Zimperlich i Zysploit (94)
- Ashmem: KillingInTheNameOf i psneuter (95)
- Vold: GingerBreak (95)
- PowerVR: levitator (96)
- Libsysutils: zergRush (96)
- Jądro: mempodroid (97)
- Ataki związane z uprawnieniami plików oraz linkami symbolicznymi (97)
- Adb restore (98)
- Exynos4: exynos-abuse (99)
- Diag: lit / diaggetroot (99)
- Podsumowanie (100)
Rozdział 4. Przegląd bezpieczeństwa aplikacji (101)
- Częste błędy (101)
- Problemy z uprawnieniami aplikacji (102)
- Niezabezpieczone przesyłanie wrażliwych danych (103)
- Przechowywanie niezabezpieczonych danych (104)
- Wycieki informacji przez logi (105)
- Niezabezpieczone zakończenia IPC (106)
- Studium przypadku: Mobile Security App (108)
- Profilowanie (108)
- Analiza statyczna (110)
- Analiza dynamiczna (124)
- Atak (132)
- Studium przypadku: SIP Client (134)
- Drozer (134)
- Rozpoznanie (134)
- Snarfing (136)
- Wstrzykiwanie (138)
- Podsumowanie (140)
Rozdział 5. Płaszczyzny ataku Androida (141)
- Podstawy terminologii (141)
- Wektory ataku (142)
- Płaszczyzny ataku (143)
- Klasyfikacja płaszczyzn ataku (144)
- Właściwości płaszczyzny (144)
- Sposób klasyfikacji (145)
- Płaszczyzny ataku dostępne zdalnie (145)
- Zagadnienia sieciowe (146)
- Stosy sieciowe (150)
- Udostępnione usługi sieciowe (151)
- Technologie mobilne (152)
- Płaszczyzna ataku po stronie użytkownika (153)
- Infrastruktura Google (158)
- Sąsiedztwo fizyczne (164)
- Komunikacja bezprzewodowa (164)
- Inne technologie (170)
- Lokalne płaszczyzny ataku (170)
- Przeglądanie systemu plików (171)
- Odnajdywanie innych lokalnych płaszczyzn ataku (172)
- Fizyczne płaszczyzny ataku (176)
- Demontaż urządzenia (177)
- USB (178)
- Inne fizyczne płaszczyzny ataków (181)
- Zewnętrzne modyfikacje (182)
- Podsumowanie (182)
Rozdział 6. Wyszukiwanie słabości za pomocą fuzzingu (183)
- Pochodzenie fuzzingu (183)
- Identyfikowanie celu (185)
- Tworzenie zniekształconych danych wejściowych (185)
- Przetwarzanie danych wejściowych (186)
- Monitorowanie wyników (187)
- Fuzzing w Androidzie (187)
- Fuzzing odbiorców komunikatów (188)
- Identyfikacja celu (189)
- Generowanie danych wejściowych (190)
- Dostarczanie danych wejściowych (190)
- Monitorowanie testów (191)
- Fuzzing Chrome dla Androida (193)
- Wybór celu (193)
- Generowanie danych wejściowych (195)
- Przetwarzanie danych wejściowych (197)
- Monitorowanie testów (199)
- Fuzzing płaszczyzny ataku USB (201)
- Wyzwania fuzzingu USB (202)
- Wybór trybu (202)
- Generowanie danych wejściowych (203)
- Przetwarzanie danych wejściowych (205)
- Monitorowanie testów (206)
- Podsumowanie (207)
Rozdział 7. Wyszukiwanie błędów i analiza słabości (209)
- Zebranie wszystkich dostępnych informacji (209)
- Wybór zestawu narzędzi (211)
- Debugowanie błędnego zakończenia (212)
- Logi systemowe (212)
- Tombstone (213)
- Zdalne debugowanie (214)
- Debugowanie kodu maszyny wirtualnej Dalvik (215)
- Debugowanie przykładowej aplikacji (216)
- Wyświetlanie kodu źródłowego Android Framework (218)
- Debugowanie istniejącego kodu (220)
- Debugowanie kodu natywnego (224)
- Debugowanie z NDK (224)
- Debugowanie z Eclipse (228)
- Debugowanie z AOSP (230)
- Zwiększanie automatyzacji (235)
- Debugowanie z symbolami (237)
- Debugowanie urządzenia niewspieranego przez AOSP (243)
- Debugowanie w trybie mieszanym (244)
- Alternatywne techniki debugowania (244)
- Wyrażenia do debugowania (244)
- Debugowanie w urządzeniu (245)
- Dynamiczne modyfikowanie binariów (246)
- Analiza podatności (247)
- Ustalanie pierwotnej przyczyny (247)
- Ocena możliwości wykorzystania (260)
- Podsumowanie (261)
Rozdział 8. Wykorzystywanie oprogramowania działającego w przestrzeni użytkownika (263)
- Podstawy błędów pamięci (263)
- Przepełnianie bufora stosu (264)
- Wykorzystanie sterty (267)
- Historia publicznie znanych eksploitów (274)
- GingerBreak (275)
- zergRush (278)
- mempodroid (281)
- Wykorzystanie przeglądarki Android (282)
- Zrozumienie błędu (283)
- Kontrola sterty (285)
- Podsumowanie (288)
Rozdział 9. Return Oriented Programming (289)
- Historia i uzasadnienie (289)
- Oddzielna pamięć podręczna danych i instrukcji (290)
- Podstawy ROP w ARM (292)
- Wywoływanie podprocedur w ARM (293)
- Łączenie gadżetów w łańcuch (295)
- Identyfikacja potencjalnych gadżetów (296)
- Studium przypadku: linker Androida 4.0.1 (297)
- Modyfikacja wskaźnika stosu (298)
- Wykonanie dowolnego kodu z zaalokowanej pamięci (300)
- Podsumowanie (304)
Rozdział 10. Hakowanie i atakowanie jądra (317)
- Jądro Linuksa w Androidzie (317)
- Wyodrębnianie jądra (318)
- Wyodrębnianie z oprogramowania fabrycznego (319)
- Pobieranie z urządzenia (321)
- Pobranie jądra z obrazu startowego (323)
- Rozpakowanie jądra (323)
- Uruchamianie zmodyfikowanego kodu jądra (324)
- Pozyskanie kodu źródłowego (324)
- Przygotowanie środowiska kompilacji (327)
- Konfigurowanie jądra (328)
- Korzystanie z własnych modułów jądra (329)
- Kompilacja zmodyfikowanego jądra (332)
- Tworzenie obrazu startowego (335)
- Uruchamianie zmodyfikowanego jądra (337)
- Debugowanie jądra (342)
- Raporty błędów jądra (342)
- Zrozumienie Oops (344)
- Debugowanie na żywo z KGDB (348)
- Wykorzystanie jądra (352)
- Typowe jądra Androida (352)
- Wyodrębnianie adresów (354)
- Studia przypadku (356)
- Podsumowanie (367)
Rozdział 11. Atakowanie RIL (311)
- Wprowadzenie do RIL (312)
- Architektura RIL (312)
- Architektura smartfona (313)
- Stos telefonu w Androidzie (313)
- Dostosowanie stosu telefonu (315)
- Usługi RIL (rild) (315)
- API vendor-ril (318)
- SMS (Short Message Service) (319)
- Wysyłanie i odbieranie wiadomości SMS (319)
- Format wiadomości SMS (319)
- Komunikacja z modemem (322)
- Emulacja modemu na potrzeby fuzzingu (322)
- Fuzzing SMS w Androidzie (324)
- Podsumowanie (331)
Rozdział 12. Mechanizmy ograniczające działanie eksploitów (333)
- Klasyfikacja (334)
- Podpisywanie kodu (334)
- Utwardzanie sterty (336)
- Zabezpieczenia przed przepełnieniem zmiennej typu integer (336)
- Zapobieganie wykonaniu danych (338)
- Randomizacja przestrzeni adresowej (340)
- Zabezpieczanie stosu (342)
- Zabezpieczenia formatujących ciągów znaków (343)
- Read-Only Relocations (345)
- Izolowanie środowiska (346)
- Zabezpieczanie kodu źródłowego (346)
- Mechanizmy kontroli dostępu (348)
- Zabezpieczanie jądra (349)
- Ograniczenia wskaźników i logów (350)
- Ochrona strony zerowej (351)
- Obszary pamięci tylko do odczytu (351)
- Inne zabezpieczenia (352)
- Podsumowanie mechanizmów ograniczających działanie eksploitów (354)
- Wyłączanie ograniczeń (356)
- Zmiana tożsamości (356)
- Zamiana binariów (357)
- Modyfikowanie jądra (357)
- Pokonywanie mechanizmów ograniczających działanie eksploitów (358)
- Pokonywanie zabezpieczeń stosu (358)
- Pokonywanie ASLR (359)
- Pokonywanie zabezpieczeń zapobiegających wykonaniu danych (359)
- Pokonywanie ograniczeń jądra (359)
- Spojrzenie w przyszłość (360)
- Oficjalnie rozwijane projekty (360)
- Utwardzanie jądra przez społeczność (361)
- Odrobina spekulacji (362)
- Podsumowanie (362)
Rozdział 13. Ataki sprzętowe (363)
- Komunikacja ze sprzętem (364)
- Interfejsy szeregowe UART (364)
- Interfejsy I2C, SPI i One-Wire (368)
- JTAG (370)
- Odnajdywanie interfejsów do debugowania (381)
- Identyfikacja komponentów (392)
- Pozyskiwanie specyfikacji (392)
- Trudności przy identyfikacji komponentów (394)
- Przechwytywanie, monitorowanie i wstrzykiwanie danych (395)
- USB (395)
- Interfejsy szeregowe I2C, SPI i UART (399)
- Kradzież danych i oprogramowania (404)
- Uzyskiwanie dostępu w sposób dyskretny (405)
- Inwazyjne metody dostępu do oprogramowania (407)
- Co zrobić ze zrzutem danych? (410)
- Pułapki (414)
- Nietypowe interfejsy (414)
- Dane binarne i zamknięte protokoły (414)
- Uszkodzone interfejsy do debugowania (415)
- Hasła układu (415)
- Hasła programu ładującego, kombinacje klawiszy i ciche terminale (415)
- Zmodyfikowane sekwencje startowe (416)
- Ukryte linie adresowe (416)
- Żywica zabezpieczająca (416)
- Szyfrowanie obrazów, obfuskacja i utrudnianie debugowania (417)
- Podsumowanie (417)
Dodatek A. Narzędzia (419)
- Narzędzia programistyczne (419)
- Android SDK (419)
- Android NDK (420)
- Eclipse (420)
- Wtyczka ADT (420)
- Pakiet ADT (420)
- Android Studio (420)
- Narzędzia do pozyskiwania fabrycznego oprogramowania i modyfikowania pamięci (421)
- Binwalk (421)
- fastboot (421)
- Samsung (421)
- NVIDIA (422)
- LG (422)
- HTC (423)
- Motorola (423)
- Narzędzia natywne Androida (424)
- BusyBox (424)
- setpropex (425)
- SQLite (425)
- strace (425)
- Narzędzia do podpinania i modyfikowania (425)
- Framework ADBI (425)
- ldpreloadhook (426)
- Framework XPosed (426)
- Cydia Substrate (426)
- Narzędzia do analizy statycznej (426)
- Smali i Baksmali (427)
- Androguard (427)
- apktool (427)
- dex2jar (427)
- jad (428)
- JD-GUI (428)
- JEB (428)
- Radare2 (428)
- IDA Pro i dekompilator Hex-Rays (429)
- Narzędzia do testowania aplikacji (429)
- Framework Drozer (Mercury) (429)
- iSEC Intent Sniffer i Intent Fuzzer (429)
- Narzędzia do hakowania sprzętu (430)
- Segger J-Link (430)
- JTAGulator (430)
- OpenOCD (430)
- Saleae (430)
- Bus Pirate (430)
- GoodFET (431)
- TotalPhase Beagle USB (431)
- Facedancer21 (431)
- TotalPhase Aardvark I2C (431)
- Chip Quik (431)
- Opalarka (431)
- Xeltek SuperPro (432)
- IDA (432)
Dodatek B. Repozytoria otwartych kodów źródłowych (433)
- Google (433)
- AOSP (433)
- System kontroli kodu Gerrit (434)
- Producenci SoC (434)
- AllWinner (435)
- Intel (435)
- Marvell (435)
- MediaTek (435)
- Nvidia (436)
- Texas Instruments (436)
- Qualcomm (436)
- Samsung (437)
- Producenci urządzeń (OEM) (437)
- ASUS (438)
- HTC (438)
- LG (438)
- Motorola (439)
- Samsung (439)
- Sony Mobile (439)
- Źródła projektów zewnętrznych (440)
- Inne źródła (440)
- Zmodyfikowane oprogramowanie fabryczne (440)
- Linaro (441)
- Replicant (441)
- Indeksy kodu (441)
- Wolni strzelcy (441)
Dodatek C. Źródła (443)
Skorowidz (501)
|