• XSS.stack #1 – первый литературный журнал от юзеров форума

Парсинг бинарника

atavism

HalReturnToBorderline
Premium
Регистрация
03.05.2020
Сообщения
150
Реакции
85
Депозит
0.0016
Пишу тулзу для поиска ROP'ов в качестве практики сишечки.
Возник вопрос: как правильно спарсить бинарник? Не уверен, что обычный fopen что сможет открыть его правильно (ибо опкоды). Есть еще какие-либо способы это сделать адекватно?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну начнем с того, что спарсить бинарник нормально в полной мере иногда не получается даже у развитых интеллектуальных дизассемблеров, таких как IDA Pro или GHIDRA. Другое дело, что для поиска ROP гаджетов, наверное, будет достаточно найти секцию .text, найти ее границы и просто искать байтовые паттерны в ней. Определись, что тебе нужно конкретно.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Иногда кодовых секций несколько и .text может быть недостаточно.
 

Вложения

  • code.png
    code.png
    48 КБ · Просмотры: 38
Пожалуйста, обратите внимание, что пользователь заблокирован
Обычно различные ропалки делаются на базе какого-либо дизассемблера или
отладчика (IDA Pro, radare2 и т.д.), либо на базе какого-либо дизассемблерного
движка (которые также могут использоваться в дизах и отладчиках), по типу Zydis
(x64dbg), Capstone (вроде использовался в r2). С нуля писать свой диз для ропалки с поддержкой различных
архитектур будет, мягко говоря, не просто. Как вы собрались реализовывать выборку
и кодирование/декодирование опкодов из кодовых секций?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Как вы собрались реализовывать выборку
и кодирование/декодирование опкодов из кодовых секций?
Зависит от задачи. Можно идти по пути упрощения. Допустим, у тебя есть код, который ты хочешь разложить в ROP цепочку. Об этом коде тебе нужно знать только, где начинается каждая следующая инструкция. Можно для этого использовать дизассемблер длин, можно препроцессором асмовского кода вставить метки, потом эти метки считать из объектного файла или сликовать и из таблицы экспорта исполняемого файла. Получив каждую отдельную инструкцию, просто ищешь такую байтовую последовательность в исполяемых секциях всех библиотек. И тебе не нужно особо ничего дизассемблировать.
 
Пишу тулзу для поиска ROP'ов в качестве практики сишечки.
Возник вопрос: как правильно спарсить бинарник? Не уверен, что обычный fopen что сможет открыть его правильно (ибо опкоды). Есть еще какие-либо способы это сделать адекватно?
Во первых, есть
`#include <elf.h>`

Во вторых, как уже было сказанно выше, тебе нужна секция .text

Но, я бы сказал, что тебе нужна любая секция в которой установлен бит на выполнение.

Найти эти секции можно распарсив заголовочние структуры в начале бинарника (см пункт 1).

P.S. отходи от fopen в сторону open, т.к. fopen - это абстракция. Но, и опен, и фопен великолепнейшим образом справятся с задачей. Откроют файл, выдадут описатель или дескриптор, и ты можешь смело считать его в чанк а потом освободить


P.s.s есть `intel xed` написанный почти на чистом си. Офигенный продукт. Я в ядро его портировал даже.

Я б на твоем месте в качестве двигла взял имеено его. Ну а дальше по байту степишь и ищещь)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх