Offset de função diferente para a mesma versão libc

1

Isto é para um desafio de pwnage. Eu tenho duas máquinas virtuais. Ambos estão executando o glibc 2.19. Mas, quando analiso o offset da função em ambos, é diferente em ambos.

Como eu sei, a mesma versão libc tem os mesmos deslocamentos. Eu procurei pela net, mas não encontrei nenhuma resolução convincente. Abaixo estão os detalhes em duas máquinas:

Máquina 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

Máquina 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

Qualquer insight aqui será apreciado. Obrigado!

    
por swatilaxmi28 10.01.2017 / 15:44

1 resposta

2

same version libc have same offsets

Fechar, mas não completamente. A mesma versão de qualquer biblioteca poderia ter os mesmos deslocamentos se compilada pelo mesmo compilador, usando as mesmas rotinas de otimização, visando a mesma plataforma, usando as mesmas regras nas extensões do conjunto de instruções. Então, por exemplo, se um mantenedor do sistema operacional compila a libc com o gcc versão 5.4, outro usa o gcc versão 6.3, e outro usa o clang, é inteiramente possível que nenhum deslocamento seja compatível.

Como objetos compartilhados (.so) são códigos independentes de posição vinculados dinamicamente, não faz diferença alguma: os recursos que são chamados de uma biblioteca que foi vinculada devem se comportar como esperado.

Por outro lado, se você instalou uma libc pré-construída a partir do mesmo repo em 2 VMs com configuração de CPU idêntica, então eu diria que ela tem mais investigação.

    
por 10.01.2017 / 16:20

Tags