当符号化结束之后,在正常的二进制翻译执行的过程中,交替的进行具体执行和符号执行。
如果检测到有符号化的值,便使用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))
如果检测到有符号化的值,便使用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))