0%

LLFI 工具学习与使用

LLFI使用步骤

Complie编译生成中间代码

将源文件进行编译生成.ll格式的中间代码。

  • 输入:源程序(C/C++程序
  • 输出:编译生成.ll文件或者.bc文件
1
2
~/LLFI-master/llvm/bin/clang -emit-llvm -S sample.c -o sample.ll
~/LLFI-master/llvm/bin/clang -emit-llvm -c sample.c -o sample.bc

Instrument工具插入回调函数

在生成的中间代码(.ll/.bc文件)中插入回调函数,以进行分析和故障注入。可以在指定位置进行插入,指定位置是由input.yaml文件中指定要注入的故障确定。

1
2
~/LLFI-master/llfi/bin/Instrucment --readable sample.ll
~/LLFI-master/llfi/bin/Instrucment sample.bc
  • 输入:编译生成的中间代码.ll/.bc,以及带有 compileTime 选项的 input.yaml 文件(没有在命令中体现,只需要将input.yaml和源代码放在同一目录下即可)
  • 输出:两个 .ll(或 .bc)文件分别用于分析和故障注入。这些文件将分别称为 sample-profiling.llsample-faultinjection.ll。还会生成相应的可执行文件 sample-profiling.exesample-faultInjection.exe

Profiling 分析

为了获取步骤2中标识的.ll文件中指定位置的动态执行计数。

1
~/LLFI-master/llfi/bin/Profile ./llfi/sample-profiling.exe <程序参数>
  • 输入:分析可执行文件sample-profiling.exe,和程序所需要的参数
  • 输出:llfi-stat-profile.txt,它是一个包含循环总数(即感兴趣的地方的执行实例)的文本文件,以及一个包含程序黄金输出的输出文件

Fault Injection 故障注入

1
~/LLFI-master/llfi/bin/injectfault ./llfi/sample-faultinjection.exe <程序参数>
  • 输入:fault-injection 可执行文件sample-faultInjection.exe,输入的yaml 文件填入运行时选项,尤其是fault-injection 运行次数和faultinjector 类型。此外,分析步骤 3 的输出。
  • 输出:故障注入实验的结果,以及注入的日志文件和生成的输出文件。应用程序写入 stderr 的任何错误消息也会被记录下来。

inpuy.yaml各指令含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
defaultTimeOut: 500 
compileOption: # 定义LLFI的编译时选项
instSelMethod: # 指令选择器
- insttype:
include:
- all
exclude:
- ret

regSelMethod: regloc # 寄存器选择器
regloc: dstreg

includeInjectionTrace: # 跟踪选项
- forward
- backward

tracingPropagation: True # trace dynamic instruction values.

tracingPropagationOption:
maxTrace: 250 # max number of instructions to trace during fault injection run
debugTrace: True/False
generateCDFG: True

runOption:
- run:
numOfRuns: 3
fi_type: bitflip

compileOption层次结构

定义了LLFI的编译时选项,包括指令选择器、寄存器选择器、跟踪选项等。指令选择器和寄存器选择器可以用于指定故障注入的范围,通过配置这两个选择器,用户可以限制可能发生故障的潜在位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
compileOption:
### 必须项目 ###
instSelMethod:
<content of inst selector>...
regSelMethod: <content of reg selector>...

### 可选择项目 ###
tracingPropagation: True/False
tracingPropagationOption:
<content of tracing propagation option>
includeInjectionTrace:
- forward
- backward

instSelMethod

定义指令选择器instSelMethod是定义指令选择器的块。它位于compileOption\的字典中。下面是这个块的结构:

1
2
3
4
5
6
7
8
instSelMethod:
- <insttype/funcname/customInstselector>:
include:
- <inst types/func names/name of custom inst selector>
exclude:
- <inst types/func names>
options:
- <command line options for the inst selector>
正在加载今日诗词....