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