[RElog] Shellcode Formatter

Witam Was w nowej serii artykułów poświęconych moim zabawom z Reverse Engineeringiem[1]. Słowo „zabawa” nie pojawiło się bez przypadku, ponieważ to nie jest seria poradników, a raczej luźne pokazanie artykułów, które jakoś się wiążą z RE.

Głównie to będą jakieś ciekawostki, wnioski, ewentualnie proste programy/skrypty.

 

Shellcode Formatter


Z racji, że ostatnio robiłem całkiem sporo zadań polegających głównie na wstrzyknięcie jakiegoś shellcode’u[2] do programu, to intensywnie korzystałem ze strony [shell-storm.org], na której można znaleźć gotowy shellcode. Jest on zazwyczaj w postaci tablicy char’a, podzielonej na wiele linii w celu zwiększenia czytelności.

O ile ta forma kodu jest akceptowalna przy normalnym skryptowaniu w Pythonie, tak w przypadku uruchamianiu programu z linii poleceń, to bez zapisania skryptu na dysku jest już niewygodna, dlatego postanowiłem napisać skrypt, który z czegoś takiego:

Z kolei pożądany efekt wygląda następująco:

Jasne, niby można wszystko robić ręcznie, ale po co? Skoro mogę cały proces w bardzo prosty sposób zautomatyzować pisząc skrypt w nie więcej niż 30min, a potencjalnie oszczędzający go bardzo wiele, to to robię. Jakby nie było jestem programistą 😉

Aby było jeszcze ciekawiej (i wygodniej) postanowiłem, że kod będzie pobierał wejście ze schowka systemowego oraz po wykonaniu prostej konwersji zapisywał w nim wyjście. Sam kod prezentuje się następująco:

Jak widać został napisany przy użyciu Python’a 2 oraz do poprawnego działania potrzebuje zainstalowanego modułu [pyperclip] który umożliwia zarządzanie schowkiem.

W pierwszej ‚fazie’ działania program kopiuje ‚surowe’ wejście do stringa o nazwie raw, następnie korzystając z prostego wyrażenia regularnego[3] (ale wystarczającego do tego zadania) przeszukuje string w poszukiwaniu wystąpienia shellcode’u, tzn wyrażeń w których pomiędzy znakami ” „ posiadających dowolną ilość znaków składających się wyłącznie ze znaków: \, x, cyfr oraz liter {a..f, A..F}.

Dość łatwo można znaleźć przykładowy tekst składający się z tych znaków, lecz nie będący shellcode’m, jednakże ten skrypt będzie używany w ściśle określonych sytuacjach więc jest wystarczający (np. można dodać warunek, mówiący że początek musi zaczynać się od ‚\x’, może w przyszłych iteracjach skryptu udoskonalę to wyrażenie).

W przypadku gdy wzorzec nie zostanie odnaleziony, to skrypt kończy swoje działanie, dzięki czemu schowek pozostanie w stanie nienaruszonym.

Ostatnim etapem jest przekopiowanie całej listy do pojedynczego string’a oraz usunięcie znaków „” (przy wklejaniu wyniku do schowka string zostaje umieszczony w cudzysłowach).

Najbardziej aktualną wersję skryptu można znaleźć w repo [py-tools-public] na moim Githubie (jeżeli chcecie to możecie podsyłać pull requesty).

 

Materiały dodatkowe


  1. Reverse Engineering – definicja inżynierii wstecznej.
  2. Shellcode
  3. Wyrażenia regularne, tzw regex’y

 

Code ON!


  • Adam Pajkert

    Czyżbyś jednak postanowił wziąć udział w konkursie o którym wspominałem? ^^ Dokładnie coś takiego miałem na myśli, taką formę 😀 I nazwa chwytliwa 😉 No nic, lecę czytać 😛 Pozdrawiam Adam.

    • Nie, a to głównie z powodu, że 2 wpisy tego typu w ciągu tygodnia to trochę za dużo. Chociaż faktycznie po części miałeś wpływ na powstanie tej serii.
      Pozdrawiam