Retrowrite는 X64 및 AARCH64의 정적 이진 재 작성자입니다. 휴리스틱없이 작동하며 오버 헤드를 도입하지 않으며 기호 기술 ( 재전축 가능한 어셈블리 라고도 함)을 사용하여 소스 코드없이 바이너리에 계측을 삽입합니다.
X64 버전과 ARM64 버전은 다른 다시 쓰기 알고리즘을 사용하고 다른 기능 세트를 지원합니다.
기술적 인 자세한 내용은 X64 버전의 용지 ( IEEE S & P'20 )와 ARM64 버전 의이 논문을 읽을 수 있습니다.
Kretrowrite는 Linux 커널 모듈의 재 작성을 지원하는 X64 버전의 변형입니다.
Retrowrite는 Python3 (3.6)에서 구현됩니다. 그것은 pyelftools 와 capstone 에 따라 다릅니다. 종속성을 설치하려면 실행하십시오.
pip install - r requirements . txt배포판 패키지 관리자의 종속성을 구식으로 설치하는 것이 좋습니다.
| Retrowrite-x64 | Retrowrite-Aarch64 | |
|---|---|---|
| 박탈 된 바이너리 | (WIP) | ✅ |
| 비 파이 바이너리 | ✅ | |
| 비표준 컴파일러 | ✅ | |
| 오버 헤드 제로 | ✅ | ✅ |
| 커널 모듈 지원 | ✅ | |
| AFL 커버리지 계측 | ✅ | ✅ |
| ASAN 악기 | ✅ | ✅ |
| C ++ 지원 | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose output retrowrite -m <pass> 로 적용하려는 계측 패스를 선택하면 폴더 rwtools_x64 및 rwtools_arm64 에서 사용 가능한 계측 패스를 찾을 수 있습니다.
x64에 사용 가능한 계측 패스 : - 주소 사료 -AFL 커버 지 정보
AARCH64 용으로 사용 가능한 계측 패스 : - 주소 사료 - AFL 커버 지 정보 + 포커버 - 기능 항목에 대한 거친 곡물 제어 흐름 무결성
retrowrite --asan </path/to/binary/> </path/to/output/binary>
참고 : X64 인 경우 바이너리가 위치 독립적이고 제거되지 않은지 확인하십시오. file 명령을 사용하여 확인할 수 있습니다 (출력은 ELF shared object 말해야합니다).
예를 들어 /bin/ls 의 계측 버전을 만듭니다.
retrowrite --asan /bin/ls ls-basan-instrumented.s
이렇게하면 어셈블리 ( .s ) 파일이 생성됩니다. 어셈블리를 이진으로 다시 컴파일하려면 아키텍처에 따라 다릅니다.
생성 된 어셈블리는 다음과 같은 모든 컴파일러를 사용하여 조립하고 연결할 수 있습니다.
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
디버그 디버그 undefined reference to `__asan_init_v4' 오류를받지 못하는 경우, 어셈블리 파일에서 "asan_init_v4" sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s 다음 명령이 도움이 될 수 있습니다.
AARCH64에서는 표준 컴파일러에 의존하여 조립 및 링크를 사용하지만 컴파일러 플래그 수집은 약간 더 관련되어 있으므로 다음을 수행하기 위해 메인 retrowrite 실행 파일의 -a 스위치를 제공합니다.
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
AFL에 의한 이진을 생성하려면, 먼저 상기 기술 된 바와 같이 상징화 된 어셈블리를 생성한다. 그런 다음 AFL ++에서 afl-gcc 로 상징화 된 어셈블리를 다시 컴파일하십시오.
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
또는 afl-clang .
적용 범위 정보가 포함 된 이진을 기기하려면 retrowrite -m coverage <input file> <output asm> . retrowrite -a <output asm> <new binary> 로 바이너리를 다시 조정하십시오.
이진은 이제 다음과 같이 퍼지 될 수 있습니다.
afl-fuzz -i < seed folder > -o < out folder > < new binary > Retrowrite는 또한 AFL의 포크 스커버 역할을하는 계측을 추가하려고합니다. 이것이 문제를 일으키는 경우 export AFL_NO_FORKSERVER=1 사용 하여이 동작을 비활성화 할 수 있습니다.
손으로 수정하거나 기존 도구로 후 처리 할 수있는 상징화 된 어셈블리를 생성하려면 계측기 패스를 지정하지 마십시오.
retrowrite </path/to/binary> <path/to/output/asm/files>
출력 ASM 파일은 손 또는 기타 도구로 자유롭게 편집 할 수 있습니다. 수정 후, ASM 파일은 위에서 설명한대로 작동하는 바이너리로 조립 될 수 있습니다.
Retrowrite는 다른 도구와 상호 운용 할 수 있지만 연구원들은 이진 계측 / 수정 요구에 Retrowrite API를 사용하도록 강력히 권장합니다! 이를 통해 바이너리 또는 조립 파일을로드하고 구문 분석 해야하는 추가 노력이 절약됩니다.
실행 setup.sh :
./setup.sh kernelvirtualenv (저장소의 루트에서) 활성화 :
source retro/bin/activate(보너스) retrowrite를 완료 할 때 virtualenv를 종료하려면 :
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> 퍼징 캠페인은 퍼지/ 폴더를 참조하십시오.
일반적으로 librw/ 이진의 로딩, 분해 및 상징화를위한 코드를 포함하며 모든 변환의 핵심을 형성합니다. 바이너리 전용 주소 소독제 (BASAN)와 같은이 다시 쓰기 프레임 워크를 구축하는 개별 변환 패스는 rwtools/ 의 개별 도구로 포함됩니다.
k 로 시작하는 파일과 폴더는 커널 Retrowrite 버전과 연결되어 있습니다.
데모/폴더에는 사용자 공간 및 커널 Retrowrite (Demos/User_demo 및 Demos/Kernel_demo)에 대한 예제가 있습니다.
다음 간행물은 Retrowrite 프로젝트의 다른 부분을 다룹니다.
RETROWRITE : 정적으로 계산 된 침대 바이너리는 퍼지 및 살균을위한 바이너리 , Sushant Dinesh, Nathan Burow, Dongyan Xu 및 Mathias Payer. 오클랜드 20 : IEEE International Symposium on Security and Privacy, 2020
출처 없음, 문제 없습니다! 고속 바이너리 퍼지 마테오 리조 및 Mathias Payer. 36C3'19 : Chaos Communication Congress, 2019
MIT 라이센스
Copyright (C) 2019 Hexhive Group, Sushant Dinesh [email protected], Luca di Bartolomeo [email protected], Antony Vennard [email protected], matteo rizzo [email protected], Mathias Payer [email protected].
이에 따라이 소프트웨어 및 관련 문서 파일 ( "소프트웨어")의 사본을 얻는 사람에게는 허가가 부여됩니다. 소프트웨어의 사용, 복사, 수정, 합병, 배포, 배포, 숭고 및/또는 소프트웨어의 사본을 판매 할 권한을 포함하여 제한없이 소프트웨어를 처리 할 수 있도록 소프트웨어를 제공 할 권한이 없습니다.
위의 저작권 통지 및이 권한 통지는 소프트웨어의 모든 사본 또는 실질적인 부분에 포함되어야합니다.
이 소프트웨어는 상업성, 특정 목적에 대한 적합성 및 비 침해에 대한 보증을 포함하여 명시 적 또는 묵시적 보증없이 "그대로"제공됩니다. 어떠한 경우에도 저자 또는 저작권 보유자는 계약, 불법 행위 또는 기타, 소프트웨어 또는 소프트웨어의 사용 또는 기타 거래에서 발생하는 계약, 불법 행위 또는 기타의 행동에 관계없이 청구, 손해 또는 기타 책임에 대해 책임을지지 않습니다.