如何在二进制文件中获得 readelf/IDA 和 Aho-Corasick 之间相同的偏移量
How to get the same offset between readelf/IDA and Aho-Corasick in a binary
首先,我是二进制文件的新手,希望这不是一个愚蠢的问题。
我已经用二进制文件的 .text 部分中的指令序列生成了 tables。具有 2 个指令序列的 table 看起来像这样:
sequence | total | relative
------------------------------------
e3a0b000e3a0e000 | 2437 | 0.0469
...
序列是使用 IDAPython 提取的,生成的文本文件如下所示:
9c54 SUBROUTINE
9c54 e3a0b000 MOV R11, #0
9c58 e3a0e000 MOV LR, #0
...
已更新
现在我正在使用 Aho-Corasick 算法来匹配我从中提取它们的同一二进制文件中的这些序列。我只是将 table 中的所有序列添加到 Aho 自动机:
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 returns 0x38b7 和我在 Ubuntu 中使用 ghex 再次查看二进制文件并在预期的偏移量处找到了两条指令:
offset: bytes:
00001C54 E3A0B000 E3A0E000 ...
意思是我应该在 0x1c54 - 0x1c5c 范围内找到它们,这是原始偏移量 (0x9c54 - 0x8000)
我还没有真正理解如何获得相同的偏移量,但我想使用 Aho-Corasick 获得原始偏移量。我知道 Aho-Corasick returns 关键字结尾的偏移量。
当我发现将字节转换为十六进制 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 时,它会将整数转换为浮点数。我必须记住,将浮点数转换回整数,会将值向上或向下舍入。
首先,我是二进制文件的新手,希望这不是一个愚蠢的问题。
我已经用二进制文件的 .text 部分中的指令序列生成了 tables。具有 2 个指令序列的 table 看起来像这样:
sequence | total | relative
------------------------------------
e3a0b000e3a0e000 | 2437 | 0.0469
...
序列是使用 IDAPython 提取的,生成的文本文件如下所示:
9c54 SUBROUTINE
9c54 e3a0b000 MOV R11, #0
9c58 e3a0e000 MOV LR, #0
...
已更新
现在我正在使用 Aho-Corasick 算法来匹配我从中提取它们的同一二进制文件中的这些序列。我只是将 table 中的所有序列添加到 Aho 自动机:
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 returns 0x38b7 和我在 Ubuntu 中使用 ghex 再次查看二进制文件并在预期的偏移量处找到了两条指令:
offset: bytes:
00001C54 E3A0B000 E3A0E000 ...
意思是我应该在 0x1c54 - 0x1c5c 范围内找到它们,这是原始偏移量 (0x9c54 - 0x8000)
我还没有真正理解如何获得相同的偏移量,但我想使用 Aho-Corasick 获得原始偏移量。我知道 Aho-Corasick returns 关键字结尾的偏移量。
当我发现将字节转换为十六进制 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 时,它会将整数转换为浮点数。我必须记住,将浮点数转换回整数,会将值向上或向下舍入。