CTF문제에서 libc파일을 제공해줬을때, 이와 같은 명령어로
바이너리를 실행시킬때 내가 원하는 라이브러리가 로드되게 할 수 있다.
(LD_PRELOAD는 변수로 설정된 라이브러리를 먼저 로딩시켜주는 환경변수이다.)
LD_PRELOAD=./libc.so.6 ./bypass_valid_vtable
이때 이 명령어가 segfault가 뜨는 경우가 있는데, 이걸 해결하는 방법을 적어보고자한다.
문제는 원하는 라이브러리가 로딩은 되었으나, 바이너리 내부에 연결(링킹)되어 있는 libc와 ld는 이와 다르기 때문에 발생한다.
이에 바이너리에 링킹된 libc와 ld도 우리가 원하는 버전으로 맞춰줘야한다.
https://github.com/NixOS/patchelf
patchelf라는 도구를 이용할꺼다.
1. 원하는 libc ld 구하기
libc 구하기
libc파일은 CTF문제에서 제공해주었을 수도 있고, libc leak 등을 통해 offset을 알아내 원하는 버전을 다운받을 수 있다.
아래 사이트를 이용해 다운 받으면 된다.
자세한 내용은 아래 링크에 나와있다.
https://juntheworld.tistory.com/77?category=983750
ld 구하기
ld는 libc를 먼저 구한 뒤, 아래의 링크에서 해당하는 libc에 따른 ld를 구하면 된다.
검색을 libc 파일의 md5 해시값으로 진행한다.
리눅스 기본 명령어로 다음과 같이 해시값을 구할 수 있다.
md5sum [파일이름]
welpwn/PwnContext/libs/ld.so at master · matrix1001/welpwn
2. patchelf 다운 및 사용법
설치
sudo apt install patchelf
ld 링킹
patchelf --set-interpreter [ld파일] [대상바이너리]
libc 링킹
patchelf --replace-needed libc.so.6 [libc파일] [대상바이너리]
바이너리에 링킹된 ld libc 확인 (바이너리의 라이브러리 의존성 확인)
ldd [대상바이너리]
완료
프로그램이 잘 실행된다.
참고
링킹된 libc와 lid 확인
ldd ./[바이너리 이름]
ldd ./app
아래의 링크를 참고하여 작성했다.
https://typemiss.tistory.com/2
'CTF > CTF_Configuration' 카테고리의 다른 글
CTF pwnable 환경구성을 위한 쉘코드 (pwnable_conf.sh) (0) | 2022.02.27 |
---|---|
Dockerfile 주어졌을때 CTF Configuration 정리 & ARM Cross Compile 및 ARM 바이너리 gdb 디버깅 하는법 (0) | 2022.02.26 |
CTF-pwnable용 Docker 설치 및 사용법 (0) | 2022.02.16 |
main_arena offset 구하기 (0) | 2022.02.09 |
ROPgadget 사용법 (ROP 가젯 찾는법, 리턴가젯 찾아주는 프로그램) (0) | 2022.02.09 |