LINUX] Specific libc

노션으로 옮김·2020년 4월 15일
1

Study

목록 보기
20/33
post-thumbnail

개요

간혹 CTF 문제 중에 특정 버전의 라이브러리로 elf 파일을 실행시켜야 하는 경우가 있다.

이를 위한 libc를 변경하는 방법에 대해서 알아보자.


patchelf

바이너리를 지정하여 라이브러리 설정을 알아서 변경시켜주는 도구이다.

다음 git page에서 확인할 수 있다.

https://github.com/NixOS/patchelf

설치

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

ldconfig

리눅스에서 제공하는 built-in 명령어를 이용한 방법이다.

일단 내가 했을 때는 되지 않았다.
하지만 참고용으로 남겨놓는다.

1. 라이브러리 경로 지정

/work/lib/가 로드시킬 라이브러리의 경로라고 하자.

이 경로를 설정에 추가해주어야 한다.

/etc/ld.so.conf.d/ 아래에 my.conf를 생성하고

내용으로 /work/lib/을 저장하자.

그리고 다음의 명령어를 실행한다.

#ldconfig

2. 환경변수 등록

LD_LIBRARY_PATH에 라이브러리 경로를 또다시 등록해야 한다.

export LD_LIBRARY_PATH=/work/lib/

그리고 확인을 해보면 불러오는 라이브러리의 경로가 바뀌어 있다.

#ldd bin

3. 해제

#unset LD_LIBRARY_PATH

LD_PRELOAD

환경변수를 이용한 방법이다.

다음의 명령어 형태로 쉘 상에서 입력하면 된다.

LD_PRELOAD='/work/lib/libc-2.23.so' ./test

참조

https://stackoverflow.com/questions/847179/multiple-glibc-libraries-on-a-single-host

https://d4m0n.tistory.com/119

0개의 댓글