동일한 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개의 VM에 동일한 저장소에서 사전 빌드된 libc를 설치한 경우 추가 조사가 필요하다고 생각합니다.

관련 정보