8048563: e8 0d 00 00 00 call 8048575 <exit@plt+0x141>为了好玩,我试图反向工程一个二进制文件,我在objdump输出中看到了这个调用。查看这一行,我认为调用将是对退出函数的调用,它是动态链接的。然而,8048575似乎是这个程序的.text部分中的一个地址!
8048575: 83 ec 6c sub esp,0x6c发布于 2011-04-25 19:22:04
这实际上不是IAT/PLT调用,而是对同一个文件中的另一个函数的调用。该文件可能已经删除了其内部符号,objdump将所有地址显示为地址+偏移之前最后定义的符号。如果没有内部符号,这将击中最后一个plt链接函数,因为plt部分位于文本之前。
因此,显示的名称只是伪造的,可以忽略。
发布于 2011-04-23 18:29:56
当程序调用共享库中的函数时,它调用过程链接表(PLT)中的地址。最初,PLT包含对动态链接器的调用,动态地查找函数地址,然后用找到的地址替换PLT中的地址。
发布于 2011-04-23 19:41:27
这是对IAT(导入地址表)条目的调用,这样它就可以对名为“exit`”的函数执行模块间调用(实际上是跳转),这样就可以避免远距离调用,并使动态链接变得更简单。至于“缺失”的序言,根本不需要设置堆栈帧,实际上大多数功能完全不需要设置堆栈,因此堆栈分配是序曲,唯一真正需要堆栈帧的函数是不受信任的“裸”程序集函数或对堆栈进行不可预知的更改的函数。
https://stackoverflow.com/questions/5765922
复制相似问题