Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
BugId — Windows 애플리케이션의 크래시를 탐지, 분석하고 고유하게 식별합니다. | Kitploit
도구/GitHubGitHub/skylined/bugid
Vulnerability AnalysisDynamic Code Analysis (DAST)DebuggersFuzzingBinary Analysis
GitHubskylined/bugid

BugId

Windows 애플리케이션의 크래시를 탐지, 분석하고 고유하게 식별합니다.

저장소 보기
525861년 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
웹사이트

BugId

애플리케이션 버그를 탐지, 분석 및 고유하게 식별합니다.

TL;DR

혹시...

  • 애플리케이션이 충돌하는 원인이 되는 버그가 어떤 종류인지 알고 싶으십니까?
  • 버그가 보안 취약점일 수 있는지 알고 싶으십니까?
  • 두 개 이상의 충돌이 동일한 버그로 인해 발생했는지 알고 싶으십니까?
  • 버그 분석이 포함된 사람이 읽을 수 있는 보고서를 원하십니까?

...그렇다면 BugId가 도움이 될 수 있습니다!

빠른 설정

BugId를 사용하려면 다음 소프트웨어를 다운로드하여 설치하십시오:

  • 최신 Python 2.7.14
  • 최신 Windows용 디버깅 도구
  • 최신 BugId 릴리즈

Python과 Windows용 디버깅 도구를 기본 설정으로 설치하면 BugId는 설정을 조정하지 않고도 실행될 수 있습니다. BugId는 로컬 파일 시스템의 원하는 곳에 압축을 풀면 됩니다.

BugId를 시작하기 전에 대상 애플리케이션에서 전체 페이지 힙(full page heap) 을 활성화해야 합니다. 이는 특정 전역 플래그(Global Flags)를 설정하여 바이너리별로 수행할 수 있습니다. 가장 쉬운 방법은 BugId에 포함된 pageheap.cmd 스크립트를 사용하는 것입니다. 예를 들어 notepad에 대해 전체 페이지 힙을 활성화하려면 다음 명령을 실행하십시오:

root@kitploit:~
C:\BugId>pageheap notepad.exe ON

(이 명령은 관리자 권한의 명령 프롬프트에서 실행해야 합니다.)

더 쉽게 하기 위해 pageheap.cmd에는 알려진 애플리케이션 목록이 있습니다. 해당 이름을 제공하여 그 중 하나에 대해 전체 페이지 힙을 활성화하거나 비활성화할 수 있습니다. 예를 들어 pageheap msie ON은 Microsoft Internet Explorer에 대해 전체 페이지 힙을 활성화합니다. 명령줄 인수에 대한 자세한 정보를 보려면 pageheap /?를 사용하십시오.

이 시점에서 BugId가 올바르게 작동하는지 테스트해 볼 수 있습니다. 이를 위해 BugId에서 애플리케이션을 실행하고 충돌을 일으켜 BugId가 버그를 올바르게 보고하는지 확인할 수 있습니다. 이 테스트에 사용하기 좋은 애플리케이션은 rundll32.exe로, 모든 Windows 설치의 Windows 폴더(%WinDir%) 아래 system32 하위 폴더에서 찾을 수 있습니다. 이 파일은 로컬 파일 시스템에서 찾은 dll을 로드하고 특정 호출 형식으로 이 dll의 내보낸 함수를 호출하는 데 사용할 수 있습니다. system32 폴더에는 함수를 내보내는 dll이 많이 있습니다. 이러한 내보낸 함수 대부분은 rundll32가 제공하는 형식과 완전히 다른 형식의 인수를 기대하므로 애플리케이션이 충돌하게 됩니다.

먼저 다음 명령으로 rundll32에서 전체 페이지 힙을 켜야 합니다:

root@kitploit:~
C:\BugId>pageheap rundll32.exe ON

다음으로 BugId를 시작하고 advapi32.dll을 로드하고 CloseThreadWaitChainSession을 호출하도록 지시하는 인수와 함께 rundll32를 시작하도록 지정합니다. 이 글을 쓰는 시점에 이렇게 하면 소위 NULL 포인터 액세스 위반이 발생하며, BugId가 이를 탐지하고 보고해야 합니다.

root@kitploit:~
C:\BugId>BugId.cmd %WinDir%\system32\rundll32.exe -- advapi32 CloseThreadWaitChainSession

rundll32.exe와 전달되는 인수 사이에 --가 있음에 주의하십시오. 이는 BugId 자체와 테스트하려는 애플리케이션 모두에 인수를 제공하려 할 수 있기 때문입니다. 이 두 인수 집합은 명령줄에서 --로 구분되어야 합니다. -- 앞의 모든 항목은 BugId가 처리하고 -- 뒤의 모든 항목은 BugId가 무시하지만 애플리케이션에 전달됩니다.

모든 것이 정상이면 BugId의 출력은 다음과 같습니다:

root@kitploit:~
* Command line: C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession
+ Main process 8024/0x1F58 (rundll32.exe): Attached; command line = C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession.
,-- A bug was detect in the application ----------------------------------------
| Id @ Location:    AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry
| Description:      Access violation while reading memory at 0x0 using a NULL pointer.
| Security impact:  Denial of Service
| Version:          rundll32.exe 10.0.16299.15 (x64)
|                   advapi32.DLL 10.0.16299.15 (x64)
| Bug report:       AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry.html (60703 bytes)
'-------------------------------------------------------------------------------

