miasm defcon russia 23

17
July 2015 How to add new arch in miasm mslc university

Upload: defconrussia

Post on 06-Aug-2015

184 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Miasm defcon russia 23

July 2015

How to add new arch in miasmmslc university

Page 2: Miasm defcon russia 23

miasm

✤ Фреймворк для reverse engineering написаный на Python

✤ Реализованы ассемблер, дизассемблер, транслятор в промежуточное представление, символьное выполнение и симулятор c JIT

✤ Умеет упрощать выражения (деобфускация)

✤ Умеет генерировать запросы к STP

✤ Жутко медленный :(

Page 3: Miasm defcon russia 23

Текущие задачи RE. Почему не IDA?

✤ Анализ новых архитектур со всем существующим набором инструментов и методов

✤ Нужна деобфускация

✤ Нужно анализировать связку библиотек в одном адресном пространстве

✤ Нужно анализировать разные версии одной библиотеки (bindiff)

✤ Нужно декомпилировать в С (большие проекты)

✤ Нужно проверять какие значения могут быть у переменных

✤ Data mining

Page 4: Miasm defcon russia 23

Что такое дизассемблер?

✤ декодирование бинарных данных в соответсвующие имеющие смыслы поля (опкоды, аргументы и т.п.)

✤ визуальное представление этих полей

Page 5: Miasm defcon russia 23

Что такое ассемблер?

✤ синтаксический анализ текста

✤ выделение из нее идентификаторов

✤ кодирование их в двоичную форму

Page 6: Miasm defcon russia 23

Что такое симулятор?

✤ хранение контекста выполнения (регистры, память)

✤ обновление контекста (выполнение команды)

✤ while True: inst = get_instruction(PC) execute_instruction(inst, context)

Page 7: Miasm defcon russia 23

Что такое символическая запись?

✤ Запись в виде математической формулы

✤ add R1, R2 mul R1, 4 add R1, 0x100

✤ R1: ((R1_init+R2_init)*4)+0x100

Page 8: Miasm defcon russia 23

Шаблон архитектуры

commit d8b79aeb6e92de3df0abd03d6de30cc439952dfe Author: snk <[email protected]>

miasm2/analysis/machine.py | 10 +++-

miasm2/arch/hc16/__init__.py | 4 ++ miasm2/arch/hc16/arch.py | 131 ++++++++++++++++++++++++++ miasm2/arch/hc16/disasm.py | 10 ++++ miasm2/arch/hc16/regs.py | 32 +++++++++++ miasm2/arch/hc16/sem.py | 36 ++++++++++++

test/arch/hc16/arch.py | 41 ++++++++++++++ test/arch/hc16/sem.py | 54 ++++++++++++++++++

Page 9: Miasm defcon russia 23

Самый минимум

✤ Добавить запись об архитектуре вmiasm2/analysis/machine.py

✤ Определить регистры вmiasm2/arch/hc16/regs.py

✤ в miasm2/arch/hc16/arch.py class instruction_hc16(cpu.instruction) class mn_hc16(cpu.cls_mn)

✤ Зарегистрировать дизасемблер (прослойка к дефолтному)miasm2/arch/hc16/disasm.py

✤ Зарегистрировать транслятор в IRmiasm2/arch/hc16/sem.py

✤ Тесты!

Page 10: Miasm defcon russia 23

Первые команды

✤ def hc16_op(name, fields, args=None, alias=False): dct = {"fields": fields, "alias":alias} if args != None: dct['args'] = args type(name, (mn_hc16,), dct)

✤ hc16_op("nop", [bs(‘0010011101001100')])

✤ hc16_op("ldab", [bs(‘01110101’), imm8])

Page 11: Miasm defcon russia 23

Первые команды

DEMO

Page 12: Miasm defcon russia 23

Аргументы инструкции

✤ class m32r_reg(cpu.reg_noarg, cpu.m_arg): reg_info = gpregs parser = reg_info.parser

✤ class m32r_imm(cpu.imm_noarg): parser = cpu.base_expr def fromstring(self, s, parser_result=None) def decode(self, v) def encode(self)

Page 13: Miasm defcon russia 23

Аргументы инструкции

✤ arg_R = cpu.bs(l=4, cls=(m32r_gpreg,))

✤ arg_dR = cpu.bs(l=4, cls=(m32r_deref_reg,))

✤ arg_pcdisp8 = cpu.bs(l=8, cls=(m32r_pcdisp8,), fname="pcdisp", order=-1)

✤ arg_imm8 = cpu.bs(l=8, cls=(m32r_imm8,), fname="imm", order=-1)

Page 14: Miasm defcon russia 23

Аргументы инструкции

DEMO

Page 15: Miasm defcon russia 23

Символьное выполнение

✤ @sbuild.parse def add(Rdest, Rsrc): Rdest = Rdest + Rsrc

✤ Все :)

Page 16: Miasm defcon russia 23

Символьное выполнение

✤ def bc(target): next = ExprId(ir.get_next_instr(instr)) PC = target if C else next IRDst = PCdef ld(ir, instr, Rdest, Rsrc): instr_ir = [] Rmem = instr.get_mem_expr(Rsrc).arg instr_ir.append(ExprAff(Rdest, ExprMem(Rmem))) if instr.is_post_inc(): instr_ir.append(ExprAff(Rmem, ExprOp('+', Rmem, ExprInt(int32(4))))) return instr_ir, []

Page 17: Miasm defcon russia 23

Символьное выполнение

DEMO