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

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

这是一个 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

这里的任何见解将不胜感激。谢谢!

答案1

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

接近,但不完全是。任何库的相同版本可以如果由相同的编译器编译、使用相同的优化例程、针对相同的平台、在指令集扩展上使用相同的规则,则具有相同的偏移量。例如,如果一个操作系统维护者使用 gcc 版本 5.4 编译 libc,另一个使用 gcc 版本 6.3,另一个使用 clang,则完全有可能没有偏移量匹配。

由于共享对象 (.so) 是动态链接的位置无关代码,因此在幕后没有任何区别:从已链接的库调用的函数应该按预期运行。

另一方面,如果您在具有相同 CPU 配置的 2 个虚拟机上安装了来自同一存储库的预构建 libc,那么我认为它需要进一步调查。

相关内容