
Комментарии 10
Идея - оч хорошая. статья/карма/закладки +++. Но над изложением нужно капитально работать: продраться сквозь полотно текста, выловить идеи и структурировать читаемое - невозможно.
PS
https://habr.com/ru/companies/habr/articles/736940/
https://habr.com/ru/articles/843366/ и там в начале ссылка на 10 статей на Хабре "как писать статьи" :)
до godbolt
Минутка нудноты: инструмент называется Compiler explorer, а Godbolt это просто фамилия автора (Мэтт Годболт).
Если подобная машина защищена правильно, то это не сработает.
Или у вас ещё есть ключ для подписи вашего кода, это нужно учесть.
Серьёзные серверы эту защиту будут иметь и ключ для подписи будет не на сервере.
Архитектура таргета предполагается amd64, а если это не так?
Серверы на arm64 вполне себе вещь, а в эмбеде будет полный зоопарк архитектур.
Как упражнение это отличный пример, но не будет ли проще кросс компилировать C для целевой архитектуры и прокинуть результат через уже имеющийся доступ к консоли?
Оставим за скобками syscallls которые нам будут нужны чтобы сделать чтото значимое и их разницу между версиями ядра.
Как прикладной материал для хакинга выглядит отлично.
Как практическая вещь для реального применения - врядли.
Без обид.
С частью возраженгий согласен, отвечу на те, где есть возможность что-то сделать:
Архитектура таргета может быть любой, суть идеи от этого не меняется, просто ассемблировать придется в другие команды, и немного по другим правилам. Врядли потребуется делать что-то кросплатформенное таким способом.
Но даже если да - есть возможность сделать таргет-специфичные "функциональные блоки", которые выполняют базовые операции и комбинировать уже их. А регистры обозначить псевдонимами и разрешать псевдонимы в зависимости от архитектуры. Но это утяжеляет концепт, хотя я могу представить упоротого программиста, который может сделать что-то подобное просто чтобы не использовать компилятор, если он боиться supply chain attack. С syscallls можно поступить так же, define есть.
Такие же мысли возникли, как у комментатора выше.
Проще всё скомпилить (кросс-компилить) на устройстве с утилитами, а результат передать хоть hex-дампом, хоть base64.
В ситуации, когда вы один-на-один с терминалом, и другого устройства нет, вы не сможете почитать мануалы по формату ELF-файла, опкодам архитектуры, сисколлам и т.п. То есть, проект разваливается.
Напомнило, году в ~1994 вводил с факса шестнадцатеричный дамп используя DOS debug ... Передали поездом пачку дискет с инсталлятором, один файл на дискете не прочитался
Эта задача уже решена, см. stage0-posix и mescc-tools. Та же идея поднятия чего-то из ничего, правда совсем другая мотивация.
Повеяло ностальгией.
В 1995 году я стал счастливым обладателем офигенного «пентиума»-90 :). Хард аж на 850 мегабайт, заполненный разным софтом и игрушками. И — без флоповода. Что есть, с тем и живи.
Понравился Descent — уже не помню, оригинальный или второй, не важно. Показал другу, тут же родилась идея поиграть по сети. Но... Модем у меня был какой-то продвинутый, висел на COM4, а игрушка знала только первые два.
Надо пробросить порт. Как — понятно: примитивный резидент, тупо ретранслирующий всё в обе стороны. Ассемблера нет, си нет, ничего нет. Книжка по х86 есть. Чешем репу.
C:\> copy con modem.com
Дальше начались пляски с бубном. Почти любую задачу можно решить разными способами. У нас было дополнительное ограничение: машинный код надо было ввести напрямую с клавиатуры, как есть, даже операция преобразования hex в бинарник недоступна (ну или мы не знали, что так можно). Поэтому — никаких управляющих символов в строке.
Ассемблировали на бумажке. Полчаса примерно бились над «оптимизацией» алгоритма под разрешённые байты, справились. Воспоминания от этого эпизода ярче, чем от самой игры.
Обойдемся без ассемблера