Ich zerlege ein sehr einfaches ELF-Programm (Linux x86).
Mit IDA PRO Software sehe ich stdout
und stderr
in .bss
-Sektion. Und ich habe nichts gefunden, das die Werte stdout
oder stderr
setzt. Wie funktioniert es?
stdout
und stderr
null sein?Wie kennt Elf-Loader die Adresse von stderr und stdout
Antwort
So meinen Sie stdout und stderr immer an der gleichen Speicheradresse in .bss
Der Offset vom Beginn der .bss
zu stdout
und stderr
wird bestimmt bei statischer Link Zeit sein sollte.
Die Adresse von Start .bss
unterliegt ASLR (Heap Placement Randomization). Daher kann sich die Adresse stdout
für eine gegebene Binärdatei von Lauf zu Lauf ändern.
wie IDA Pro diesen Artikel in .bss weiß ist stdout oder stderr
Der einzige Weg, es kann wissen, ist, über die Symboltabelle. Sie sollten es in der Ausgabe von sehen:
readelf -Ws ./a.out | egrep 'stdout|stderr'
nm ./a.out | egrep 'stdout|stderr'
nm -D ./a.out | egrep 'stdout|stderr'
Update:
aber was passiert, wenn Symboltabelle
gestrippt wird, gibt es zwei Fälle zu betrachten: voll statischen Link und dynamische Verbindung.
Im vollstatischen Fall alle Verweise auf stderr
vollständig entfernt werden, und IDA Pro nicht wissen, wo stderr
ist.
Im dynamisch verknüpften Fall gibt es zwei Symboltabellen: die "normale" (angezeigt durch nm
) und die dynamische (angezeigt durch nm -D
). Strip entfernt nur die reguläre Symboltabelle (weil das Entfernen der dynamischen Symboltabelle keinen Sinn ergibt - die ausführbare Datei wird nicht ohne sie ausgeführt). IDA pro kann dann den dynamischen Symboltabelleneintrag für stderr
verwenden, um zu ermitteln, wo sich dieses Symbol befindet.
stdout und stderr sind Dateihandles, die von der c-Laufzeitumgebung erstellt werden. Ihr Programm erwartet, dass das System sie bereits erstellt hat. http://www.gnu.org/software/libc/manual/html_node/Standard-Streams.html – SnakeDoc
Also meinst du stdout und stderr sollte immer an der gleichen Speicheradresse in .bss sein? – Bob5421