我正在拆卸一个非常简单的ELF程序(Linux x86)
使用IDA PRO软件,我在stdout
- 部分中看到了stderr
和.bss
。
我还没有找到任何设置stdout
或stderr
值的内容。
它是如何工作的?
Сanstdout
和stderr
为空?
答案 0 :(得分:1)
所以你的意思是stdout和stderr应该总是在.bss
中的相同内存地址
从.bss
开始到stdout
和stderr
的偏移量是在静态链接时确定的。
.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
的动态符号表条目来判断该符号的位置。