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);
しかし今回は動作しません。私は返信アドレスを得ることができません。
問題が何ですか?リターンアドレスはどのように入手できますか?あなたがこれを行う理由