
리버스 엔지니어를 위한 트레이스 탐색기
Tenet은 IDA Pro 플러그인으로 실행 트레이스를 탐색하기 위한 도구입니다. 이 플러그인의 목표는 주어진 바이너리에 대해 실행 트레이스를 탐색할 수 있는 보다 자연스럽고 인간적인 제어 기능을 제공하는 것입니다. 이 작업의 기반은 소프트웨어에서 복잡한 실행 패턴을 검사하고 추출하는 새롭거나 혁신적인 방법을 연구하려는 열망에서 비롯되었습니다.
이 프로젝트에 대한 더 많은 맥락은 초기 출시에 관한 블로그 포스트를 참조하세요.
QIRA / geohot 외 여러분의 영감에 특별히 감사드립니다.
Tenet은 크로스 플랫폼(Windows, macOS, Linux) Python 3 플러그인입니다. 타사 종속성이 전혀 없어 코드가 이식 가능하고 설치가 쉽습니다.
디스어셈블러의 파이썬 콘솔에서 다음 명령을 실행하여 플러그인 디렉토리를 찾으세요:
import idaapi, os; os.path.join(idaapi.get_user_idadir(), "plugins")이 리포지토리의 /plugins/ 폴더 내용을 해당 디렉토리에 복사하세요.
디스어셈블러를 다시 시작하세요.
이 플러그인은 IDA 7.5 이상에서만 지원됩니다.
제대로 설치되면 디스어셈블러에 새로운 메뉴 항목이 나타납니다. 이를 사용하여 외부에서 수집한 실행 트레이스를 Tenet에 로드할 수 있습니다.
초기 릴리스이므로 Tenet은 간단한 사람이 읽을 수 있는 텍스트 트레이스만 허용합니다. 트레이스 형식, 제한 사항 및 참조 트레이서에 대한 추가 정보는 이 리포지토리의 tracing readme를 참조하세요.
Tenet을 사용하는 동안 플러그인은 활성 실행 트레이스에서 현재 위치를 기준으로 실행 흐름을 앞으로(파란색)와 뒤로(빨간색) 표시하는 흔적을 '그립니다'.
시간을 앞뒤로 step 하려면 디스어셈블러 오른쪽의 타임라인 위에 마우스를 올리고 스크롤 하기만 하면 됩니다. 함수 호출을 step over 하려면 스크롤하는 동안 SHIFT를 누르세요.
트레이스 타임라인은 디스어셈블러 오른쪽에 도킹됩니다. 이 위젯은 트레이스 타임라인을 따라 다양한 유형의 이벤트를 시각화하고 위에서 설명한 대로 기본 탐색을 수행하는 데 사용됩니다.
타임라인을 클릭하고 드래그 하여 실행 트레이스의 특정 섹션을 확대할 수 있습니다. 이 작업은 원하는 세분성에 도달할 때까지 여러 번 반복할 수 있습니다.
레지스터 창에서 명령어 포인터를 더블 클릭하면 빨간색으로 강조 표시되어 트레이스 타임라인에서 명령어가 실행된 모든 위치를 보여줍니다.
실행 간에 이동하려면 강조 표시된 명령어 포인터 위에 마우스를 올리고 위아래로 스크롤 하세요.
또한 디스어셈블리 목록에서 마우스 오른쪽 버튼을 클릭 하고 탐색 기반 메뉴 항목 중 하나를 선택하여 관심 있는 명령어의 실행으로 빠르게 이동할 수 있습니다.
IDA의 기본 F2 단축키를 사용하여 임의의 명령어에 중단점을 설정할 수도 있습니다.
스택 또는 메모리 보기에서 바이트를 더블 클릭하면 해당 주소에 대한 모든 읽기/쓰기가 트레이스 타임라인에 시각화되어 즉시 표시됩니다. 노란색은 메모리 읽기, 파란색은 메모리 쓰기를 나타냅니다.
메모리 중단점은 실행 중단점에 대해 설명된 것과 동일한 기술을 사용하여 탐색할 수 있습니다. 바이트를 더블 클릭하고 선택한 바이트 위에 마우스를 올리고 스크롤 하여 각 액세스로 트레이스를 이동합니다.
관심 있는 바이트를 마우스 오른쪽 버튼으로 클릭 하면 메모리 읽기/쓰기/액세스 간에 이동할 수 있는 옵션이 제공됩니다. 특정 탐색 작업이 있는 경우 유용합니다.
메모리 보기를 임의의 주소로 이동하려면 메모리 보기를 클릭하고 G를 눌러 주소 또는 데이터베이스 심볼을 입력하여 보기를 이동합니다.
메모리 블록을 강조 표시하고 더블 클릭하여 액세스 중단점을 설정함으로써 메모리 영역에 메모리 중단점을 설정할 수 있습니다.
일반 메모리 중단점과 마찬가지로 영역 위에 마우스를 올리고 스크롤 하여 선택한 메모리 영역에 대한 액세스 사이를 탐색할 수 있습니다.
리버스 엔지니어링에서는 "어떤 명령어가 이 레지스터를 현재 값으로 설정했을까?" 라고 자문하는 상황을 자주 만나게 됩니다.
Tenet을 사용하면 한 번의 클릭으로 해당 명령어로 뒤로 이동할 수 있습니다.
뒤로 이동하는 것이 레지스터 변경을 탐색하는 가장 일반적인 방향입니다... 하지만 민첩성을 위해 레지스터 오른쪽에 있는 파란색 화살표를 사용하여 다음 레지스터 할당으로 앞으로 이동할 수도 있습니다.
트레이스의 특정 타임스탬프로 이동하기 위한 간단한 '셸'이 제공됩니다. 쉼표 유무에 관계없이 타임스탬프를 셸에 붙여넣거나(또는 입력...) 입력하면 됩니다.
느낌표를 사용하여 지정된 '백분율'로 트레이스를 이동할 수도 있습니다. !100을 입력하면 트레이스의 마지막 명령어로 이동하고, !50을 입력하면 트레이스의 약 50% 지점으로 이동합니다. !last는 디스어셈블러에서 볼 수 있는 마지막 탐색 가능한 명령어로 이동합니다.
Tenet은 두 가지 기본 테마(라이트 테마와 다크 테마)를 제공합니다. 디스어셈블러에서 현재 사용 중인 색상에 따라 Tenet은 가장 적합해 보이는 테마를 선택하려고 시도합니다.
테마 파일은 디스크에 간단한 JSON으로 저장되며 매우 구성 가능합니다. 기본 테마나 색상이 마음에 들지 않으면 자신만의 테마를 만들어 사용자 테마 디렉토리에 넣으면 됩니다.
Tenet은 향후 로드 및 사용을 위해 테마 기본 설정을 기억합니다.
시간과 동기 자금이 허락된다면 향후 작업에는 다음이 포함될 수 있습니다:
외부 기여, 이슈 및 기능 요청을 환영합니다. 향후 릴리스에서 고려되길 원하신다면 이 리포지토리의 develop 브랜치로 풀 리퀘스트를 보내주세요.
Markus Gaasedelen (@gaasedelen)