system hacking

드림핵 라이브러리 주소 알아내는 방법, 특정 라이브러리를 로드하는 방법

24kg0ld 2024. 7. 3. 18:45

내 컴퓨터(local)에 있는 파일에 process로 실행할 때 안 될 경우

드림핵 라이브러리와 관련된 문제를 풀 때, 제대로 된 익스플로잇 코드를 짰음에도 오류가 생기는 경우는 라이브러리의 버전이나 주소 문제일 수 있다.
라이브러리 파일의 주소는 gdb에 vmmap을 치면 알아낼 수 있다.

0x601000           0x602000     0x1000     0x1000 /workspace/C/drop/rop
      0x7ffff7dc9000     0x7ffff7deb000    0x22000        0x0 /usr/lib/x86_64-linux-gn
u/libc-2.31.so
      0x7ffff7deb000     0x7ffff7f63000   0x178000    0x22000 /usr/lib/x86_64-linux-gn
u/libc-2.31.so
      0x7ffff7f63000     0x7ffff7fb1000    0x4e000   0x19a000 /usr/lib/x86_64-linux-gn
u/libc-2.31.so
      0x7ffff7fb1000     0x7ffff7fb5000     0x4000   0x1e7000 /usr/lib/x86_64-linux-gn
u/libc-2.31.so
      0x7ffff7fb5000     0x7ffff7fb7000     0x2000   0x1eb000 /usr/lib/x86_64-linux-gn
u/libc-2.31.so
      0x7ffff7fb7000     0x7ffff7fbd000     0x6000

위와 같이 나오면 라이브러리 파일의 주소가 /usr/lib/x86_64-linux-gnu/libc-2.31.so 임을 알 수 있다.
pwntools 코드에 libc = ELF('/usr/lib/x86_64-linux-gnu/libc-2.31.so')라고 입력하면 오류 없이 실행된다.

내 컴퓨터에 있는 파일에는 잘 되지만 서버에서 안 될 경우

이런 경우 서버에서 사용하는 라이브러리의 버전을 알아내야 된다.
문제에 주어져 있지 않으면 버전을 알아낼 방법을 찾아봐야 된다.

오류 원인

서버에 익스플로잇 할 경우 주어진 위치에 있는 라이브러리와 링킹을 하도록 설정되어 있지만, 로컬에서 실행할 경우 로컬의 환경에 따라 자동으로 로컬에 있는 라이브러리 중 하나가 링킹 되는 것 같다. 그렇기 때문에 gdb로 직접 실행을 한 후 vmmap으로 어떤 주소의 라이브러리와 링킹되었는 지 확인하고 익스플로잇을 하는 것이 좋아 보인다.

특정 라이브러리를 로드 하는 방법

$ export LD_PRELOAD=$(realpath ./libc-2.27.so)라는 명령어를 실행하면 특정 라이브러리를 미리 로드하도록 지정할 수 있다.
해제 방법
unset LD_PRELOAD