Hauptmenü öffnen

Vu+ WIKI β

Änderungen

Cross Compiler

4.278 Bytes hinzugefügt, 17:06, 26. Feb. 2023
keine Bearbeitungszusammenfassung
Das Binary kann jetzt auf eine Mips-Box kopiert werden, um endgültig sicherzustellen, dass wir hier keinen Murks produziert haben.
 
== Nützliches zu objdump, ldd und Versionierung von Shared-Libraries ==
=== objdump ===
Das folgende ist eher allgemein gehalten und gilt für alle Architekturen. Damit man im Vorfeld schon weiß, ob die auf der Zielmaschine installierten Shared-Libraries neu genug sind, damit ein Programm läuft, gibt es ein paar Hilfsmittel. Eines haben wir vorhin schon kennen gelernt: <code>objdump</code>. Der interessante Teil befindet sich im Abschnitt "Version References:".
 
<pre>
Version References:
required from libc.so.6:
0x0d696914 0x00 06 GLIBC_2.4
0x0d696915 0x00 05 GLIBC_2.5
0x0d696912 0x00 04 GLIBC_2.2
0x0d696910 0x00 03 GLIBC_2.0
0x0d696913 0x00 02 GLIBC_2.3
</pre>
 
Hier erfahren wir, dass das Binary gegen eine Sharded-Library <code>libc.so.6</code> gelinkt wurde. Um nicht bei jedem Update der Libc die Versionsnummer "6" erhöhen zu müssen, werden neue Features oder geänderte Aufrufe in der Library selber versioniert. Hier sieht man, dass Features der GLIBC_2.0 bis GLIBC_2.5 benötigt werden. Ein wenig Recherche bringt zutage, dass diese Versionsnummern auch wirklich mit den Versionen der glibc übereinstimmen. Die auf unseren Boxen vorinstallierte glibc liegt in der Version 2.21 vor und benutzt deshalb für die neuen ab dieser Version integrierten Features die interne Version GLIBC_2.21. Aktuell ist übrigens die glibc-2.37. Da die glibc zweimal jährlich aktualisiert wird, liegen hier 8 Jahre (fehlende) Entwicklung dazwischen.
 
=== ldd ===
Ein anderes sehr nützliches Tool ist <code>ldd</code>. Ohne weitere Parameter werden hier einfach die benötigten Shared-Libraries angezeigt:
<pre>
root@vusolo4k:~# ldd /usr/bin/grep
libpcre.so.1 => /usr/lib/libpcre.so.1 (0xb6f20000)
libc.so.6 => /lib/libc.so.6 (0xb6db8000)
/lib/ld-linux-armhf.so.3 (0xb6f64000)
</pre>
 
Sehr nützlich ist der Aufruf mit Parameter "-v":
<pre>
root@vusolo4k:~# ldd -v /usr/bin/grep
libpcre.so.1 => /usr/lib/libpcre.so.1 (0xb6ec0000)
libc.so.6 => /lib/libc.so.6 (0xb6d58000)
/lib/ld-linux-armhf.so.3 (0xb6eff000)
 
Version information:
/usr/bin/grep:
libc.so.6 (GLIBC_2.26) => /lib/libc.so.6
libc.so.6 (GLIBC_2.5) => /lib/libc.so.6
libc.so.6 (GLIBC_2.34) => /lib/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
/usr/lib/libpcre.so.1:
libc.so.6 (GLIBC_2.4) => /lib/libc.so.6
/lib/libc.so.6:
ld-linux-armhf.so.3 (GLIBC_2.4) => /lib/ld-linux-armhf.so.3
ld-linux-armhf.so.3 (GLIBC_PRIVATE) => /lib/ld-linux-armhf.so.3
</pre>
 
Ähnlich wie bei <code>objdump</code> werden auch hier die benötigten Versionen der Shared-Libraries angezeigt.
 
Weitere Bekannte Libraries, die versioniert sind, sind unter anderem folgende:
* libstdc++ - GLIBCXX_3.4.21 gehört z.B. zur libstdc++-6.0.21 (GCC-5.1), CXXABI_1.3.12 genauso wie GLIBCXX_3.4.26 zur libstdc++-6.26 (GCC-9.1). Die Versionen können der Dokumentation von gcc entnommen werden: https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
* libssl und libcrypto von OpenSSL: die benötigten Versionen steht direkt in der Symboltabelle, z.B. als OPENSSL_1.0.2g
* zlib: die benötigten Versionen stehen ebenfalls direkt in der Symboltabelle der libz.so, z.B. ZLIB_1.2.12
 
=== c++filt ===
Ein letztes nützliches Tool in Zusammenhang mit Dumps und wenn man mehr über die Symbol-Tabelle eines Binaries erfahren möchte, ist <code>c++filt</code>. Mit diesem Tool können "gemanglte" Symbole wieder lesbar gemacht werden. Schauen wir z.B. in die Symbol-Tabelle von enigma2 mit <code>objdump -R /usr/bin/enigma2</code>, sehen wir viele c++-Symbolnamen, wie z.B. <code>_ZNSt3tr18__detail12__prime_listE@GLIBCXX_3.4.10</code>
 
<code>c++filt</code> kann uns das wieder lesbarer machen: <code>c++filt _ZNSt3tr18__detail12__prime_listE</code> spuckt dafür aus: <code>std::tr1::__detail::__prime_list</code>.
 
Oder:
 
<pre>root@vusolo4k:~# c++filt _ZNSt14basic_ifstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode
std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode)
</pre>
<pre>root@vusolo4k:~# c++filt _ZN19CaProgramMapSectionC1EPK17ProgramMapSectionhhRKSt6vectorItSaItEE
CaProgramMapSection::CaProgramMapSection(ProgramMapSection const*, unsigned char, unsigned char, std::vector<unsigned short, std::allocator<unsigned short> > const&)
</pre>
75
Bearbeitungen