LINUX.ORG.RU

Вставка своего кода в Linux ELF файл (или как добавить новую секцию или расширить существующую)

 ,


1

3

Есть уже скомпилированная программа под Linux ELF формата, необходимо в неком месте сделать переход на мой ассемблерный код, выполнить его и возвратиться обратно (инжект). Проблема в том, что в файле нету неиспользуемых мест, где можно было бы перезаписать на мой код. Вопрос стоит в том, как расширить существующую секцию или создать новую чтобы выделить место под мой код? В Windows для PE файлов я делал это в пару кликов с помощью LordPE, просто выбирал «Sections -> Add», выбирал размер и параметры, и вуаля, новое место для моего кода готово. Но для ELF такого не нашел.


Ответ на: комментарий от buddhist

Это просто набор инструментов, но в них надо тоже основательно так разбираться, изучать структуру ELF. Неужели нету простой программы аналога LordPE?

Sucks ()

Перехвати какую-нибудь функцию с LD_PRELOAD. Тут давеча пример кода кидали.

ziemin ★★ ()
Ответ на: комментарий от ziemin

http://habrahabr.ru/post/199090/ нашел на хабре, действительно мощный приём, который сильно упрощает инжект. Спасибо! Но ради интереса все же еще попытаюсь как-то всунуть в сам файл, чтобы без всяких дополнительных программ.

Sucks ()
Ответ на: комментарий от kravich

Beye вообще header только просматривать может. HTE почти то что нужно, можно редактировать заголовок, но кнопочки «Добавить сегмент\секцию» там нету конечно, только редактирование существующего. Хотелось бы конечно из коробки, как LordPE :) Ну да ладно, попытаюсь кое что вручную добавить и слепить с помощью HTE.

Sucks ()

А вот и решение

Все оказалось намного проще objcopy myprog myprog_new --add-section my_sect=sectionfile

Sucks ()
Ответ на: комментарий от ziemin

Но разве это не работает только для динамических символов?

Deleted ()
Ответ на: комментарий от Deleted

Перехватить-то можно что угодно.

В смысле хоть что-то да будет линковаться

ziemin ★★ ()
Последнее исправление: ziemin (всего исправлений: 1)
Ответ на: комментарий от ziemin

Если есть готовый shared object, как перехватить функции, которых нет в таблице динамических символов?

Deleted ()
Ответ на: комментарий от Deleted

Не слишком хорошо в этом разбираюсь, но может перехватить какую-нибудь функцию, которая есть в таблице и из нее инжектнуть код куда нужно?

kravich ★★★★ ()
Ответ на: комментарий от kravich

Я тоже не разбираюсь, в этом-то и проблема.

Deleted ()
Ответ на: комментарий от Deleted

Перехватывать то, что вызывают эти функции. Не факт, что в самом начале конечно.

ziemin ★★ ()

У меня есть бумажная книга Крис Касперски - Компьютерные вирусы изнутри и снаружи. Может найдешь ее. Там есть глава про elf.

tlx ★★★★★ ()
Ответ на: комментарий от ziemin

Вплоть до libc, что ли? А если перехват нужно выполнить до исполнения функции?

Deleted ()

Upd. Все таки решение не так просто как казалось. Добавить секцию и выставить на нее флажки кода, записи, чтения, выполнения еще не решает задачи. Нужно еще как-то подгрузить ее в сегмент. Там есть оффсет и размер сегмента загрузки, но после него сразу идут другие сегменты. А вот тут уже задача, как это все совместить чтобы все не съехало и прочее. В общем, ломаю голову дальше, если получится сделать, отпишусь о результате.

Sucks ()
Ответ на: комментарий от Sucks

Вот набор небольших программ для работы с ELF, которые могут оказаться полезными:

http://www.muppetlabs.com/~breadbox/software/elfkickers.html

Я думаю для тебя наибольший интрес имеют objres и infect.

Всё с исходниками, их не очень много. Результат твоих успехов узнать интресно ;-)

arbv ()
Ответ на: комментарий от arbv

infect takes advantage of the fact that most ELF executables are laid out with a significant chunk of unused padding bytes immediately following the executable segment. infect simply extends the size of the executable segment to include enough extra bytes to hold the new code, and then changes the executable's entry point.

Прочитал об infect. В переводе это в общем значит, что после сектора, который загружается в оперативную память, есть обычно где-то до 4кб неиспользуемых данных мусора, но они не загружаются в оперативную память, а программка расширяет размер сектора загрузки, чтобы захватить вот это место, предварительно прописав себя туда. И меняет точку вхождения программы на вот это место со своей копией. Интересная штуковина в общем) Конечно не то что искал, но если 4кб мало, то в эти 4кб данных уже можно втеснить даже чтение данных с конца самого файла программы и инжект для исполнения)

Sucks ()
Ответ на: комментарий от Sucks

Ну дык - замечательно же! 4кб это до фига, особенно если делать на асме. Отпишись только об успехах или если чего интресного найдёшь. Очень интересно узнать, чем всё закончиться.

arbv ()
Ответ на: комментарий от vasily_pupkin

Оно вроде бы "ожило". Похоже, именно то, что я искал. Спасибо анону постом выше.

wakuwaku ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.