14、SMT验证与P-Code语义研究

SMT验证与P-Code语义研究

1. SMT验证相关内容

1.1 安全基准测试结果

在进行SMT(可满足性模理论)验证时,有一系列的安全基准测试,包括“flit”、“queue”、“set”等,使用DPTSOsyn方法,测试结果如下表所示:
| 类型 | 时间(秒) | 节点数 |
| ---- | ---- | ---- |
| ldld | 0.28 | 29 |
| ww | 0.28 | 24 |
| u+u - w | 0.29 | 33 |
| w+w - w | 0.29 | 30 |
| w+rw - w | 0.30 | 33 |
| u+u+u+u - w | 0.39 | 47 |
| 2uu+uu - w | 0.46 | 60 |
| 3uu | 0.50 | 53 |
| uu+uu | 0.50 | 39 |
| 2uu+2uu - w2 | 0.87 | 75 |
| 4uu | 2.08 | 67 |
| 2uu+2uu - w | 2.39 | 74 |
| dw | 0.35 | 70 |
| e+d | 1.46 | 145 |
| ee+dw | 1.65 | 205 |
| e+e | 3.07 | 157 |
| ee+d | 3.98 | 213 |
| e+de | 6.63 | 222 |
| ee+ddw | 8.54 | 272 |
| ee+dd | 10.99 | 269 |
| e+e+d | 18.16 | 213 |
| e2+2dw | 34.38 | 332 |
| e+e+d+d | 36.70 | 269 |
| e+e+e | 48.88 | 225 |
| ee+ddw+d | 59.62 | 328 |
| e+de+e | 60.94 | 281 |
| e+de+e+d | 227.13 | 337 |
| e3+3dw | 427.54 | 459 |
| iw | 10.78 | 287 |
| i | 11.87 | 286 |
| irw | 34.13 | 471 |
| ir | 37.42 | 469 |
| iw+rw | 64.70 | 472 |
| i+crw | 89.31 | 488 |
| i+i - w | 260.89 | 524 |
| i+i | 416.12 | 505 |
| ii+r | 1151.50 | 688 |

从这些数据中,我们可以推测不同类型的操作在时间和节点数上的消耗情况,例如“4uu”类型的操作时间消耗达到2.08秒,节点数为67,相比一些简单类型如“ldld”的0.28秒和29个节点,复杂度明显更高。

1.2 编码比较

接下来对两种编码方式(DPTSOsyn和DPTSOsyn,full)进行比较,这两种编码用于处理程序崩溃的情况。
- DPTSOsyn编码 :基于DPTSOsyn,为每个程序节点使用一个辅助启用变量来表示部分图。
- DPTSOsyn,full编码 :基于DPTSOsyn,full,部分避免了对程序可能崩溃执行情况的编码。

通过散点图比较每个基准测试在两种不同编码下的验证时间(秒),并根据验证结果将基准测试分类为断言成立(安全)或不成立(不安全)。观察发现,两种编码方式的性能相似,相对差异从未超过一个数量级,且没有明显趋势表明哪种编码方式性能更好。具体来说,DPTSOsyn,full部分消除了对崩溃语义的编码需求,仅为刷新事件添加一些崩溃变量,但由于没有完全编码,求解器总是需要探索完整的执行过程,即使部分执行过程是无关的。而DPTSOsyn编码虽然导致更大的状态空间,但只有崩溃前的事件参与与内存模型相关的公理,因此对于崩溃事件,基本公理可以轻易满足。

2. P-Code相关内容

2.1 背景介绍

反编译是目前逆向工程和二进制漏洞检测中广泛使用的工具。Ghidra是由美国国家安全局开发的一款流行的反编译器,它将二进制文件反编译为高P-Code,再从高P-Code生成最终的C代码输出。用户可以直接对P-Code进行分析,有许多项目利用P-Code构建了验证、反编译、污点分析和仿真等工具。然而,P-Code缺乏正式的语义,文档也有限,其语义非常微妙,这使得对P-Code进行任何形式的分析都很困难。

2.2 Ghidra与P-Code

Ghidra是一个开源的逆向工程工具,能够反编译多种架构的二进制文件。它使用自定义的反汇编器SLEIGH对二进制文件进行反汇编,并执行多个分析步骤,最终得到高级C代码和详细的控制流信息。与其他知名反编译器(如IDA-pro和Angr)相比,通过评估1760个二进制文件,使用正确识别的函数起始(CFS)指标,发现Ghidra表现高于平均水平。

