fnprint - 실행 동작을 비교해 바이너리 속 함수를 식별하는 도구
3 hours ago
4
- 소스코드가 없고 함수 이름도 제거된 실행 파일에서, 이름이 알려진 함수들과 동작을 대조해 어떤 함수인지 식별하는 역공학 도구
- 예: 이름을 알 수 없는 함수를 분석해, “zlib의 압축 함수 compress2와 동작이 비슷하다”는 결과를 얻을 수 있음
- 바이트 일치 여부가 아니라 실행 중 나타나는 특징을 비교하므로, 컴파일러나 최적화 설정이 다른 빌드에서도 같은 함수를 찾는 데 활용 가능
- 두 펌웨어 버전을 비교해 동작이 달라진 함수를 골라내고, 보안 패치 전후의 차이를 조사하는 데도 사용
- 각 함수에 임의의 입력을 넣어 에뮬레이터에서 실행하고, 메모리 접근 방식, 분기, 반환값과 다른 함수 호출을 기록
- 다른 함수 호출은 기록만 하고 건너뛰며, 절대 주소 대신 상대적인 위치와 데이터 형태를 남겨 빌드마다 달라지는 요소를 줄임
- 실행 기록을 MinHash 지문으로 압축하고, LSH 인덱스로 비교할 후보를 좁혀 유사도를 계산
- triage는 알려진 취약 버전과 패치 버전 중 어느 쪽에 가까운지 비교해 사람이 우선 검토할 함수 목록을 생성
- AI 모델이나 학습 데이터가 필요 없고, 판단할 근거가 부족하면 결과를 보류
- 모든 실행 경로를 검사하지는 않으므로, 특정 조건에서만 나타나는 깊은 로직 변경을 놓칠 수 있음
- 작은 함수/순수 계산 함수/깊은 조건 안의 변경/강한 난독화에는 약하며, 양쪽 모두 고도로 최적화되면 정확도가 크게 낮아짐
- 현재 x86-64 ELF만 지원하며, ARM64/MIPS와 PE/Mach-O 지원은 향후 계획중
- Rust로 개발됐으며 Unicorn/Capstone 라이브러리를 설치한 뒤 소스에서 빌드
- MIT 라이선스
-
Homepage
-
Tech blog
- fnprint - 실행 동작을 비교해 바이너리 속 함수를 식별하는 도구