为什么 ret 指令数大于调用指令数?
why the Number of ret instructions is greater than number of call instructions?
我写了一个pintool。它在执行指令时为程序实现堆栈。如果遇到调用指令,它会将下一条指令的地址按顺序压入堆栈。当被调用过程完成并遇到 return 指令时,它会验证 ret 指令中的目标地址是否等于堆栈顶部并弹出顶部。
通常调用指令的数量应该等于return条指令。但是此工具监视大量 return 指令。这怎么可能?问题是什么?我该如何解决?
编辑 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);
}
}
i 运行 它在各种二进制文件和进程上,但问题仍然存在。请帮忙
您可以在函数调用中出现 longjmp、C++ 异常或退出调用,这会使您错过该函数调用的 return 指令。
这个已经讨论过很多次了here
我写了一个pintool。它在执行指令时为程序实现堆栈。如果遇到调用指令,它会将下一条指令的地址按顺序压入堆栈。当被调用过程完成并遇到 return 指令时,它会验证 ret 指令中的目标地址是否等于堆栈顶部并弹出顶部。
通常调用指令的数量应该等于return条指令。但是此工具监视大量 return 指令。这怎么可能?问题是什么?我该如何解决?
编辑 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);
}
}
i 运行 它在各种二进制文件和进程上,但问题仍然存在。请帮忙
您可以在函数调用中出现 longjmp、C++ 异常或退出调用,这会使您错过该函数调用的 return 指令。
这个已经讨论过很多次了here