P-Code是Ghidra的核心中间表示,存在两个抽象级别:
- 低P-Code :是反汇编指令的直接一对多翻译。
- 高P-Code :是低P-Code经过Ghidra反编译器的各种转换后的结果。后续主要关注高P-Code,简称为P-Code。

P-Code的指令集比x86小得多,SLEIGH将复杂的汇编指令分解为简单的P-Code指令。例如,x86的比较指令在地址0x100000e77处会分解为13条单独的P-Code指令。在分解过程中,P-Code使用局部变量。Ghidra在反汇编和翻译后会执行多个反编译分析,去除对执行没有影响的指令,解析栈并构建控制流图等,最终从高P-Code构建出最终的反编译C代码。

2.3 设计选择

为了给P-Code赋予可执行的语义,需要做出以下设计选择:
- 条件分支 :观察到P-Code生成的条件分支常常不正确,存在三种情况:一是条件分支正确;二是条件分支在True情况下错误地跳转到直通地址;三是条件分支在False情况下应该跳转到与直通地址不同的地址。在实验中,控制流API总是返回正确的出口地址,在构建解释器时会利用这一事实。
- Phi节点 :P-Code有一个MULTIEQUAL指令,在文献中更常被称为Phi节点。Phi节点的值取决于前一个执行块的地址。在其他使用Phi节点的静态单赋值(SSA)语言(如LLVM IR)中,每个替代值都由一个地址保护,通过将该地址与前一个块的地址进行比较来选择值。但在P-Code中,只列出了替代值,文档中没有提供关于替代值顺序的额外信息。通过实验发现,替代值的顺序与通过Ghidra的控制流API请求的入边顺序一致。
- Varnodes :输入和输出由所谓的varnodes编码,它们表示指令的参数和目标。P-Code手册指出varnodes要么是寄存器,要么是内存位置,由地址空间、偏移量和大小三个组件组成。这里采用了稍微不同的观点,将“地址空间”视为varnode类型,共遇到六种不同类型,可归结为四种基本类型的varnodes:
- (R r, l) :寄存器,由寄存器地址r和大小l标识。
- (A a, l) :内存,a为起始地址,l为内存区域的大小。
- (C c, l) :常量值,c为值,l为大小。
- (v, l) :局部变量,v为标识符,l为其大小。

在P-Code对哈佛架构二进制文件进行建模时,内存varnode会拆分为数据varnode和代码varnode,以模拟该架构中的专用地址。
- 调用与返回 :对于CALL指令,P-Code文档称其在语义上等同于BRANCH指令,但实际上函数可以有参数并返回值,这种行为显然不能由基本的BRANCH指令捕获。并且在调用函数时,并非所有varnode地址空间都在作用域内,进入新的函数上下文时局部变量会被清除,参数通过寄存器传递,从调用返回时这些寄存器会被清理,具体的清理方式取决于原始二进制文件所依赖的调用约定。

下面是P-Code相关流程的mermaid流程图:

graph LR
    A[二进制文件] --> B[Ghidra反汇编]
    B --> C[低P-Code]
    C --> D[Ghidra反编译分析]
    D --> E[高P-Code]
    E --> F[生成C代码]

综上所述,无论是SMT验证中的编码比较,还是P-Code的语义研究,都面临着一些挑战和需要解决的问题。在SMT验证中,需要进一步探索更有效的编码方式以提高验证性能;在P-Code方面,需要通过扩展语言和定义正式语义来解决其语义不明确的问题,从而更好地利用P-Code进行各种分析。

2.4 P-Code语法与语义

2.4.1 P-Code语法

P-Code的语法基于前面提到的设计选择进行定义。varnodes作为指令的输入和输出,有不同的类型,如寄存器、内存、常量和局部变量等。指令集相对简单,将复杂的汇编指令进行了分解。例如,x86的一些指令会被拆分成多个P-Code指令,使用局部变量来完成中间计算。

2.4.2 P-Code语义

