2011-07-26 7 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である可能性が高いので、それはデバッグ目的にのみ使用されるべきです。

関連する問題