July 2015
How to add new arch in miasm
mslc university
miasm
✤ Фреймворк для reverse engineering написаный на Python
✤ Реализованы ассемблер, дизассемблер, транслятор в
промежуточное представление, символьное выполнение
и симулятор c JIT
✤ Умеет упрощать выражения (деобфускация)
✤ Умеет генерировать запросы к STP
✤ Жутко медленный :(
Текущие задачи RE. Почему не IDA?
✤ Анализ новых архитектур со всем существующим набором
инструментов и методов
✤ Нужна деобфускация
✤ Нужно анализировать связку библиотек в одном адресном
пространстве
✤ Нужно анализировать разные версии одной библиотеки (bindiff)
✤ Нужно декомпилировать в С (большие проекты)
✤ Нужно проверять какие значения могут быть у переменных
✤ Data mining
Что такое дизассемблер?
✤ декодирование бинарных данных в
соответсвующие имеющие смыслы поля (опкоды,
аргументы и т.п.)
✤ визуальное представление этих полей
Что такое ассемблер?
✤ синтаксический анализ текста
✤ выделение из нее идентификаторов
✤ кодирование их в двоичную форму
Что такое симулятор?
✤ хранение контекста выполнения (регистры,
память)
✤ обновление контекста (выполнение команды)
✤ while True:

inst = get_instruction(PC)

execute_instruction(inst, context)
Что такое символическая запись?
✤ Запись в виде математической формулы
✤ add R1, R2

mul R1, 4

add R1, 0x100
✤ R1: ((R1_init+R2_init)*4)+0x100
Шаблон архитектуры
commit d8b79aeb6e92de3df0abd03d6de30cc439952dfe
Author: snk <snk@ctf.su>
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 ++++++++++++++++++
Самый минимум
✤ Добавить запись об архитектуре в

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
✤ Зарегистрировать транслятор в IR

miasm2/arch/hc16/sem.py
✤ Тесты!
Первые команды
✤ 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])
Первые команды
DEMO
Аргументы инструкции
✤ 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)
Аргументы инструкции
✤ 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)
Аргументы инструкции
DEMO
Символьное выполнение
✤ @sbuild.parse

def add(Rdest, Rsrc):

Rdest = Rdest + Rsrc
✤ Все :)
Символьное выполнение
✤ def bc(target):

next = ExprId(ir.get_next_instr(instr))

PC = target if C else next

IRDst = PC



def 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, []

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

Miasm defcon russia 23

  • 1.
    July 2015 How toadd new arch in miasm mslc university
  • 2.
    miasm ✤ Фреймворк дляreverse engineering написаный на Python ✤ Реализованы ассемблер, дизассемблер, транслятор в промежуточное представление, символьное выполнение и симулятор c JIT ✤ Умеет упрощать выражения (деобфускация) ✤ Умеет генерировать запросы к STP ✤ Жутко медленный :(
  • 3.
    Текущие задачи RE.Почему не IDA? ✤ Анализ новых архитектур со всем существующим набором инструментов и методов ✤ Нужна деобфускация ✤ Нужно анализировать связку библиотек в одном адресном пространстве ✤ Нужно анализировать разные версии одной библиотеки (bindiff) ✤ Нужно декомпилировать в С (большие проекты) ✤ Нужно проверять какие значения могут быть у переменных ✤ Data mining
  • 4.
    Что такое дизассемблер? ✤декодирование бинарных данных в соответсвующие имеющие смыслы поля (опкоды, аргументы и т.п.) ✤ визуальное представление этих полей
  • 5.
    Что такое ассемблер? ✤синтаксический анализ текста ✤ выделение из нее идентификаторов ✤ кодирование их в двоичную форму
  • 6.
    Что такое симулятор? ✤хранение контекста выполнения (регистры, память) ✤ обновление контекста (выполнение команды) ✤ while True:
 inst = get_instruction(PC)
 execute_instruction(inst, context)
  • 7.
    Что такое символическаязапись? ✤ Запись в виде математической формулы ✤ add R1, R2
 mul R1, 4
 add R1, 0x100 ✤ R1: ((R1_init+R2_init)*4)+0x100
  • 8.
    Шаблон архитектуры commit d8b79aeb6e92de3df0abd03d6de30cc439952dfe Author:snk <snk@ctf.su> 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 ++++++++++++++++++
  • 9.
    Самый минимум ✤ Добавитьзапись об архитектуре в
 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 ✤ Зарегистрировать транслятор в IR
 miasm2/arch/hc16/sem.py ✤ Тесты!
  • 10.
    Первые команды ✤ defhc16_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])
  • 11.
  • 12.
    Аргументы инструкции ✤ classm32r_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)
  • 13.
    Аргументы инструкции ✤ 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)
  • 14.
  • 15.
    Символьное выполнение ✤ @sbuild.parse
 defadd(Rdest, Rsrc):
 Rdest = Rdest + Rsrc ✤ Все :)
  • 16.
    Символьное выполнение ✤ defbc(target):
 next = ExprId(ir.get_next_instr(instr))
 PC = target if C else next
 IRDst = PC
 
 def 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, []

  • 17.