Самый простой способ выполнить md5sum во время выполнения в секции .text статической библиотеки. - PullRequest
0 голосов
/ 14 февраля 2019

Brainhive,

Я ищу способ удостовериться, что мой код не был изменен, первоначальная мысль состояла в том, чтобы найти начальный адрес секции .text и ее размер, запустите md5sum (или другой хэш) и сравните с константой.

Мой код скомпилирован в статическую библиотеку, и я не хочу хэшировать весь двоичный файл, только мою библиотеку.

Как мне?Поможет ли это добавить скрипт ld с зарезервированными метками?

Система - arm64, и я использую GNU arm compiler (реализация linaro).

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я ищу способ удостовериться, что мой код не был изменен, сначала я хотел найти начальный адрес секции .text и его размер, запустить md5sum (или другой хеш) исравните с константой.

Существует несколько причин, по которым ваш запрос может быть ошибочным:

  1. Любой, кто захочет изменить ваш скомпилированный код, также будет готовизменить контрольную сумму, с которой вы собираетесь сравнивать во время выполнения.То есть вы, кажется, хотите сделать что-то вроде:

    /* 0xabcd1234 is the precomputed checksum over the library. */ if (checksum_over_my_code() != 0xabcd1234) abort();

    Злоумышленник может легко заменить весь этот код последовательностью инструкций NOP и перейти к использованию измененного вами кода.библиотека.

  2. Ваша статическая библиотека (обычно) не заканчивается как последовательность байтов в конечном двоичном файле.Если в вашей библиотеке есть foo.o и bar.o, и конечный пользователь связывает вашу библиотеку со своим собственным кодом в main.o и baz.o, то раздел .text получающегося исполняемого файла вполне может состоять из.text с main.o, затем .text с foo.o, затем .text с baz.o и, наконец, .text с bar.o.

  3. Когдаокончательный исполняемый файл связан, обновлены инструкции в вашей библиотеке ( перемещен ).То есть предположим, что в вашем исходном коде есть инструкция CALL foo.Фактические байты в вашем разделе .text будут выглядеть примерно так: 0xE9 0x00 0x00 0x00 0x00 (с записью о перемещении, в которой говорится, что байты, следующие за 0xE9, должны быть обновлены , причем конечный адрес foo в конечном итоге будет).

    После того, как соединение выполнено и предполагается, что foo заканчивается по адресу 0x08010203, байты в .text исполняемого файла больше не будут равны 0 с.Вместо этого они будут 0xE9 0x03 0x02 0x01 0x08 (на самом деле они не будут такими по несущественным причинам, но они, конечно, не будут равны нулю).

    Итак, вычисление контрольной суммы по фактическому .text разделу вашегоархив библиотеки совершенно бессмысленно .

0 голосов
/ 14 февраля 2019

Существуют инструменты, которые позволяют вывести раздел ELF. elfcat делает это очень просто, (elfcat --section-name=test the_file.o), но это также должно быть выполнимо с objdump.После того, как вы удалили раздел, проблема сводится к размеру и хэшированию файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...