진정한 계측 가능한 바이너리 에뮬레이션 프레임워크
Qiling은 고급 바이너리 에뮬레이션 프레임워크로, 다음과 같은 기능을 제공합니다:
Qiling은 또한 다양한 국제 컨퍼런스에 소개되었습니다.
2022:
2021:
2020:
2019:
Qiling은 Unicorn Engine을 기반으로 합니다.
자세한 내용은 웹사이트를 방문하세요.
이 프로그램은 자유 소프트웨어입니다; 자유 소프트웨어 재단에서 발표한 GNU General Public License 버전 2 또는 (선택에 따라) 이후 버전의 조건에 따라 재배포 및/또는 수정할 수 있습니다.
많은 오픈 소스 에뮬레이터가 있지만, Qiling에 가장 가까운 두 프로젝트는 Unicorn과 QEMU 사용자 모드입니다. 이 섹션에서는 Qiling과 이들 간의 주요 차이점을 설명합니다.
Unicorn 위에 구축되었지만, Qiling과 Unicorn은 완전히 다른 개념입니다.
QEMU 사용자 모드는 우리의 에뮬레이터와 유사한 작업, 즉 크로스 아키텍처 방식으로 전체 실행 가능한 바이너리를 에뮬레이션합니다. 그러나 Qiling은 QEMU 사용자 모드와 비교하여 몇 가지 중요한 차이점을 제공합니다:
Qiling Framework 설치 방법은 설정 가이드 파일을 참조하세요.
아래 예제는 Windows 실행 파일을 에뮬레이션하는 가장 간단한 방법으로 Qiling 프레임워크를 사용하는 방법을 보여줍니다.
from qiling import Qiling
if __name__ == "__main__":
# Qiling 인스턴스 초기화, 에뮬레이션할 실행 파일과 에뮬레이션된 시스템 루트 지정.
# 현재 작업 디렉토리는 Qiling 홈 디렉토리로 가정합니다.
ql = Qiling([r'examples/rootfs/x86_windows/bin/x86_hello.exe'], r'examples/rootfs/x86_windows')
# 에뮬레이션 시작
ql.run()
from qiling import Qiling
def force_call_dialog_func(ql: Qiling):
# 현재 스택 프레임에서 DialogFunc 주소 가져오기
lpDialogFunc = ql.stack_read(-8)
# DialogFunc를 위한 스택 메모리 설정
ql.stack_push(0)
ql.stack_push(1001) # IDS_APPNAME
ql.stack_push(0x111) # WM_COMMAND
ql.stack_push(0)
# 리턴 주소 푸시
ql.stack_push(0x0401018)
# DialogFunc 주소에서 에뮬레이션 재개
ql.arch.regs.eip = lpDialogFunc
if __name__ == "__main__":
# Qiling 인스턴스 초기화
ql = Qiling([r'rootfs/x86_windows/bin/Easy_CrackMe.exe'], r'rootfs/x86_windows')
# 일부 코드를 NOP 처리
ql.patch(0x004010B5, b'\x90\x90')
ql.patch(0x004010CD, b'\x90\x90')
ql.patch(0x0040110B, b'\x90\x90')
ql.patch(0x00401112, b'\x90\x90')
# 콜백으로 특정 주소에 후크
ql.hook_address(force_call_dialog_func, 0x00401016)
ql.run()
아래 YouTube 동영상은 위 예제가 작동하는 방식을 보여줍니다.
Qiling Framework는 ARM 라우터의 /usr/bin/httpd를 x86_64 Ubuntu 호스트에서 핫 패치하고 에뮬레이션합니다.
이 동영상은 Qiling의 IDA Pro 플러그인이 IDA Pro를 Qiling 계측 엔진과 함께 실행할 수 있게 하는 방법을 보여줍니다.
Qiling Framework와 IDA Pro를 사용하여 간단한 CTF 챌린지 풀기
Qiling Framework가 MBR을 에뮬레이션합니다.
Qiling은 또한 qltool이라는 친숙한 도구를 제공하여 셸코드 및 실행 가능한 바이너리를 빠르게 에뮬레이션할 수 있습니다.
qltool을 사용하면 간편하게 실행할 수 있습니다:
셸코드 사용:
$ ./qltool code --os linux --arch arm --format hex -f examples/shellcodes/linarm32_tcp_reverse_shell.hex
바이너리 파일 사용:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --rootfs examples/rootfs/x8664_linux/
GDB 디버거 활성화와 함께 바이너리 사용:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --gdb 127.0.0.1:9999 --rootfs examples/rootfs/x8664_linux
코드 커버리지 수집과 함께 사용 (현재는 UEFI만 지원):
$ ./qltool run -f examples/rootfs/x8664_efi/bin/TcgPlatformSetupPolicy --rootfs examples/rootfs/x8664_efi --coverage-format drcov --coverage-file TcgPlatformSetupPolicy.cov
JSON 출력과 함께 사용 (주로 Windows):
$ ./qltool run -f examples/rootfs/x86_windows/bin/x86_hello.exe --rootfs examples/rootfs/x86_windows/ --console False --json
웹사이트 https://www.qiling.io 에서 최신 정보를 확인하세요.
이메일 [email protected], Twitter @qiling_io를 통해 연락주세요.
CREDITS.md를 참조하세요.