文件名称:read原-基于matlab的一维条形码检测
文件大小:2.93MB
文件格式:PDF
更新时间:2024-06-27 13:51:36
逆向 漏洞 挖掘 安全
北京大学博士学位论文 第四章 校验和感知的模糊测试技术 (b==4 && x==y) || (b==0 && x!=y && y==0) || (b==1 && x!=y && y==1) || (b==2 && x!=y && y==2) || (b==3 && x!=y && y==3) 符号化地址精确推理是混合符号执行的一个难题。在符号执行过程中,一旦 索引值是符号变量,那么对数组的访问就涉及到符号地址的推理。由于数组是高 级编程语言的基本数据类型,符号化地址是面向源代码的符号执行工具无法回避 的问题。在约束求解器社区和程序分析领域的推动下,数组推理有了一定发展, 很多面向源代码的符号执行工具(例如EXE[50]、Klee[49])逐渐支持符号索引。 很多约束求解器提供了数组读/写谓词,为符号执行系统收集数组约束条件提供 了方便。例如,在求解器具有数组推理能力时,上述对图4.11中变量b的取值就可 以描述为: A = write(A, x, 4) && b = read(A, y)。 这里,write原语描述向数组(A)的索引位置(x)写下指定的值(4);read原 语描述从数组(A)读取索引位置(y)的值。求解器会推理x和y之间不同关系下 变量b的不同取值。 在二进制程序层进行符号化地址精确推理尤为困难。数组推理的重要前提是 知道数组的起始地址和长度。高级语言中程序变量是对内存地址的抽象描述,为 程序分析提供了很多便利。例如,面向高级语言的程序分析可以在数组变量的声 明或创建过程中,获悉数组的起始地址和长度。然而,在二进制程序层,程序直 接对内存地址访问,已经没有高级语言中所谓的“变量”概念[27]。高级语言中,不 同的变量就代表不同的内存区域,实现了对内存区域的抽象划分;但是,二进制 程序中,整个内存空间是一个“超大”数组,变量之间没有明确的边界信息。 文献 [77]尝试在二进制层实现精确指针推理,但是只能通过劫持内存分配函 数,获取堆对象起始地址和大小,依然无法处理局部变量;BitBlaze[41]是最早在 二进制程序层实现符号地址推理的系统。其核心思想在每次符号化内存读写时, – 59 –