为什么 ret 指令数大于调用指令数?
why the Number of ret instructions is greater than number of call instructions?
我写了一个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++异常或退出调用,这会让你错过该函数调用的返回指令。
这已经在这里讨论了很多次
相关文章:
- 什么时候调用组成单元对象的析构函数
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么 ret 指令数大于调用指令数?
- 从C 调用Tensorflow Lite .tflite CNN模型时,非法指令
- 如何使用调用和别名指令在 llvm 字节码中查找函数名称
- 如何使用调用和分配指令在 llvm 字节码中查找类名
- 为什么包装在函数中的 GAS 内联程序集为调用方生成的指令与纯程序集函数不同
- 通过 using-指令调用开始和结束
- 如何为llvm IR调用指令创建结构参数
- 为什么VS2013将函数调用编译成两个指令而不是一个
- 第一私有变量结构中允许的OpenMP调用和指令
- 为什么c++内联函数有调用指令
- C++(嵌套)函数调用指令-寄存器
- 运行代码时是否可以在 main() 之前调用其他方法/指令
- 运行代码时是否可以在main()之后调用其他方法/指令
- 使用返回类型调用函数时出现非法指令错误
- 如果在指令之前调用递归函数怎么办
- 在c++中的其他指令之后调用基类的构造函数