elf-loader如何知道stderr和stdout的地址
How does elf-loader knows the address of stderr and stdout
我正在反汇编一个非常简单的 ELF 程序 (Linux x86)。
使用 IDA PRO 软件,我在 .bss
部分看到 stdout
和 stderr
。
而且我还没有找到任何设置 stdout
或 stderr
值的东西。
它是如何工作的?
Сan stdout
和 stderr
为空?
So you mean stdout and stderr should always be at the same memory address in .bss
从 .bss
开始到 stdout
和 stderr
的偏移量是在静态 link 时间确定的。
.bss
的起始地址受 ASLR(堆放置随机化)影响。因此,对于给定的二进制文件,stdout
的地址可能会从 运行 运行.
how IDA pro knows this item in .bss is stdout or stderr
它可以知道的唯一方法是通过符号table。您应该在以下位置的输出中看到它:
readelf -Ws ./a.out | egrep 'stdout|stderr'
nm ./a.out | egrep 'stdout|stderr'
nm -D ./a.out | egrep 'stdout|stderr'
更新:
but what happens if symbol table is stripped
有两种情况需要考虑:完全静态 link 和动态 link。
在全静态的情况下,所有对stderr
的引用都可以被完全删除,IDA pro不会知道stderr
在哪里。
在动态-linked 的情况下,有两个符号 tables:"regular" 一个(由 nm
显示)和动态一个(显示通过 nm -D
)。 Strip 将仅删除 常规符号 table(因为删除动态符号 table 没有任何意义——executable 不会 运行 没有它)。然后,IDA pro 可以使用 stderr
的动态符号 table 条目来判断该符号的位置。
我正在反汇编一个非常简单的 ELF 程序 (Linux x86)。
使用 IDA PRO 软件,我在 .bss
部分看到 stdout
和 stderr
。
而且我还没有找到任何设置 stdout
或 stderr
值的东西。
它是如何工作的?
Сan stdout
和 stderr
为空?
So you mean stdout and stderr should always be at the same memory address in .bss
从 .bss
开始到 stdout
和 stderr
的偏移量是在静态 link 时间确定的。
.bss
的起始地址受 ASLR(堆放置随机化)影响。因此,对于给定的二进制文件,stdout
的地址可能会从 运行 运行.
how IDA pro knows this item in .bss is stdout or stderr
它可以知道的唯一方法是通过符号table。您应该在以下位置的输出中看到它:
readelf -Ws ./a.out | egrep 'stdout|stderr'
nm ./a.out | egrep 'stdout|stderr'
nm -D ./a.out | egrep 'stdout|stderr'
更新:
but what happens if symbol table is stripped
有两种情况需要考虑:完全静态 link 和动态 link。
在全静态的情况下,所有对stderr
的引用都可以被完全删除,IDA pro不会知道stderr
在哪里。
在动态-linked 的情况下,有两个符号 tables:"regular" 一个(由 nm
显示)和动态一个(显示通过 nm -D
)。 Strip 将仅删除 常规符号 table(因为删除动态符号 table 没有任何意义——executable 不会 运行 没有它)。然后,IDA pro 可以使用 stderr
的动态符号 table 条目来判断该符号的位置。