Glibc

相同 libc 版本的不同函式偏移量

  • January 10, 2017

這是一個 pwnage 挑戰。我有兩個虛擬機。兩者都在執行 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

這裡的任何見解將不勝感激。謝謝!

相同版本的 libc 具有相同的偏移量

關閉,但不完全。如果由相同的編譯器、使用相同的優化常式、針對相同的平台、使用相同的指令集擴展規則編譯,則任何庫的相同版本**可能具有相同的偏移量。**因此,例如,如果一個作業系統維護者使用 gcc 5.4 版編譯 libc,另一個使用 gcc 6.3 版,另一個使用 clang,則完全有可能沒有偏移量匹配。

由於共享對象 (.so) 是動態連結的與位置無關的程式碼,因此在底層沒有區別:從已連結的庫中呼叫的函式應該按預期執行。

另一方面,如果您在具有相同 CPU 配置的 2 台虛擬機上安裝了來自相同儲存庫的預建構 libc,那麼我會說它需要進一步調查。

引用自:https://unix.stackexchange.com/questions/336331