rosieblue
article thumbnail
728x90

_rtld_global 관련 워게임을 풀다가 이건 다른 문제 풀이에도 많이 쓰일 것 같아서 포스트를 하나 더 작성한다.
 
예를 들어 _rtld_global의 주소를 우리가 릭 했다고 해도, 이 구조체 안 멤버 변수들 간의 오프셋이 궁금할 수가 있다.
이때 이 오프셋은 glibc나 우분투 버전 등에 의해 다를 수 있는데 이런 경우 공격 환경과 동일한 버전의 디버깅 심볼을 다운로드 한 후 gdb로 오프셋을 구할 수 있다.
 

1. 먼저 라이브러리 버전 및 ld 버전을 안 상태에서 glibc 버전을 구할 수 있다

 

일단 libc와 ld 버전이 뭔지 알고 있다는 상태 가정

 
이상태 그대로 libc-2.27.so를 실행해보자

ld 버전과 안 맞는다는 오류가 뜬다

libc를 실행하기 위해서는 ld 버전도 동일해야하는 것 같다. 위 주어진 ld-2.27.so랑 내 칼리에서 돌아가는 로더가 다르기 때문에 문제에서 주어진 ld-2.27.so로 로더를 변경해서 실행해야 한다. 
 
그러기 위해서는 patchelf 명령어를 실행해야한다. -> [Pwnable] 로더 파일 설정, patchelf 사용법 

 

[Pwnable] 로더 파일 설정, patchelf 사용법

로더 http://korea.gnu.org/manual/release/ld/ld-sjp/ld-ko_toc.html GNU 링커, LD 사용하기 - Table of Contents korea.gnu.org 바이너리가 사용하는 로더 종류와 내 컴퓨터 환경의 로더가 다른 경우 제대로 오프셋을 알아낼

hannahsecurity.tistory.com

 
 
pathelf로 라이브러리의 로더에 맞게 설정해주니 잘 뜬다

 
Ubuntu GLIBC 2.27-3ubuntu1을 사용한다고 한다. 해당 버전의 libc6-dbg 패키지를 다운받으면 된다.
 

gpt


구글에 libc6-dbg 2.27-3ubuntu1을 치면 나온다.

$ wget http://launchpadlibrarian.net/365856914/libc6-dbg_2.27-3ubuntu1_amd64.deb

다운 완료

 
다운이 제대로 되면 압축을 풀어준다

$ dpkg -x libc6-dbg_2.27-3ubuntu1_amd64.deb ./

 
이후 gdb로 아래 파일을 분석해서 오프셋을 알아낼 수 있다.

$ gdb usr/lib/debug/lib/x86_64-linux-gnu/ld-2.27.so

 

 

 

https://dreamhack.io/forum/qna/2132

profile

rosieblue

@Rosieblue

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!