요즘 포너블 문제를 풀어보고 있는데, 라이브러리가 제공되는 경우가 있다. 문제가 함수 주소를 계산해서 쉘의 획득을 요구하는 문제였다면 라이브러리의 버전이 상관없다. 하지만 heap과 관련된 문제라면 버전의 따라 패치가 된 취약점들이 존재하기 때문에 문제를 못 풀어보는 경우가 생긴다. (물론, 가능하다면 전에 포스팅한 것과 같이 문제를 해결한 경우도 있다. / HITCON Training Lab 12). 이 글에서는 내가 삽질해서 해결한 방법을 올린다.
원래 내 서버환경은 Ubuntu 20.04 버전으로 문제를 풀고 있었다. 그러던 중, 라이브러리를 바꿔서 바이너리를 실행하고 싶어서 방법을 찾아봤다. 처음엔 해당 링크에 있는 방법으로 해봤다. 하지만 에러 메세지가 출력되면서 모든 실행파일이 먹통이 되었다. 에러 메세지를 보니, "'glibc 2.30' 문자열을 찾을 수 없어서 실행할 수 없다." 이런 느낌이여서 뭔가 리눅스 커널 자체에서 알맞은 libc 버전을 실행하지 않으면 필터링하는 것 같았다. Ubuntu 20.04 에서도 가능한 방법을 찾다가 결국엔, OS 자체를 바꿨다. (Vultr에서 가상호스팅을 했기 때문에 클릭 몇 번으로 손쉽게 변경할 수 있다.)
처음엔 Ubuntu 16.04로 설치했는데, 이번에는 Python 버전 문제 때문에 원하는대로 실행이 되질 않아, Ubuntu 18.04로 다시 설치했다. 16.04에서는 이미 업데이트가 중지된 Python 2 버전이 기본으로 설정되어 있어서 지울려고 하다가 생각처럼 안되고 오히려 꼬여버려서 18.04로 설치했다. 해당 환경에서는 LD_PRELOAD를 설정하여 문제에서 제공받은 라이브러리를 사용했다. (이 방법은, Ubuntu 20.04에서 불가능하다.)
p = process('[binary]', env={"LD_PRELOAD":"library"})
이렇게하면 문제에서 제공받은 라이브러리를 참조하여 바이너리가 실행된다. 하지만, pwndbg의 heap 관련 명령어를 사용할 수 없었다. 큰 문제는 아니지만, 공부하는 입장에서 한눈에 힙의 구조를 파악하여 취약점이 왜 발생하는지 더 쉽게 이해하는데 어려움이 있었다. 그래서 이 방법도 해결하기 위해서 검색했다. (링크)
libc6-dbg 패키지를 버전에 맞게 설치하고, 원하는 디렉터리에 압축을 풀어준다.
dpkg -x [libc6-dbg pkg .deb file] [extract directory]
그리고 gdb를 실행할 때, -q 옵션을 붙이면 안된다. (계속 해봤는데 안되서 구글링하니 옵션을 붙이면 안된다고 한다.) 실행하고 다음 명령어를 입력한다.
set debug-file-directory ~/a/usr/lib/debug/lib/x86_64-linux-gnu/
위와 같이 디버그 파일 디렉터리를 아까 압축해제한 디레터리 중 usr/lib/debug/lib/x86_64-linux/gnu/ 으로 설정한다. 그러면 정상적으로 디버깅할 수 있다.
'ETC' 카테고리의 다른 글
GitHub PR in other branch (0) | 2024.04.25 |
---|---|
병무청 병역의무부과 통지서 분석 (0) | 2022.08.16 |
Challenges at LINE as a security engineer 리뷰 (0) | 2021.08.30 |