2011-07-26 2 views
0

Xor 임의의 카나리아를 구현하고자하므로 함수의 프롤로그 및 에필로그에서 반환 주소를 얻어야합니다. 내가 스택에 카나리아에 삽입하기 전에 함수의 프롤로그에서 LLVM에서 스택에 반환 주소를 얻는 방법

는 내가 의해 반환 주소를 얻을 수 있습니다 :

ConstantInt* ci = llvm::ConstantInt::get(Type::getInt32Ty(RI->getContext()), 0); 
Value* Args1[] = {ci}; 
CallInst* callInst = CallInst::Create(Intrinsic::getDeclaration(M, Intrinsic::returnaddress), 
       &Args1[0], array_endof(Args1), "Call Return Address", InsPt); 

callInst은 반환 주소를 얻을 것이다 그것을 작동합니다.

기능의 끝 부분에는 카나리아가 삽입되어 있기 때문에. 나는 유사한 코드 쓰기 :

ConstantInt* ci2 = llvm::ConstantInt::get(Type::getInt32Ty(RI->getContext()), 1); 
Value* Args3[] = {ci2}; 
CallInst* callInst1 = CallInst::Create(Intrinsic::getDeclaration(M, Intrinsic::returnaddress), 
      &Args3[0], array_endof(Args3), "Caaall Return Address", BB); 

을하지만이 시간이 작동하지 않습니다. 나는 반송 주소를 얻을 수 없다.

무엇이 문제인가? 반송 주소는 어떻게받을 수 있습니까? 이렇게하는 이유

답변

0

는 모르겠지만 에필로그에서, 당신은 호출 스택에 이전 함수의 반환 주소를 얻기 위해 시도

llvm.returnaddress i32 1 

을 요구하고있다. 카나리아를 넣었을지라도 현재의 반송 주소가 현재의 에필로그에서 기능하도록합니다. 당신은 프롤로그에서처럼 그래서 당신은, 0은 아마 작동하지 않습니다 이외의 인수와 llvm.returnaddress를 호출, 그냥 보조 노트로

llvm.returnaddress i32 0 

를 호출해야합니다. docs에서 :

이 내장 함수에 의해 반환되는 값이 0이 아닌 인수에 대한 잘못된 0있을 가능성이 크므로이 디버깅 목적으로 만 사용되어야합니다.

관련 문제