Java Mikro blog

Wykonywanie kodu z komentarzy w Javie

Ostatnio czytając specyfikację języka Java natknęło mnie do napisania posta na ten temat. Pomimo umiejętności programowania w danym języku programista może go wcale tak dobrze nie znać. Pierwszym miejscem jakie warto w ogóle odwiedzić jest dokument ze specyfikacją danego języka. Często znajdują się tam bardzo ciekawe zagadnienia o których mogliśmy wcześniej nie mieć bladego pojęcia.

Jedną z takich rzeczy jest na przykład struktura pliku z kodem źródłowym dla kompilatora Javy. To, że kompilator chętnie połknie plik zakodowany w UTF’ie nie jest dla nikogo niespodzianką, ale to że przed procesem kompilacji wykonywany jest proces przywracania znaków z zakresu unicode poddanych modyfikacji (ang. escape characters). Czyli teoretycznie w kod możemy równie dobrze wstawić znak w postaci \uXXXX gdzie X zastępuje dowolną cyfrę. Notacja ta jest przydatna, kiedy w kodzie chcemy umieścić znaki specjalne. Niestety niesie za sobą tez pewne dodatkowe możliwości. Jesteśmy bowiem w stanie poddać całość lub fragment kodu procesowi zamiany znaków na ich wyescapeowane odpowiedniki. Jest to więc sposób na najłatwiejszą obfuskację w kodzie źródłowym.
Przykład:

Powyższy kod po kompilacji, która oczywiście przebiegnie pomyślnie, wyświetli napis: Sneaky :>

I to własnie rodzi możliwość wykonania kodu z wnętrza komentarza. Ponieważ możemy przerwać ten komentarz i wykonać operację. Co wcale nie będzie takie proste do identyfikacji na pierwszy rzut oka.

Wynikiem będą kolejno cyfry 3 i 4, dzieję się tak ponieważ znak \u000a jest znakiem nowej linii, który kończy komentarz liniowy. Oczywiście komentarz blokowy tez jesteśmy w stanie w taki sam sposób złamać.

Oczywiście, jeśli ktoś jest spostrzegawczy to nie będzie miał problemu ze stwierdzeniem, że coś tu jest nie tak. Jednak często kolorowanie kodu w ogóle sobie z tym nie radzi, a w ramach ciekawostki to bardzo fajny trik.

Bonus:

Tak, to się skompiluje i nawet uruchomi 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.