포스트

libc/ld 디버깅 심볼 받아오기

워게임/CTF를 풀 때 제공된 Dockerfile로 환경을 구성한 후 꺼낸 glibc는 디버깅 심볼이 포함되어 있지 않은 경우가 많다.
예를 들어, 아래 사진처럼 __printf_function_table과 같은 심볼이 존재하지 않아 오프셋을 알아내기 힘들다.

그럴 때는 우선 꺼내온 libc를 실행해보면 버전 정보를 알 수 있으며, file 명령어로 확인해보면 BuildID 해시 정보를 볼 수 있다.

  • 버전은 GLIBC 2.31-0ubuntu9.17 (amd64)
  • 해시는 0323ab4806bee6f846d9ad4bccfc29afdca49a58

이 정보를 가지고, 구글에 다음과 같이 검색한 후 파일을 다운로드받는다.
libc6-dbg_2.31-0ubuntu9.17_amd64.deb

파일을 다운로드받았다면, 다음 명령어를 활용하여 패키지 내용물을 압축해제한다.
dpkg -x libc6-dbg_2.31-0ubuntu9.17_amd64.deb ./

압축 해제가 완료되면, <경로>/usr/lib/debug/.build-id 내에 다음과 같은 폴더들이 있는 것을 볼 수 있다.

어디에 들어가야하나 싶겠지만, 아까 확인했던 BuildID 해시가 “03”으로 시작하므로 03에 들어가면 된다.

BuildID 해시가 0323ab4806bee6f846d9ad4bccfc29afdca49a58이었으므로, “03” 뒷부분인 “23ab4806bee6f846d9ad4bccfc29afdca49a58.debug”가 우리가 찾던 디버깅 심볼이 포함된 libc 바이너리이다.

이를 gdb로 열고, 심볼을 찾아보면 잘 나오는 것을 확인할 수 있다.

ld 역시 동일한 방법으로 찾을 수 있다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

"Linux" 카테고리의 게시물