摘要 | 第5-6页 |
ABSTRACT | 第6-7页 |
第一章 绪论 | 第11-15页 |
1.1 研究工作的背景与意义 | 第11-12页 |
1.2 国内外研究现状 | 第12-14页 |
1.3 论文的主要工作 | 第14页 |
1.4 本论文的结构安排 | 第14-15页 |
第二章 符号执行相关技术 | 第15-26页 |
2.1 传统符号执行概述 | 第15-18页 |
2.2 动态符号执行概述 | 第18-21页 |
2.2.1 Concolic测试 | 第18-19页 |
2.2.2 执行生成测试 | 第19-20页 |
2.2.3 两种执行方式的对比 | 第20页 |
2.2.4 动态符号执行中存在的问题以及对应的解决办法 | 第20-21页 |
2.3 约束求解技术概述 | 第21-22页 |
2.4 程序插桩技术概述 | 第22-24页 |
2.5 LLVM概述 | 第24-25页 |
2.6 本章小结 | 第25-26页 |
第三章 系统原型框架 | 第26-37页 |
3.1 系统原型框架 | 第26-27页 |
3.2 插桩模块框架 | 第27-36页 |
3.2.1 LLVM中间码 | 第27-31页 |
3.2.1.1 标识符 | 第28页 |
3.2.1.2 模块 | 第28-29页 |
3.2.1.3 函数与基本块 | 第29页 |
3.2.1.4 指令 | 第29-31页 |
3.2.2 程序分析与插桩 | 第31-35页 |
3.2.3 符号执行引擎结构设计 | 第35-36页 |
3.3 本章小结 | 第36-37页 |
第四章 程序插桩策略与实现 | 第37-63页 |
4.1 插桩策略 | 第37-42页 |
4.1.1 插桩函数接口 | 第37-38页 |
4.1.2 程序插桩流程 | 第38-42页 |
4.1.2.1 运算语句 | 第38-39页 |
4.1.2.2 赋值语句 | 第39-40页 |
4.1.2.3 条件语句 | 第40-41页 |
4.1.2.4 函数调用 | 第41-42页 |
4.2 插桩核心模块的实现 | 第42-50页 |
4.2.1 符号表达式的表示 | 第42-48页 |
4.2.2 插桩实现 | 第48-50页 |
4.3 对各指令的插桩实现 | 第50-57页 |
4.3.1 调用指令 | 第50-52页 |
4.3.2 内存分配指令 | 第52页 |
4.3.3 加载指令 | 第52-53页 |
4.3.4 保存指令 | 第53-54页 |
4.3.5 二元运算指令 | 第54页 |
4.3.6 比较指令 | 第54-55页 |
4.3.7 分支指令 | 第55-56页 |
4.3.8 类型转换指令 | 第56页 |
4.3.9 返回指令 | 第56-57页 |
4.4 桩函数的实现 | 第57-61页 |
4.4.1 Load桩函数 | 第57-58页 |
4.4.2 Store桩函数 | 第58-59页 |
4.4.3 Calculate桩函数 | 第59-60页 |
4.4.4 Compare桩函数 | 第60页 |
4.4.5 Branch桩函数 | 第60-61页 |
4.4.6 MkSymbol桩函数 | 第61页 |
4.5 本章小结 | 第61-63页 |
第五章 实验结果与分析 | 第63-71页 |
5.1 实验环境 | 第63页 |
5.2 实验结果展示与分析 | 第63-70页 |
5.3 本章小结 | 第70-71页 |
第六章 总结与展望 | 第71-73页 |
6.1 全文总结 | 第71-72页 |
6.2 后续工作展望 | 第72-73页 |
致谢 | 第73-74页 |
参考文献 | 第74-77页 |
攻读硕士学位期间取得的成果 | 第77-78页 |