miasm defcon russia 23
TRANSCRIPT
July 2015
How to add new arch in miasmmslc 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 <[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 ++++++++++++++++++
Самый минимум
✤ Добавить запись об архитектуре в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
✤ Тесты!
Первые команды
✤ 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 = 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, []
Символьное выполнение
DEMO