s2e符号执行的切换-1

当符号化结束之后,在正常的二进制翻译执行的过程中,交替的进行具体执行和符号执行。
如果检测到有符号化的值,便使用klee进行符号执行。具体过程可描述如下:

executeTranslationBlock函数完成符号执行还是具体执行的判断。
符号执行可能的情况:
1、    state->m_startSymbexAtPC 被设置;这个主要是内存访问时被设置。
2、    state->m_toRunSymbolically.find(std::make_pair(state->getPc(), state->getPid()))被设置,里面有符号执行的内容。这个主要是在中断的处理后。
3、    (smask || (tb->helper_accesses_mem & 4)) && ((smask & tb->reg_rmask) || (smask & tb->reg_wmask)                          || (tb->helper_accesses_mem & 4)) 。这里主要是判断寄存器,也有内存访问,

上述三种情况分别在何时被设置?


第一种情况,其中一种方式是当翻译块在执行的时候,通过__ldb_mmu_symb来进行内存加载的时候,会调用s2e_read_ram_concrete_check来检查内存是否是符号化的,如果是,则在readRamConcreteCheck中调用s2e_longjmp跳转到executeTranslationBlockConcrete中的s2e_setjmp(env->jmp_env),紧接着将env->jmp_env被替换为之前保存的s2e_cpuExitJmpBuf,并抛出CpuExitException异常,这是的异常又会被s2e_qemu_tb_exec中的catch所捕获,然后执行updatestates,再s2e_longjmp到cpu_x86_exec中的大循环中的s2e_setjmp。接着s2e将刚才的tb进行了clean,循环时会重新翻译并执行这个tb,而此时的m_startSymbexAtPC已经被设置成刚才的tb的地址,从而下次翻译执行时会进行符号执行。

简单的函数图可表示为:
Qemu翻译执行tb,
cpu_exec   ---    __ldb_mmu_symb  -- s2e_read_ram_concrete_check(有符号内存被访问) -----   
readRamConcreteCheck  ---  s2e_longjmp  ---  executeTranslationBlockConcrete --- s2e_setjmp(env->jmp_env) ---   CpuExitException  ---  s2e_qemu_tb_exec  ---  s2e_longjmp  ---  
cpu_exec(s2e_setjmp(env->jmp_env))

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值