
메모리 덤프에서 X 스크린샷을 추출하는 Volatility 플러그인
이 volatility 플러그인의 목표는 메모리 덤프에서 모든 열린 X 윈도우의 스크린샷을 추출하는 것입니다.
아담 브리지(Adam Bridge)가 구현한 volatility 플러그인 linux_xwindows(https://github.com/bridgeythegeek/linux_xwindows)는 X 서버의 데이터 구조를 탐색하여 X에 등록된 윈도우 객체에서 다양한 메타데이터를 추출합니다. 예를 들어, 각 윈도우에 대해 윈도우 좌표, 너비와 높이, 윈도우 식별자를 나열합니다. Adam의 README에 이에 대한 좋은 논의가 있으니, 관심이 있으시면 읽어보시길 권합니다!
참고로, X의 핵심 구조와 그 상호 의존성을 나타내는 그림을 아래에서 확인할 수 있습니다:

이 스크린샷을 추출하기 위해 X 서버 코드의 일부를 재사용합니다.
플러그인은 먼저 X 서버 메모리 매핑을 덤프합니다. 그런 다음 이 매핑들은 Adam의 플러그인 출력과 함께 C 프로그램(loader)에 입력으로 제공됩니다. 이 C 프로그램은 MAP_FIXED 플래그를 사용하여 Xorg의 메모리 매핑을 자신의 주소 공간에 mmap합니다. 이런 방식으로 Xorg의 주소 공간을 재현하여 코드와 데이터 간의 참조가 끊어지지 않도록 합니다. 그런 다음 로더는 Xorg 코드에 포함된 함수(compGetImage)를 호출하고 결과를 파일에 저장합니다. 우리는 정상 사용 중 X가 스크린샷 요청을 처리하는 방식을 살펴봄으로써 이 "마법의" 함수를 식별했습니다. 다행히도 struct _Screen이 이 함수에 대한 포인터를 포함하고 있기 때문에 이 함수는 항상 정확하게 찾을 수 있습니다.
이 접근 방식의 또 다른 좋은 점은 덤프 당시 화면이 잠겨 있거나 다른 창 뒤에 숨겨진 창의 스크린샷도 검색할 수 있다는 것입니다!
이 저장소를 클론한 후, 로더를 컴파일하세요:
gcc -Wall -o loader loader.c
플러그인을 사용하려면:
vol.py --plugins=$PWD/plugins/ --profile=XXX -f ./vbox.dmp linux_screenshot_xwindows --out-dir /tmp/xwds/
결과를 xwd에서 png로 변환하려면:
find /tmp/xwds/ -type f -name "*.xwd" -exec convert {} {}.png \;
다음 설정에서 성공적으로 스크린샷을 검색했습니다:
Ubuntu 14.04 LTS - X.Org X Server 1.15.1 (Release Date: 2014-04-13)
Ubuntu 16-04 LTS - X.Org X Server 1.18.4 (Release Date: 2016-07-19)
Debian 9 Testing - X.Org X Server 1.19.6 (Release Date: 2017-12-20)
Kubuntu 18.04 LTS - X.Org X Server 1.19.6 (Release Date: 2017-12-20)
몇 가지 임의적이지만 중요한 참고 사항:
처리 대상을 "그릴 수 있는" 이미지로 제한하기 위해 volatility 플러그인에서는 합리적인 크기의 이미지만 선택합니다.
이 도구는 Xorg가 소프트웨어 렌더링을 사용하는 경우에만 작동합니다. 물리적 머신에서는 일반적으로 그렇지 않지만, 우리가 테스트한 VirtualBox 머신에서는 기본적으로 사용되었습니다.
메모리 덤프에서 추출한 코드를 매끄럽게 실행하고 있다는 점을 잊지 마십시오. 공격자가 덤프를 변조하여 시스템에서 코드를 실행하는 것은 어렵지 않을 수 있습니다. 따라서 필요한 예방 조치를 취하십시오.
이 프로젝트는 2017년 가을 Eurecom에서 한 학기 프로젝트로 완료되었으며, 두 명의 Eurecom 학생인 Hamdi Ammar와 Ahmed Mkadem이 구현했습니다. Fabio Pagani와 Davide Balzarotti가 감독했습니다.