ZJU-SEC/AbstractResourceAttack

关于Pass检测代码的几个问题

Tomahawkd opened this issue · 1 comments

您好,看了文章之后我想复现一下您在文章里提到的自动化检测变量的程序。但是我在运行中碰到几个问题和几处错误的地方想请教一下。

  1. LockPair.cpp中获取元素type的错误
    995行1059行
llvm::Type *ArrayTy = RealmType->getPointerElementType();

是否应为

llvm::Type *ArrayTy = RealmType->getArrayElementType();

实际运行中会产生assert错误,修复后正常。

  1. LockPair.cpp中FindChangArg函数中可能出现offset越界的情况
    282行
bool LockPair::FindChangArg(llvm::Function * funcname, int offset){//这里相当于输入了funcA: call funcB中的funcB和对应指针类型函数的偏移量
    std::cout<<"into FindChangeArg"<<std::endl;
    if(llvm::Value * offsetarg=funcname->getArg(offset)){
...

目前我也没有定位出该错误的具体原因,所以我加了一次if判断

if (funcname->arg_size() <= offset) return false;
  1. CtlTableAnalysis.cpp中错误的类型转换
    159行中,该类型被强制转换成llvm::ConstantStruct,但是在实际运行中发现可能会出现llvm::Constant类,导致转换失败。
llvm::ConstantStruct *CS=llvm::cast<llvm::ConstantStruct>(GlobalVInitList->getOperand(Index));

目前我修改为

llvm::ConstantStruct *CS=llvm::dyn_cast<llvm::ConstantStruct>(GlobalVInitList->getOperand(Index));
if (!CS) continue;

来忽略llvm::Constant类。

修改为这三处之后我得到的运行结果:

Total Struct Type: 153
Total Global Variable: 18
Total Function: 641

但是该结果和论文中的结果有些偏差。


环境和Linux内核配置情况:
cmake: 3.18.1预编译包
clang+llvm: 12.0预编译包
linux: 5.3.1
python: 3.8.10
wllvm: 1.3.1
其中,linux编译命令如下:

# 默认配置
make CC=wllvm HOSTCC=wllvm defconfig
make CC=wllvm HOSTCC=wllvm

其余操作均遵循README。

谢谢。