첫 번째 줄은 BugId가 시작할 명령줄을 알려줍니다. 두 번째 줄은 이로 인해 프로세스 ID 8024를 가진 새 프로세스가 생성되어 rundll32.exe를 실행 중이며 이 프로세스의 명령줄(물론 첫 번째 줄과 동일)을 알려줍니다. 애플리케이션을 시작한 직후 버그가 감지되었습니다. BugId는 이 버그에 대해 고유 ID(AVR@NULL a1f.904)를 생성하고 해당 위치가 rundll32.exe에 의해 로드된 advapi32.dll dll의 WctRemoveEntry 함수에 있음을 보고했습니다. NULL 포인터 충돌은 일반적으로 애플리케이션을 충돌시키는 것 외에는 악용할 수 없으므로 이 버그의 보안 영향은 Denial of Service입니다. BugId는 기본적으로 발견된 모든 버그에 대해 HTML 형식의 보고서를 생성하고 이 보고서가 저장된 위치를 알려줍니다. 보시다시피 보고서의 파일 이름은 버그 ID와 위치를 기반으로 합니다.

BugId가 생성하는 모든 버그 ID는 공백으로 구분된 두 부분으로 구성됩니다. 첫 번째 부분은 버그 유형을 설명합니다. 위 예에서 AVR@NULL은 NULL 주소에서 메모리를 읽는 동안의 액세스 위반(Access Violation Reading) 을 의미합니다. 두 번째 부분은 버그의 위치를 설명합니다. 점으로 구분된 두 개의 짧은 해시로 구성됩니다. 이 해시는 스택의 버그와 관련된 것으로 간주되는 최상위 함수들에서 계산됩니다. 예에서 a1f.904는 a1f(advapi32.dll!WctRemoveEntry에서 계산)와 904 (advapi32.dll!CloseThreadWaitChainSession에서 계산)로 구성됩니다.

동일한 명령을 다시 실행하면 BugId는 정확히 동일한 BugId를 보고합니다. 이는 동일한 코드에서 정확히 동일한 버그를 일으켜야 하기 때문입니다.

축하합니다! 이제 BugId로 직접 충돌을 테스트할 준비가 되었습니다. 다만 BugId가 지원하는 다양한 명령줄 옵션에 대한 정보를 얻으려면 언젠가 BugId.cmd --help를 실행하는 것이 좋습니다.

참고 사항

BugId는 퍼징 중 수백 가지의 서로 다른 버그로 인해 발생한 수십만 건의 충돌을 분석하기 위해 다수의 애플리케이션에서 개발되었고 테스트되었습니다. 이러한 역할에서 버그 분석에 매우 정확한 것으로 입증되었으며 오탐률과 미탐률이 모두 1% 미만으로 매우 낮습니다.

물론 모든 유형의 버그가 쉽게 탐지되고 분석되는 것은 아닙니다. 일부 버그는 현재 발생 시점에 안정적으로 탐지할 수 없지만 완전히 관련 없는 코드에서 훨씬 나중에 충돌을 일으켜 완전히 잘못된 분석으로 이어집니다. 이러한 경우 동일한 버그를 반복적으로 재현하면 애플리케이션이 서로 다른 시점에 서로 다른 방식으로 충돌하므로 여러 개의 서로 다른 버그 ID가 생성됩니다. 이런 경우가 아닌지 확인하려면 테스트 케이스를 BugId에서 여러 번 실행하여 버그 ID가 동일하게 유지되는지 확인하는 것이 좋습니다.

다른 버그들은 다른 유형의 버그로 인해 발생한 것처럼 보이는 충돌을 일으킵니다. 이로 인해 잘못된 분석과 버그 ID가 발생할 수 있습니다. 가장 주목할 만한 것은 C/C++ 코드의 잘못된 캐스트(bad casts) 로 인한 버그로, 현재 BugId로 탐지하고 보고하는 것이 불가능합니다. 이러한 버그는 다양한 유형의 충돌을 일으킬 수 있습니다. 가장 일반적으로 객체의 속성에 저장된 값이 포인터로 잘못 사용될 때 액세스 위반이 발생합니다. 잘못된 캐스트가 충돌의 원인일 수 있다고 생각되면 BugId가 수행한 분석을 다시 확인하여 올바른지 확인해야 합니다.

BugId는 힙 관련 버그를 탐지하고 분석하기 위해 애플리케이션이 전체 페이지 힙을 사용하는 것에 크게 의존합니다. 즉, 표준 Windows 힙에 의존하지 않는 자체 내부 힙 관리자를 사용하는 애플리케이션의 버그를 탐지하고 분석하는 데 훨씬 덜 효과적입니다.

라이선스

Creative Commons License BugId는 상업적 및 비상업적 용도로 30일 무료 평가판 기간을 제공합니다. 이 평가판 기간 동안 본 저작물은 [크리에이티브 커먼즈 저작자표시-비영리 4.0 국제 라이선스](http://creativecommons.org/licenses/by-nc/4.0/)에 따라 라이선스가 부여됩니다.

평가판 기간이 끝난 후에도 BugId를 계속 사용하려면 license.skylined.nl에서 유료 라이선스를 취득해야 합니다.

비상업적 라이선스는 아주 적은 비용으로 이용할 수 있습니다. 제 비용을 충당할 만큼만 받습니다. 개인 보안 연구자를 위한 상업적 라이선스도 큰 할인된 가격으로 제공됩니다.

라이선스에 관한 질문이 있거나 대량 할인을 논의하려면 [email protected]로 연락해 주십시오.

BugId의 유용성을 평가할 수 있도록 평가판 기간이 있습니다. 평가판 기간이 끝난 후에도 BugId를 계속 사용하려면 BugId 작업과 라이선스 요청 처리에 대한 대가로 소액의 비용을 기여해 주시기를 요청합니다. BugId를 상업적으로 사용하는 경우 정기 라이선스 비용을 지불하여 BugId 사용으로 얻는 수익의 일부를 공유해 주시기를 요청합니다.

도구 다운로드