这是一个 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,那么我认为它需要进一步调查。