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.
- 1. Speichern Sie stdout, stderr und stdout + stderr synchron
- 2. ABAP Stdout und Stderr
- 3. Apache Spark Stderr und Stdout
- 4. paramiko kombinieren stdout und stderr
- 5. Piping popen stderr und stdout
- 6. vim filter und stdout/stderr
- 7. Wiederherstellen von stdout und stderr Standardwert
- 8. Ruby synchronisierte Ausgabe von $ stdout und $ stderr
- 9. LLVM stdin/stdout/stderr
- 10. fork() und STDOUT/STDERR an die Konsole von untergeordneten Prozessen
- 11. Dupliziere stdout zu stderr
- 12. über stdout/stderr Umleitungen
- 13. stderr Umleitung zu stdout
- 14. umleiten stdout und stderr auf die gleiche Datei und wiederherstellen
- 15. Redirect stdout und stderr zu Funktion
- 16. Unterdrücken stdout/stderr Drucken von Python-Funktionen
- 17. Wie stdout und stderr von csh-Skript umleiten
- 18. stdout und stderr nach SIGPIPE wiederherzustellen
- 19. Piping sowohl stdout und stderr in bash?
- 20. Redirect STDOUT und STDERR zu Datei "> &"
- 21. Protokollierung stderr und stdout mit log4j
- 22. Muting stdout und stderr während Mokka-Tests
- 23. Capture stderr von Python Subprozess.Popen (Befehl, stderr = subprocess.PIPE, stdout = subprocess.PIPE)
- 24. Python Logging Split zwischen stdout und stderr
- 25. Capturing stderr, aber nicht stdout
- 26. Fehler beim Umleiten von stdout und stderr von Powershell-Skript
- 27. , wie man richtig alle stdout/stderr erfassen
- 28. Wie Umleitung Child-Prozess stdout/stderr auf den Hauptprozess stdout/stderr in Java?
- 29. Wie stdout/stderr mit googletest erfassen?
- 30. redirect stdout/stderr in C
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