Как запустить программу с использованием angr после загрузки с бэкэндом elfcore?

Я пытаюсь написать скрипт на Python, используя библиотеку двоичного анализа angr ( http://angr.io/). Я написал код, который успешно загружает дамп ядра процесса, с которым я хочу поиграть, используя серверную часть ElfCore (http://angr.io/api-doc/cle.html) передается конструктору проекта, делая что-то вроде следующего:

ap = angr.Project("corefile", main_opts={'backend': 'elfcore'})

Мне интересно, как мне теперь "запустить" программу вперед из состояния (регистры и память), которое было определено дампом ядра? Например, когда я пытался создатьSimState используя вышеуказанный проект:

ss = angr.sim_state.SimState(project=ap)
ss.regs.rip

Я получил ответ, что рип был неинициализирован (который, безусловно, был инициализирован в дампе ядра / в момент создания дамп ядра).

Заранее благодарю за любую помощь!

1 ответ

Решение

Хорошо! Я понял это. Быть полным angr n00b®, возможно, это не лучший способ сделать это, но, поскольку никто не предлагал лучшего способа, это то, что я придумал.

Первый...

ap = angr.Project("corefile", main_opts={'backend': 'elfcore'}, rebase_granularity=0x1000)
ss = angr.factory.AngrObjectFactory(ap).blank_state()

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

Изучив источник angr (и играя на терминале Python), я обнаружил, что на данный момент в указанном выше состоянии будет отображаться память, как это определено в основном файле, но регистры еще не определены должным образом. Поэтому мне нужно было перейти к:

# Get the elfcore_object
elfcore_object = None
for o in ap.loader.all_objects:
    if type(o) == cle.backends.elf.elfcore.ELFCore:
        elfcore_object = o
        break
if elfcore_object is None:
    error

# Set the reg values from the elfcore_object to the sim state, realizing that not all
# of the registers will be supported (particularly some segment registers)
for regval in elfcore_object.initial_register_values():
    try:
        setattr(ss.regs, regval[0], regval[1])
    except Exception:
        warn

# get a simgr
simgr = ap.factory.simgr(ss)

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

for ins in ap.factory.block(simgr.active[0].addr).capstone.insns:
    print(ins)

simgr.step()

...repeat
Другие вопросы по тегам