これはpwnageチャレンジです。 2つの仮想マシンがあります。どちらもglibc 2.19を実行しています。ただし、両方の関数オフセットを分析すると、両方が異なります。
私が知る限り、同じバージョンのlibcは同じオフセットを持っています。オンラインで検索しましたが、説得力のある解決策が見つかりませんでした。両方のコンピュータの詳細は次のとおりです。
マシン1:
~$ objdump -d /lib/i386-linux-gnu/libc.so.6 | grep system
00040190 <__libc_system>:
~$ objdump -d /lib/i386-linux-gnu/libc.so.6 | grep "IO_puts>"
00065650 <_IO_puts>:
~$ ls -la /lib/i386-linux-gnu/libc.so.6
lrwxrwxrwx 1 root root 12 Jan 9 04:28 /lib/i386-linux-gnu/libc.so.6 -> libc-2.19.so
~$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
620: 00040190 56 FUNC GLOBAL DEFAULT 12 __libc_system@@GLIBC_PRIVATE
~$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep IO_puts
203: 00065650 421 FUNC GLOBAL DEFAULT 12 _IO_puts@@GLIBC_2.0
~$ ls -l /lib/i386-linux-gnu/libc-2.19.so
-rwxr-xr-x 1 root root 1754876 May 26 2016 /lib/i386-linux-gnu/libc-2.19.so
マシン2:
~$ objdump -d /lib/i386-linux-gnu/libc.so.6 | grep system
00040310 <__libc_system>:
~$ objdump -d /lib/i386-linux-gnu/libc.so.6 | grep "IO_puts>"
000657e0 <_IO_puts>:
~$ ls -la /lib/i386-linux-gnu/libc.so.6
lrwxrwxrwx 1 root root 12 Jan 9 04:28 /lib/i386-linux-gnu/libc.so.6 -> libc-2.19.so
~$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
620: 00040310 56 FUNC GLOBAL DEFAULT 12 __libc_system@@GLIBC_PRIVATE
~$ readelf -s /lib/i386-linux-gnu/libc.so.6 | grep IO_puts
203: 000657e0 421 FUNC GLOBAL DEFAULT 12 _IO_puts@@GLIBC_2.0
~$ ls -l /lib/i386-linux-gnu/libc-2.19.so
-rwxr-xr-x 1 root root 1754876 Feb 25 2015 /lib/i386-linux-gnu/libc-2.19.so
ここへの洞察力は大変感謝いたします。ありがとうございます!
答え1
同じバージョンのlibcには同じオフセットがあります。
近いですが、正確ではありません。すべてのライブラリの同じバージョンできる同じ最適化ルーチンを使用し、同じプラットフォームをターゲットにして、命令セット拡張に同じ規則を使用して同じコンパイラーでコンパイルした場合は、同じオフセットを持ちます。たとえば、あるオペレーティングシステム管理者がgccバージョン5.4を使用してlibcをコンパイルし、別のオペレーティングシステム管理者がgccバージョン6.3を使用し、別の管理者がclangを使用している場合はオフセット一致がない可能性があります。
共有オブジェクト(.so)は動的にリンクされた位置に依存しないコードなので、内部的に違いはありません。リンクライブラリから呼び出された関数は期待どおりに実行する必要があります。
一方、同じCPU構成を使用する2つのVMに同じリポジトリから事前に構築されたlibcをインストールした場合は、追加の調査が必要だと思います。