miasm
Reverse engineering framework
|
Public Member Functions | |
def | __init__ (self, ir_arch, state=None, sb_expr_simp=expr_simp_explicit) |
def | get_state (self) |
def | set_state (self, state) |
def | eval_expr_visitor (self, expr, cache=None) |
def | eval_exprint (self, expr, **kwargs) |
def | eval_exprid (self, expr, **kwargs) |
def | eval_exprloc (self, expr, **kwargs) |
def | eval_exprmem (self, expr, **kwargs) |
def | eval_exprcond (self, expr, **kwargs) |
def | eval_exprslice (self, expr, **kwargs) |
def | eval_exprop (self, expr, **kwargs) |
def | eval_exprcompose (self, expr, **kwargs) |
def | eval_expr (self, expr, eval_cache=None) |
def | modified (self, init_state=None, ids=True, mems=True) |
def | dump (self, ids=True, mems=True) |
def | eval_assignblk (self, assignblk) |
def | apply_change (self, dst, src) |
def | eval_updt_assignblk (self, assignblk) |
def | eval_updt_irblock (self, irb, step=False) |
def | run_block_at (self, ircfg, addr, step=False) |
def | run_at (self, ircfg, addr, lbl_stop=None, step=False) |
def | del_mem_above_stack (self, stack_ptr) |
def | eval_updt_expr (self, expr) |
def | mem_read (self, expr) |
def | mem_write (self, dst, src) |
Public Attributes | |
expr_to_visitor | |
symbols | |
ir_arch | |
expr_simp | |
Static Public Attributes | |
StateEngine = SymbolicState | |
Properties | |
state = property(get_state, set_state) | |
Symbolic execution engine Allow IR code emulation in symbolic domain Examples: from miasm.ir.symbexec import SymbolicExecutionEngine from miasm.ir.ir import AssignBlock ir_arch = ir_x86_32() init_state = { ir_arch.arch.regs.EAX: ir_arch.arch.regs.EBX, ExprMem(id_x+ExprInt(0x10, 32), 32): id_a, } sb_exec = SymbolicExecutionEngine(ir_arch, init_state) >>> sb_exec.dump() EAX = a @32[x + 0x10] = a >>> sb_exec.dump(mems=False) EAX = a >>> print sb_exec.eval_expr(ir_arch.arch.regs.EAX + ir_arch.arch.regs.ECX) EBX + ECX Inspecting state: - dump - modified State manipulation: - '.state' (rw) Evaluation (read only): - eval_expr - eval_assignblk Evaluation with state update: - eval_updt_expr - eval_updt_assignblk - eval_updt_irblock Start a symbolic execution based on provisioned '.ir_arch' blocks: - run_block_at - run_at
def miasm.ir.symbexec.SymbolicExecutionEngine.__init__ | ( | self, | |
ir_arch, | |||
state = None , |
|||
sb_expr_simp = expr_simp_explicit |
|||
) |
Reimplemented in ctype_propagation.TypePropagationEngine, and miasm.analysis.cst_propag.SymbExecState.
def miasm.ir.symbexec.SymbolicExecutionEngine.apply_change | ( | self, | |
dst, | |||
src | |||
) |
Apply @dst = @src on the current state WITHOUT evaluating both side @dst: Expr, destination @src: Expr, source
Reimplemented in miasm.ir.symbexec_types.SymbExecCType, miasm.ir.symbexec_top.SymbExecTopNoMem, and miasm.analysis.dse.ESETrackModif.
def miasm.ir.symbexec.SymbolicExecutionEngine.del_mem_above_stack | ( | self, | |
stack_ptr | |||
) |
Remove all stored memory values with following properties: * pointer based on initial stack value * pointer below current stack pointer
Reimplemented in miasm.ir.symbexec_types.SymbExecCType.
def miasm.ir.symbexec.SymbolicExecutionEngine.dump | ( | self, | |
ids = True , |
|||
mems = True |
|||
) |
Display modififed variables @ids: display modified ids @mems: display modified memory
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_assignblk | ( | self, | |
assignblk | |||
) |
Evaluate AssignBlock using the current state Returns a dictionary containing modified keys associated to their values @assignblk: AssignBlock instance
Reimplemented in miasm.ir.symbexec_types.SymbExecCType.
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_expr | ( | self, | |
expr, | |||
eval_cache = None |
|||
) |
Evaluate @expr @expr: Expression instance to evaluate @cache: None or dictionary linking variables to their values
Reimplemented in miasm.ir.symbexec_types.SymbExecCType, and miasm.ir.symbexec_top.SymbExecTopNoMem.
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_expr_visitor | ( | self, | |
expr, | |||
cache = None |
|||
) |
[DEV]: Override to change the behavior of an Expr evaluation. This function recursively applies 'eval_expr*' to @expr. This function uses @cache to speedup re-evaluation of expression.
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_exprcompose | ( | self, | |
expr, | |||
** | kwargs | ||
) |
[DEV]: Evaluate an ExprCompose using the current state
Reimplemented in miasm.ir.symbexec_top.SymbExecTopNoMem.
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_exprcond | ( | self, | |
expr, | |||
** | kwargs | ||
) |
[DEV]: Evaluate an ExprCond using the current state
Reimplemented in miasm.ir.symbexec_top.SymbExecTopNoMem.
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_exprid | ( | self, | |
expr, | |||
** | kwargs | ||
) |
[DEV]: Evaluate an ExprId using the current state
Reimplemented in miasm.ir.symbexec_top.SymbExecTopNoMem.
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_exprint | ( | self, | |
expr, | |||
** | kwargs | ||
) |
[DEV]: Evaluate an ExprInt using the current state
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_exprloc | ( | self, | |
expr, | |||
** | kwargs | ||
) |
[DEV]: Evaluate an ExprLoc using the current state
Reimplemented in miasm.ir.symbexec_top.SymbExecTopNoMem.
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_exprmem | ( | self, | |
expr, | |||
** | kwargs | ||
) |
[DEV]: Evaluate an ExprMem using the current state This function first evaluate the memory pointer value. Override 'mem_read' to modify the effective memory accesses
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_exprop | ( | self, | |
expr, | |||
** | kwargs | ||
) |
[DEV]: Evaluate an ExprOp using the current state
Reimplemented in miasm.ir.symbexec_top.SymbExecTopNoMem.
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_exprslice | ( | self, | |
expr, | |||
** | kwargs | ||
) |
[DEV]: Evaluate an ExprSlice using the current state
Reimplemented in miasm.ir.symbexec_top.SymbExecTopNoMem.
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_updt_assignblk | ( | self, | |
assignblk | |||
) |
Apply an AssignBlock on the current state @assignblk: AssignBlock instance
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_updt_expr | ( | self, | |
expr | |||
) |
Evaluate @expr and apply side effect if needed (ie. if expr is an assignment). Return the evaluated value
def miasm.ir.symbexec.SymbolicExecutionEngine.eval_updt_irblock | ( | self, | |
irb, | |||
step = False |
|||
) |
Symbolic execution of the @irb on the current state @irb: irbloc instance @step: display intermediate steps
Reimplemented in miasm.analysis.cst_propag.SymbExecStateFix, and ctype_propagation.SymbExecCTypeFix.
def miasm.ir.symbexec.SymbolicExecutionEngine.get_state | ( | self | ) |
Return the current state of the SymbolicEngine
Reimplemented in miasm.ir.symbexec_types.SymbExecCType, and miasm.ir.symbexec_top.SymbExecTopNoMem.
def miasm.ir.symbexec.SymbolicExecutionEngine.mem_read | ( | self, | |
expr | |||
) |
[DEV]: Override to modify the effective memory reads Read symbolic value at ExprMem @expr @expr: ExprMem
Reimplemented in miasm.jitter.emulatedsymbexec.EmulatedSymbExec, miasm.analysis.dse.ESETrackModif, and trace.ESETrackMemory.
def miasm.ir.symbexec.SymbolicExecutionEngine.mem_write | ( | self, | |
dst, | |||
src | |||
) |
[DEV]: Override to modify the effective memory writes Write symbolic value @src at ExprMem @dst @dst: destination ExprMem @src: source Expression
Reimplemented in miasm.analysis.dse.ESENoVMSideEffects, miasm.analysis.dse.ESETrackModif, miasm.jitter.emulatedsymbexec.EmulatedSymbExec, and trace.ESETrackMemory.
def miasm.ir.symbexec.SymbolicExecutionEngine.modified | ( | self, | |
init_state = None , |
|||
ids = True , |
|||
mems = True |
|||
) |
Return the modified variables. @init_state: a base dictionary linking variables to their initial values to diff. Can be None. @ids: track ids only @mems: track mems only
def miasm.ir.symbexec.SymbolicExecutionEngine.run_at | ( | self, | |
ircfg, | |||
addr, | |||
lbl_stop = None , |
|||
step = False |
|||
) |
Symbolic execution starting at @addr @addr: address to execute (int or ExprInt or label) @lbl_stop: LocKey to stop execution on @step: display intermediate steps
def miasm.ir.symbexec.SymbolicExecutionEngine.run_block_at | ( | self, | |
ircfg, | |||
addr, | |||
step = False |
|||
) |
Symbolic execution of the block at @addr @addr: address to execute (int or ExprInt or label) @step: display intermediate steps
def miasm.ir.symbexec.SymbolicExecutionEngine.set_state | ( | self, | |
state | |||
) |
Restaure the @state of the engine @state: StateEngine instance
miasm.ir.symbexec.SymbolicExecutionEngine.expr_simp |
miasm.ir.symbexec.SymbolicExecutionEngine.expr_to_visitor |
miasm.ir.symbexec.SymbolicExecutionEngine.ir_arch |
|
static |
miasm.ir.symbexec.SymbolicExecutionEngine.symbols |