CTF/CTF_Configuration

바이너리에 ld와 libc 새로 링킹하기 (D_PRELOAD=./libc.so.6 segfault 뜰때 해결하기)

JUNFUTURE 2022. 2. 19. 13:23

CTF문제에서 libc파일을 제공해줬을때, 이와 같은 명령어로

바이너리를 실행시킬때 내가 원하는 라이브러리가 로드되게 할 수 있다.

(LD_PRELOAD는 변수로 설정된 라이브러리를 먼저 로딩시켜주는 환경변수이다.)

LD_PRELOAD=./libc.so.6 ./bypass_valid_vtable

이때 이 명령어가 segfault가 뜨는 경우가 있는데, 이걸 해결하는 방법을 적어보고자한다.

 

문제는 원하는 라이브러리가 로딩은 되었으나, 바이너리 내부에 연결(링킹)되어 있는 libc와 ld는 이와 다르기 때문에 발생한다.

이에 바이너리에 링킹된 libc와 ld도 우리가 원하는 버전으로 맞춰줘야한다.

 

https://github.com/NixOS/patchelf

 

GitHub - NixOS/patchelf: A small utility to modify the dynamic linker and RPATH of ELF executables

A small utility to modify the dynamic linker and RPATH of ELF executables - GitHub - NixOS/patchelf: A small utility to modify the dynamic linker and RPATH of ELF executables

github.com

patchelf라는 도구를 이용할꺼다.

 

1. 원하는 libc ld 구하기

libc 구하기

libc파일은 CTF문제에서 제공해주었을 수도 있고, libc leak 등을 통해 offset을 알아내 원하는 버전을 다운받을 수 있다.

아래 사이트를 이용해 다운 받으면 된다.

http://ibc.blukat.me/

 

자세한 내용은 아래 링크에 나와있다.

https://juntheworld.tistory.com/77?category=983750 

 

libc 버전 찾기/버전 별로 다운로드하기 (libc_database 사용법, libc.blukat.me 사용법)

서론 CTF 문제를 풀다보면 리눅스의 공유 라이브러리 libc.xx.so 파일들이 필요할때가 있다. (PLT/GOT를 배우고, NX bit를 배워 스택영역에서 코드를 실행할 수 없을때) (이를 위해 라이브러리 파일을 이

juntheworld.tistory.com

 

 

ld 구하기

ld는 libc를 먼저 구한 뒤, 아래의 링크에서 해당하는 libc에 따른 ld를 구하면 된다.

검색을 libc 파일의 md5 해시값으로 진행한다.

리눅스 기본 명령어로 다음과 같이 해시값을 구할 수 있다.

md5sum [파일이름]

welpwn/PwnContext/libs/ld.so at master · matrix1001/welpwn

 

GitHub - matrix1001/welpwn: 💖CTF pwn framework.

💖CTF pwn framework. Contribute to matrix1001/welpwn development by creating an account on GitHub.

github.com

 

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

 

[Pwnable] libc 주어졌을 때 바이너리에 링킹 & 디버깅 (when LD_PRELOAD making segmenation fault)

- 보통 문제에서 elf, libc 가 주어짐 - 익스하는 os 의 libc 버전과 문제에서 준 libc 버전이 안맞아서 LD_PRELOAD 걸어도 segmentation fault 뜨는 경우 있음 1. 주어진 libc 에 대응되는 custom loader 가 추가..

typemiss.tistory.com