为什么 ret 指令数大于调用指令数?

why the Number of ret instructions is greater than number of call instructions?

本文关键字:指令 调用 大于 为什么 ret      更新时间:2023-10-16

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

通常,调用指令的数量应等于返回指令的数量。 但是此工具监视更多的返回指令。 这怎么可能?问题出在哪里? 我该如何解决?

编辑 1:

密码

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<<"Exploitt"<<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);
} 
}

我在各种二进制文件和进程上运行它,但问题保持不变。 请帮忙。

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

这已经在这里讨论了很多次