간혹 CTF 문제 중에 특정 버전의 라이브러리로 elf 파일을 실행시켜야 하는 경우가 있다.
이를 위한 libc
를 변경하는 방법에 대해서 알아보자.
바이너리를 지정하여 라이브러리 설정을 알아서 변경시켜주는 도구이다.
다음 git page에서 확인할 수 있다.
patchelf 설치는 git page에서 확인하면 되지만
선행적으로 설치되있어야 하는 패키지는 나와있지 않다.
다음의 패키지가 설치되어 있어야 한다.
#apt install autoconf
#apt install libtool
다음과 같은 명령어로 라이브러리를 지정할 수 있다.
#patchelf --set-interpreter /lib/my-ld-linux.so.2 --set-rpath /opt/my-libs/lib:/other-libs my-program
--set-interpreter
는 사용할 libc
를 지정하는 옵션이다.
--set-rpath
는 라이브러리 경로를 지정하는 옵션이다.
만약 하나의 libc
파일이 아니라 여러개의 라이브러리 파일을 로드시켜야 한다면?
다음의 파일들을 로드시켜야 된다고 가정하자.
ld-2.31.so libc-2.31.so libseccomp.so.2
이럴 경우, 모든 파일을 원하는 경로 ./lib/
에 저장한 후에
set-rpath
로 ./lib/
을 설정해주고
--set-interpreter
를 이용하여 libc-2.31.so
를 지정해주면 된다.
#mv * lib
#patchelf --set-interpreter lib/linux-2.31.so --set-rpath lib my-program
리눅스에서 제공하는 built-in 명령어를 이용한 방법이다.
일단 내가 했을 때는 되지 않았다.
하지만 참고용으로 남겨놓는다.
/work/lib/
가 로드시킬 라이브러리의 경로라고 하자.
이 경로를 설정에 추가해주어야 한다.
/etc/ld.so.conf.d/
아래에 my.conf
를 생성하고
내용으로 /work/lib/
을 저장하자.
그리고 다음의 명령어를 실행한다.
#ldconfig
LD_LIBRARY_PATH
에 라이브러리 경로를 또다시 등록해야 한다.
export LD_LIBRARY_PATH=/work/lib/
그리고 확인을 해보면 불러오는 라이브러리의 경로가 바뀌어 있다.
#ldd bin
#unset LD_LIBRARY_PATH
환경변수를 이용한 방법이다.
다음의 명령어 형태로 쉘 상에서 입력하면 된다.
LD_PRELOAD='/work/lib/libc-2.23.so' ./test
https://stackoverflow.com/questions/847179/multiple-glibc-libraries-on-a-single-host