Как стать автором
Обновить

Комментарии 19

Спасибо большое, в закладки!

В большинстве случаев примеры можно выполнить как на Linux, так и на Windows

А MacOS нет?)
Пока в маках столкнулся с тем что strip требует другие опции. Ну и идеология у утилиты немного другая.
objcopy позволяет добавить секцию, но эта секция не будет относиться ни к одному сегменту и не будет загружаться в ОЗУ при запуске приложения

А есть ли простые способы из загружаемого кода библиотеки добраться до этой секции? Может быть можно включить загрузку этой секции?

С маками все печально, это одна из причин по которой я пересел на линукс. В брю либо старье, либо нет, либо просто не ставится. А добраться до секции элементарно, просто парсингом самого файла.

А добраться до секции элементарно, просто парсингом самого файла.

Это если знаешь где файл находится. А библиотека может лежать где угодно, да и бинарь приложения тоже. Поэтому интересны способы загрузки по умолчанию доп секций.
А MacOS нет?)

А слона-то я и не заметил. Объективно — не было под рукой Мака, чтобы всё полностью проверить.


И как уже отметили, в Маках бывают какие-то странности в binutils.


Из простых способов — воспользоваться LIEF — ей ничего кроме Python не надо.
К сожалению, objcopy "не обладает коровьей суперсилой" и даже если указать флаги --set-section-flags .section=alloc,load, сегмент от этого не отрастёт.
Ну или писать что-то своё с использованием libelf.

Интересно, насколько сложно реализовать (хотя бы спеки) ELF для новой (старой) архитектуры? Представьте, есть 32 архитектура (заброшенная) для которой был a.out (было в binutils), был COFF (в binutils даже не было запилено) но нету ELF. То есть не удалось найти даже следов операционки с поддержкой ELF. Причем под нее даже номер архитектуры EMxxx был выделен.
Если она заброшена, что вы хотите от нее получить?)
Как что? Олдфажное техно-порно конечно. Для DEC VAX есть ELF, для Motorola 68000 есть. А этой нет.

Правильно понимаю, что ОСь есть, но elf-loader'а нет? То есть задача — написать elf-loader под эту ОСь?
По идее, не должно быть запредельно сложно — взять спеку по ELF, посмотреть "кишки" ОСи, объединить их (понимаю, что это звучит как ответ на вопрос "как нарисовать сову?").

Нету даже полной спеки на ELF для этой архитектуры. И нету ни одного примера ELF файла для нее.

Архитектура: ns32k. Есть бесплатная реализация на HDL/FPGA, вполне бодрая и рабочая, 25K LE. Так что процессоры доступны. Последняя живая ОС под нее была NetBSD 1.5x, формат exe-шника a.out. Следующая NetBSD 1.6 уже выпилила эту архитектуру. Параллельно существовала также фирменная System V R3 под NS32000, с exe-шниками COFF. Как мы знаем, ELF (как механизм ОС) появился в System V R4 (влившись туда из работ SUN над прототипом Solaris c динамически загружаемыми библиотеками DSO). Системы Systtem V R4 in wild под NS32000 обнаружить не удалось… Хотя, кто знает, может где-то в архивах и лежит ленточка…

Познакомится можно тут:
www.cpu-ns32k.net

Детский сад какой-то. Лучше бы начали с (неполного) описания ELF и соответствующих опций ld, потом механизма загрузки (включая ifunc) и затем dwarf3.


Отсылка к "библиотеке Oracle" тоже доставляет )

Вы в теме больше чем автор. Пилите статью ;)

Лучше бы для кого, конкретно для вас? Вся информация, приведенная в статье бесполезна или неправильна? Исходя из вашей логики, любой cheat-sheet или учебник бесполезен. Более того, неполных (и полных) описаний эльфов достаточно много, нужно yet another one описание? Таких же cheat-sheet, как данная статья я не видел, чем она и примечательна. Автор, свою крутость явно показать не хотел. Если есть что рассказать о глубинах эльфов со всеми возможными вариантами динамической релокации для популярных процессорных архитектур (ARM, MIPS, x86, x86, PPC) со всеми их тонкостями и best-practice, будет очень интересно почитать. Автор же привел обзор тулов, которые работают с эльфами, чтобы для тех кому встретится такая задача, мог дальше выбрать тот инструмент, который подходит для его задачи. Кстати, сказать, многие программные библиотеки крайне плохо работают с эльфами и могут пропускать секции, что-то не поддерживать, в итоге работа превращается в сплошной ад. Хардкор есть в статьях по реверс-инжинирнигу, там и железки, и РТОС, и ВПО и немного эльфов)))
Ценность статьи в систематизации знаний, а не в их уникальности.
Давайте будем грамотно критиковать и давать обратную связь.

Мне обычно неловко в ситуации, когда у оппонента есть "своё правильное мнение". Выше немного опередели с комментариями — если понимаете ЧТО действительно нужно, напишите статью.


Рад, что Вам "доставила" библиотека Oracle. А можно уточнить, что с ней не так? Можете порекомендовать хороший ресурс?

Статья называется «Рецепты для ELFов» и вполне соответствует содержимому.
Мне лично было интересно узнать несколько новых инструментов.

Что касается описания ELF — это тема тяжелая и там надо мини-книжку писать.
У меня впечатление, что ELF на порядок сложнее современного PE.
Минимальная работоспособная ручная загрузка PE (VirtualAlloс, релоки, импорты) доступна даже студенту.
А вот ELF…
Так PE это для исполняемых файлов. А эльф более универсальный формат

Небольшое добавление к статье. Возможности checksec (и даже больше) уже есть в упомянутом инструменте radare2 — https://github.com/radareorg/radare2/issues/818. Информация о файле (в том числе mitigations) выводится командой i. Или можно так i~pic,canary,nx,crypto,stripped,static,relocs

Большое спасибо!
Дополнил статью этим рецептом!

Зарегистрируйтесь на Хабре , чтобы оставить комментарий