我正在对x86-64bitELF 二进制文件进行二进制分析。所有的二进制文件都是从C语言编译的。基本上,对于给定的函数,我想弄清楚这个函数是否有返回值。即在其对应的C代码中,是否return存在有意义的。
由于我基本上面对的是汇编代码,因此通过某些类型信息来弄清楚是不可行的。但是,对于普通的x86-64bit汇编程序,调用约定只允许寄存器rax保存返回值,所以我想检查一下rax典型函数调用后的用法,并决定目标函数是否返回值。
下面是一个AT&T语法示例:
foo:
...
call bar
mov 0, %rax <--- bar should not have a return value
bar:
...
在上面的例子中,由于rax立即重置,函数不太可能bar返回值。
另一个例子:
foo:
...
call bar
jmp *%rax <----- It is very likely that bar has a return value
对于上述情况,我想如果没有一些积极的过程间优化,我们可以肯定地说它bar返回一个值(一个指针)。
我认为这是另一个(临时)逆向工程任务,但我想可能有一种更“正式”的方法来解决它,对此有什么想法吗?