为什么ret指令的数量大于通话指令的数量?

时间:2017-07-26 15:54:20

标签: c++ operating-system cpu-architecture intel-pin

我写了一个pintool。它在执行指令时为程序实现堆栈。在遇到调用指令的情况下,它按顺序将下一条指令的地址推送到堆栈。当被调用的过程完成并且遇到返回指令时,它会验证ret指令中的目标地址是否等于栈顶并弹出顶部。

通常,呼叫指令的数量应等于返回指令。但是这个工具监控大量的返回指令。这怎么可能?问题是什么?我怎么解决呢?

编辑1:

pintool的代码

VOID f_jump(int a, int b) 
{ 
s.push(b); 
cout<<s.top()<<"\t"; 
icount1++; 
}
VOID f_ret(int a, int b) 
{ 
if (b==s.top())
 { 
   cout<<s.top(); 
   s.pop(); 
   cout<<"\tOK"<<endl; 
 }
else 
cout<<"Exploit\t"<<endl<<s.top()<<"\t"<<b<<endl; 
icount2++; 
} 

VOID Instruction(INS ins, VOID *v) 
{ 
if( INS_IsCall(ins) ) 
  { 
  INS_InsertCall(ins,IPOINT_TAKEN_BRANCH,AFUNPTR(f_jump),
  IARG_BRANCH_TARGET_ADDR,IARG_RETURN_IP, IARG_END); 
  } 
if( INS_IsRet(ins) )
  { 
 INS_InsertCall(ins,IPOINT_BEFORE,AFUNPTR(f_ret),
 IARG_INST_PTR,IARG_BRANCH_TARGET_ADDR, IARG_END);
  } 
}

我在各种二进制文件和进程上运行它但问题仍然相同。请帮忙。

1 个答案:

答案 0 :(得分:1)

您可以在函数调用中使用longjmp,C ++异常或退出调用,这会使您错过该函数调用的返回指令。

这已经多次讨论here