如何在基本块的入口和出口插入检测代码以获得变量的当前值?

时间:2019-05-25 12:57:45

标签: security clang llvm llvm-clang

在我最近的工作中,我需要在基本块的入口和出口处插入检测代码以获取变量的值,因此可以基于源代码的DFA对其进行检查。另一个任务是当根据检测代码执行可执行文件时,将在函数调用和系统调用或变量访问之前或变量更新之后触发异常。
我已阅读有关如何编写通行证的LLVM手册。但是,它并没有告诉我如何获取变量的最新值。
有人提供了包含LLVM传递基本用法的链接,但它太简单了-----------①https://github.com/SumedhArani/LLVM
https://www.cs.cornell.edu/~asampson/blog/llvm.html


一个可以用来发起DOP攻击的简单程序:

#include <stdio.h>
int main(){
    int old_valud,new_value;
    int *p=&old_value,*q=&new_value;
    int connect_limit=100;
    char buf[64];

    while(connect_limit--){
        read(0,buf);
        *p=*q;
    }
    return 0;
}

LLVM IR

  define i32 @main() #0 {
  %1 = alloca i32, align 4
  %old_value = alloca i32, align 4
  %new_value = alloca i32, align 4
  %p = alloca i32*, align 8
  %q = alloca i32*, align 8
  %connect_limit = alloca i32, align 4
  %buf = alloca [64 x i8], align 16
  store i32 0, i32* %1
  store i32* %old_value, i32** %p, align 8
  store i32* %new_value, i32** %q, align 8
  store i32 100, i32* %connect_limit, align 4
  br label %2

; <label>:2                                       ; preds = %6, %0
  %3 = load i32, i32* %connect_limit, align 4
  %4 = add nsw i32 %3, -1
  store i32 %4, i32* %connect_limit, align 4
  %5 = icmp ne i32 %3, 0
  br i1 %5, label %6, label %12

; <label>:6                                       ; preds = %2
  %7 = getelementptr inbounds [64 x i8], [64 x i8]* %buf, i32 0, i32 0
  %8 = call i32 (i8*, ...) @__isoc99_scanf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i8* %7)
  %9 = load i32*, i32** %q, align 8
  %10 = load i32, i32* %9, align 4
  %11 = load i32*, i32** %p, align 8
  store i32 %10, i32* %11, align 4
  br label %2

; <label>:12                                      ; preds = %2
  ret i32 0
}

CFG

enter image description here


有人可以提供一些相关的源代码和指导吗?

0 个答案:

没有答案