elf-loader如何知道stderr和stdout

时间:2016-06-29 13:40:20

标签: linux elf dynamic-loading

我正在拆卸一个非常简单的ELF程序(Linux x86) 使用IDA PRO软件,我在stdout - 部分中看到了stderr.bss。 我还没有找到任何设置stdoutstderr值的内容。 它是如何工作的?
Сanstdoutstderr为空?

1 个答案:

答案 0 :(得分:1)

  

所以你的意思是stdout和stderr应该总是在.bss

中的相同内存地址

.bss开始到stdoutstderr的偏移量是在静态链接时确定的。

.bss的起始地址受ASLR(堆放置随机化)的影响。因此,对于给定的二进制文件,stdout的地址可能会在运行之间发生变化。

  

IDA pro如何知道.bss中的这个项目是stdout还是stderr

可以知道的唯一方法是通过符号表。您应该在以下输出中看到它:

readelf -Ws ./a.out | egrep 'stdout|stderr'
nm ./a.out          | egrep 'stdout|stderr'
nm -D ./a.out       | egrep 'stdout|stderr'

<强>更新

  

但是如果符号表被剥离会发生什么

有两种情况需要考虑:全静态链接和动态链接。

在完全静态的情况下,可以完全删除对stderr的所有引用,并且IDA专业人员知道stderr的位置。

在动态链接的情况下,有两个符号表:&#34;常规&#34;一个(由nm显示)和动态一个(由nm -D显示)。 Strip将删除常规符号表(因为删除动态符号表毫无意义 - 如果没有它,可执行文件将无法运行)。然后,IDA pro可以使用stderr的动态符号表条目来判断该符号的位置。