Как получить одинаковое смещение между readelf / IDA и Aho-Corasick в двоичном файле - PullRequest
1 голос
/ 04 мая 2019

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

Я сгенерировал таблицы с последовательностями инструкций из секции .text двоичного файла. Таблица с последовательностями из двух команд выглядит так:

sequence         | total | relative
------------------------------------
e3a0b000e3a0e000 | 2437  |  0.0469
...

Последовательности были извлечены с использованием IDAPython, сгенерированные текстовые файлы выглядят так:

9c54    SUBROUTINE
9c54    e3a0b000    MOV             R11, #0
9c58    e3a0e000    MOV             LR, #0
...

ОБНОВЛЕНО

Теперь я использую алгоритм Aho-Corasick для сопоставления этих последовательностей в том же двоичном файле, из которого я их извлек. Я просто добавляю все последовательности из таблицы в автомат Ахо:

import binascii

import ahocorasick

from connect_db import DB
from get_metadata import get_meta

a = ahocorasick.Automaton()
meta = get_meta()
with DB('test.db') as db:
    for idx, key in enumerate(list(db.select_query(meta['select_queries']['select_all'].format('sequence_two')))):
        a.add_word(key[0], (idx, key[0]))

a.make_automaton()
with open('../test/test_binary', 'rb') as f:
    for sub in a.iter(f.read().hex()):
        print('file offset: %s; length: %d; sequence: %s' % (hex(sub[0]), len(sub[1][1]), sub[1][1]))

Тогда я получаю следующий вывод:

file offset: 0x38b7; length: 16; sequence: e3a0b000e3a0e000
...

Моя проблема в том, что Aho-Corasick возвращает 0x38b7, и я использовал ghex в Ubuntu, чтобы снова просмотреть двоичный файл и нашел две инструкции с ожидаемым смещением:

offset:  bytes:
00001C54 E3A0B000 E3A0E000 ...

То есть я должен найти их в диапазоне 0x1c54 - 0x1c5c, который является необработанным смещением (0x9c54 - 0x8000)

Я еще не совсем понял, как добраться до того же смещения, но я бы хотел получить необработанное смещение с помощью Aho-Corasick. Я знаю, что Aho-Corasick возвращает смещение конца ключевого слова.

1 Ответ

0 голосов
/ 06 мая 2019

Мне удалось решить проблему, когда я выяснил, что при преобразовании байтов в шестнадцатеричный ascii символы занимают больше памяти.Мне нужно было наполовину вернуть смещение от Aho-Corasick, чтобы получить реальное смещение:

ДО

with open('../test/test_binary', 'rb') as f:
for sub in a.iter(f.read().hex()):
    print('file offset: %s; length: %d; sequence: %s' % (hex(sub[0]), len(sub[1][1]), sub[1][1]))

ПОСЛЕ

with open('../test/test_binary', 'rb') as f:
for sub in a.iter(f.read().hex()):
    print('file offset: %s; length: %d; sequence: %s' % (hex(int(sub[0] / 2)), len(sub[1][1]), sub[1][1]))

Новый вывод почти такой же, как и ожидалось:

file offset: 0x1c5b; length: 16; sequence: e3a0b000e3a0e000

ПРИМЕЧАНИЕ

При делении смещения на 2 получается целое число с плавающей точкой,Я должен иметь в виду, что преобразование числа с плавающей точкой обратно в целое число округляет значение вверх или вниз.

...