Shellcode: moje eksperymenty

tech • 645 słów • 4 minuty czytania

Ta notatka jest częścią serii Shellcode: moje eksperymenty. Zapoznaj się z pozostałymi wpisami.

Nigdy nie zajmowałem się szczególnie tematyką security, nie interesowało mnie pisanie czy zabawa z shellcode-ami czy exploit-ami. Za to często zdarzają mi się różne eksperymenty, które w wielu przypadkach są dobrym sposobem na poznanie nowych rzeczy. A także pomagają ugruntować swoją wiedzę i przekonania. Bo pomimo, że wiem co i jak w teorii oraz praktyce, to często nie miałem jeszcze okazji tego dotknąć i poczuć. Dotyczy to nie tylko programowania, inżynierii wstecznej czy elektroniki, ale szeroko pojętej techniki (i w zasadzie nie tylko)…

Z racji tego, że w pracy dosyć dużo czasu poświęcam na grzebanie w jakiś binarkach i zakamarkach systemu Windows. Poznając jego wnętrzności i bebechy, jak i z resztą innych aplikacji (nie tylko ze stajni MS) działających pod tym systemem. To z inżynierią wsteczną i analizą różnych kodów spotykam się prawie codziennie. Tak samo jak i z hookowaniem systemowych funkcji, czy wstrzykiwaniem czasem dziwnych rzeczy do procesów. Za to mało mi już pozostaje czystego programowania w godzinach pracy (po pracy zresztą też ;)

I tym sposobem pojawiła się pewnego dnia okazja, aby zahaczyć o tematykę związaną z shellcode-ami. Chciałem sobie sprawdzić kilka ogólnie znanych rzeczy oraz przeprowadzić przy tym kilka prostych eksperymentów. Głównie związanych z samym pisaniem takich typowych shellcode-ów i ich wstrzykiwaniem do innych procesów/plików. Przy okazji poznać potencjalne problemy występujące w czasie takich zabaw. A tudzież i spróbować nawet prostego exploit-owania, na przykład przy wykorzystaniu prostego i typowego błędu buffer overflow z małym własnym shellcode-m. Oczywiście wszystko o ile starczy czasu, sił i zainteresowania.

Fajnie byłoby, gdyby z tych eksperymentów powstała jakaś dokumentacja, więc stąd cały ten wpis, będący poniekąd wstępem (preface) i zaproszeniem do dalszej zabawy. Notatki będę oznaczał jakimś tagiem pewnie bedzie to #shellcode. Może i tytuły poprzedzę jakimś słowem kluczowym (jak to robiłem swego czasu przy zabawach nad analizatorem logicznym #SeaLog).

Obecnie lista zapisków prezentuje się następująco:

W planach i propozycjach mam poruszenie tematu:

  • Null-free
  • Kodowanie/szyfrowanie kodu
  • Hash/Cyrpto API
  • PIC (Position Independent Code)

Formalnie shellcode jest zbiorem bajtów, fragmentem kodu binarnego, które mogą być interpretowane przez procesor jako kod wykonywalny. Ich głównym celem jest eksploitacja różnych błędów i podatności w zabezpieczeniach, umożliwiając wykonanie dowolnych bajtów kodu w systemie. Co w istocie powinno prowadzić do osiągnięcia dostępu do powłoki systemu. Ja jednak w swoich zabawach mianem tym będę także okreslał dowolne fragmenty kodu binarnego (przeważnie PIC), jaki może zostać wstrzyknięty lub uruchomiony w przestrzeni adresowej i kontekście dowolnego procesu lub systemu.

Nie obędzie się też bez babrania w asemblerze, trochę tego kodu będzie, ale nie jest to jakoś bardzo konieczne. No może oprócz kilku fragmentów. Za to bardzo ułatwia to pracę nad małymi fragmentami kodu z przeznaczeniem do wstrzyknięcia. A także myślę, że pomoże mi to odświeżyć wiedzę, nie tylko z pewnych obszarów architektury sprzętu i systemu. Bo gdy bawisz się różnymi platformami niskopoziomowo to z czasem robi się mały miszmasz, jak wszystkie mnemoniki i rejestry zaczynają się mieszać w głowie. O dziwo nie dotyczyć to za bardzo x86 i 64 ;)

Przy okazji mam nadzieje, że uda mi się poprawić, zaimplementować lub chociaż zaplanować dalsze prace nad moja strzykawką (syringe). Bo jako prosty proof-of-concept od dłuższego czasu nie doczekała się wielu niezbędnych poprawek i nowych funkcjonalności, które tak często ułatwiłyby (nie)codzienne życie przy pracach i analizach.

Zdaję sobie sprawę, że cześć poruszanych zagadnień pewnie dla wprawnych graczy ze świata security lub researchingu będzie nudna, banalna lub prezentować same podstawy, zerowy poziom… itd. Nie mniej nie zajmuję się tą tematyką zawodowo, ani hobbystycznie, a raczej traktuję to jako fajną amatorską zabawę w celach eksperymentalno-edukacyjnych. I mam nadzieję, że tak też zostanie to odebrane. Aczkolwiek otwarty jestem na krytykę, uwagi i możliwe ulepszenia, czy usprawnienia w prezentowanych moich zapiskach z eksperymentowania.

[Notatka ta będzie aktualizowana na bieżąco, aby zamieszczona tutaj lista, dotycząca tej mini serii, była ciągle aktualna.]

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/