为了定义P-Code的语义,需要考虑前面提到的各种设计选择带来的影响。
- 条件分支语义 :根据控制流API返回的正确出口地址来确定跳转逻辑。当遇到条件分支指令时,结合API提供的信息,正确判断跳转的目标地址。
- Phi节点语义 :Phi节点的值选择依赖于入边的顺序。根据Ghidra的控制流API获取入边顺序,从而确定Phi节点在不同控制流情况下选择的替代值。
- Varnodes语义 :不同类型的varnodes有不同的语义。寄存器varnode表示特定寄存器的值,内存varnode表示特定内存区域的数据,常量varnode表示固定的值,局部变量varnode表示在函数内部使用的变量。

2.5 问题与改进

在研究P-Code的过程中,发现了Ghidra、P-Code和文档中存在的一些问题:
| 问题类型 | 具体描述 |
| ---- | ---- |
| 条件分支问题 | 生成的条件分支常常不正确,存在跳转到错误地址的情况。 |
| Phi节点信息缺失 | 文档中没有提供Phi节点替代值顺序的额外信息。 |
| Varnodes定义模糊 | P-Code手册对varnodes的定义不够清晰,实际使用中采用了不同的观点。 |
| CALL指令语义不符 | CALL指令文档描述与实际功能不符,不能仅用BRANCH指令的语义来解释。 |

为了解决这些问题,采取了以下改进措施:
- 扩展P-Code语言 :添加必要的信息,如Phi节点的入边顺序信息,以明确语义。
- 定义正式语义 :基于前面的设计选择,为扩展后的P-Code定义正式的操作语义。
- 编写解释器 :使用Haskell编写P-Code解释器,验证语义的可执行性。

3. 总结

3.1 SMT验证总结

在SMT验证中,对安全基准测试的研究让我们了解到不同类型操作在时间和节点数上的消耗差异。DPTSOsyn和DPTSOsyn,full两种编码方式虽然性能相似,但各有优缺点。未来可以进一步研究如何结合两种编码的优势,或者探索新的编码方式,以提高验证效率。

3.2 P-Code总结

P-Code在反编译领域有重要的应用,但由于缺乏正式语义和文档有限,给分析带来了困难。通过扩展P-Code语言、定义正式语义和编写解释器,解决了部分问题。然而,仍然需要进一步完善,例如优化解释器的性能,以及与更多的反编译工具进行集成,以更好地服务于逆向工程和漏洞检测等领域。

下面是整个研究过程的mermaid流程图:

graph LR
    A[SMT验证] --> B[安全基准测试]
    B --> C[编码比较]
    D[P-Code研究] --> E[背景介绍]
    E --> F[Ghidra与P-Code]
    F --> G[设计选择]
    G --> H[语法与语义]
    H --> I[问题与改进]
    C --> J[总结与展望]
    I --> J

总之,SMT验证和P-Code语义研究都为相关领域的发展提供了有价值的参考。通过不断地探索和改进,有望在验证效率和反编译准确性方面取得更大的突破。

【四旋翼无人机】具备螺旋桨倾斜机构的全驱动四旋翼无人机:建模控制研究(Matlab代码、Simulink仿真实现)内容概要:本文围绕具备螺旋桨倾斜机构的全驱动四旋翼无人机展开研究,重点探讨其系统建模控制策略,结合Matlab代码Simulink仿真实现。文章详细分析了无人机的动力学模型,特别是引入螺旋桨倾斜机构后带来的全驱动特性,使其在姿态位置控制上具备更强的机动性自由度。研究涵盖了非线性系统建模、控制器设计(如PID、MPC、非线性控制等)、仿真验证及动态响应分析,旨在提升无人机在复杂环境下的稳定性和控制精度。同时,文中提供的Matlab/Simulink资源便于读者复现实验并进一步优化控制算法。; 适合人群:具备一定控制理论基础和Matlab/Simulink仿真经验的研究生、科研人员及无人机控制系统开发工程师,尤其适合从事飞行器建模先进控制算法研究的专业人员。; 使用场景及目标:①用于全驱动四旋翼无人机的动力学建模仿真平台搭建;②研究先进控制算法(如模型预测控制、非线性控制)在无人机系统中的应用;③支持科研论文复现、课程设计或毕业课题开发,推动无人机高机动控制技术的研究进展。; 阅读建议:建议读者结合文档提供的Matlab代码Simulink模型,逐步实现建模控制算法,重点关注坐标系定义、力矩分配逻辑及控制闭环的设计细节,同时可通过修改参数和添加扰动来验证系统的鲁棒性适应性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值