Перейти к содержанию
    

Как найти точку входа в функцию MAIN в чужой прошивке (stm32f103) ?

Друзья,

пытаюсь загрузить прошивку в bin формате в дизассемблер IDA Pro. Он просит вручную указать точку входа. Микроконтроллер stm32f103.

Для тренировки написал несколько своих простеньких программок и попытался понять методику поиска точки входа в main. Не помогло.

Может есть какие-то методики поиска точки входа в main ?   

(статью про носорога видел) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, TOG сказал:

Может есть какие-то методики поиска точки входа в main ?

Открыть мануал на МК; найти в нём адрес положения таблицы векторов прерываний после сброса/вкл.питания; прочитать адрес старта ПО из вектора сброса в этой таблице.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дык идите на вектор сброса, и оттуда дойдете до main

а если сразу в main, то не иинициализируются переменные

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно ли я Вас понял,  для IDA Pro в качестве точки входа нужно указать адрес из вектора сброса ?  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

53 minutes ago, TOG said:

для IDA Pro в качестве точки входа нужно указать адрес из вектора сброса

Да. А можно отказаться, ничего особо полезного для статического анализа (разглядыванием исходников, без запуска в железе) оно не даёт.

 

А вообще настоятельно советую Ghidra. Знать ассемблер всё равно потребуется, но в сильно меньших объемах. Ну и https://github.com/leveldown-security/SVD-Loader-Ghidra до комплекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, TOG said:

пытаюсь загрузить прошивку в bin формате в дизассемблер IDA Pro.

По-подробнее о bin. Если это образ флеша процессора, начиная с физ. адреса X до физ. адреса Y - то все норм.

Если это бинарный файл, который "заливается" через загрузчик, то может быть несколько неприятностей, касаемо дизассемблирования.

(вроде загрузки в различные области памяти и шифрования). А может и не быть.

Это я к тому, что дизассемблировать шифрованый файл - смысла не имеет.

ps

Если задача учебная - создайте в IAR/Keil небольшой проект, и попрактикуйтесь на нем, посматривая что-как разложил компилятор и линкер, в map-файле, уровень выдачи инф. для него установите максимальный. + IDA.

11 hours ago, megajohn said:

дык идите на вектор сброса, и оттуда дойдете до main . . .

Если (не дай-бог) C++, есть вероятность до main() пройтись по вызовам конструкторов "всех и вся" с косвенной-табличной адресацией . 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если задача учебная - создайте в IAR/Keil небольшой проект, и попрактикуйтесь на нем, посматривая что-как разложил компилятор и линкер, в map-файле, уровень выдачи инф. для него установите максимальный. + IDA.


Всё бы было хорошо, если бы не .icf-файл линкера - какой сочинишь, такой и результат будет: вариантов расположения секций и т.п. море.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, esaulenka said:

Да. А можно отказаться, ничего особо полезного для статического анализа (разглядыванием исходников, без запуска в железе) оно не даёт.

 

А вообще настоятельно советую Ghidra. Знать ассемблер всё равно потребуется, но в сильно меньших объемах. Ну и https://github.com/leveldown-security/SVD-Loader-Ghidra до комплекта.

Спасибо за ссылку на SVD loader! Про гидру знал, а эту штуку нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 часов назад, k155la3 сказал:

Если (не дай-бог) C++, есть вероятность до main() пройтись по вызовам конструкторов "всех и вся" с косвенной-табличной адресацией . 

ну отлаживать без результата работы конструкторов тоже не правильно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 2/26/2020 at 11:20 AM, TOG said:

Друзья,

пытаюсь загрузить прошивку в bin формате в дизассемблер IDA Pro. Он просит вручную указать точку входа. Микроконтроллер stm32f103.

Для тренировки написал несколько своих простеньких программок и попытался понять методику поиска точки входа в main. Не помогло.

Может есть какие-то методики поиска точки входа в main ?   

(статью про носорога видел) 

Вы файл выложили, глядишь кто то и посмотрит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 27.02.2020 в 08:04, uriy сказал:

Спасибо за ссылку на SVD loader! Про гидру знал, а эту штуку нет

Вот тут есть пример использования - https://www.youtube.com/watch?v=q4CxE5P6RUE&t=622s

Я только не нашел как перенести "отладочную информацию" из гидры куда-нибдь в отладчик.  Благодаря "псевдокоду" удобно разбирать что происходит и можно "переименовать" интересующие функции, добавить комментарии к коду и т.д. Но не всегда получается чисто статически разобраться, иногда удобнее в отладчике посмотреть. И вот было бы здорово или подключить отладчик интерактивно (так точно умеет IDA с x86 кодом), или хотя бы экспортировать комментарии в отладчик.

Сейчас пользуюсь Ozone в качестве отладчика и во втором окне смотрю в гидре подсказки, что происходит. Код который разбираю был на С++ и много вызовов происходит очень не очевидно, без отладчика не понять куда будет переход.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/6/2020 at 11:43 PM, sst78rus said:

Вот тут есть пример использования - https://www.youtube.com/watch?v=q4CxE5P6RUE&t=622s

Я только не нашел как перенести "отладочную информацию" из гидры куда-нибдь в отладчик.  Благодаря "псевдокоду" удобно разбирать что происходит и можно "переименовать" интересующие функции, добавить комментарии к коду и т.д. Но не всегда получается чисто статически разобраться, иногда удобнее в отладчике посмотреть. И вот было бы здорово или подключить отладчик интерактивно (так точно умеет IDA с x86 кодом), или хотя бы экспортировать комментарии в отладчик.

Сейчас пользуюсь Ozone в качестве отладчика и во втором окне смотрю в гидре подсказки, что происходит. Код который разбираю был на С++ и много вызовов происходит очень не очевидно, без отладчика не понять куда будет переход.

 

Я использовал связку IDA+IAR. Еще не плохо бы знать компилятор которым компилировалось. Загружаете бинарник в IDA по базовому адресу указаному в документации. Тип процессора выставляется  как Cortex-M7. Автоматом выберется тип кодирования thumb-2. Первые 8 байт нужно преобразовать в двойные слова (long, 4 байта). Первые 4 байта это значение вершины стека, следующие 4 байта - вектор прерывания. Становитесь на вектор и по правой клавише переходите на адрес. Адрес будет не правильный, правильный на 1 меньше. То место куда перебросит IDА нужно перевести в последовательность байт. Еще раз "пригнуть" с вектора на адрес и отступить на байт. Вот тут то и нажимается заветная клавиша "с".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/7/2020 at 12:43 AM, sst78rus said:

Я только не нашел как перенести "отладочную информацию" из гидры куда-нибдь в отладчик.

Кажется, недолго ждать осталось: https://github.com/NationalSecurityAgency/ghidra/issues/24

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...