# Cryptographic/Compression Algorithms {{#include ../../banners/hacktricks-training.md}} ## Identifying Algorithms 코드가 **shift rights and lefts, xors 및 여러 산술 연산**을 사용하는 경우, 이는 **암호화 알고리즘**의 구현일 가능성이 높습니다. 여기서는 **각 단계를 역추적할 필요 없이 사용된 알고리즘을 식별하는 방법**을 보여줍니다. ### API functions **CryptDeriveKey** 이 함수가 사용되면 두 번째 매개변수의 값을 확인하여 **어떤 알고리즘이 사용되고 있는지** 알 수 있습니다: ![](<../../images/image (156).png>) 가능한 알고리즘과 그에 할당된 값의 표는 여기에서 확인하세요: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** 주어진 데이터 버퍼를 압축하고 압축 해제합니다. **CryptAcquireContext** [문서에서](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): **CryptAcquireContext** 함수는 특정 암호화 서비스 공급자(CSP) 내의 특정 키 컨테이너에 대한 핸들을 획득하는 데 사용됩니다. **이 반환된 핸들은 선택된 CSP를 사용하는 CryptoAPI** 함수 호출에 사용됩니다. **CryptCreateHash** 데이터 스트림의 해싱을 시작합니다. 이 함수가 사용되면 두 번째 매개변수의 값을 확인하여 **어떤 알고리즘이 사용되고 있는지** 알 수 있습니다: ![](<../../images/image (549).png>) \ 가능한 알고리즘과 그에 할당된 값의 표는 여기에서 확인하세요: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### Code constants 때때로 알고리즘을 식별하는 것이 특별하고 고유한 값을 사용해야 하기 때문에 매우 쉽습니다. ![](<../../images/image (833).png>) 첫 번째 상수를 구글에서 검색하면 다음과 같은 결과를 얻습니다: ![](<../../images/image (529).png>) 따라서 디컴파일된 함수가 **sha256 계산기**라고 가정할 수 있습니다.\ 다른 상수를 검색하면 (아마도) 같은 결과를 얻을 수 있습니다. ### data info 코드에 중요한 상수가 없으면 **.data 섹션에서 정보를 로드하고 있을 수 있습니다**.\ 해당 데이터에 접근하여 **첫 번째 dword를 그룹화**하고 이전 섹션에서 했던 것처럼 구글에서 검색할 수 있습니다: ![](<../../images/image (531).png>) 이 경우 **0xA56363C6**를 검색하면 **AES 알고리즘의 테이블**과 관련이 있음을 알 수 있습니다. ## RC4 **(Symmetric Crypt)** ### Characteristics 3개의 주요 부분으로 구성됩니다: - **초기화 단계/**: **0x00에서 0xFF까지의 값 테이블**을 생성합니다(총 256바이트, 0x100). 이 테이블은 일반적으로 **Substitution Box**(또는 SBox)라고 불립니다. - **스크램블링 단계**: 이전에 생성된 테이블을 **반복(loop)**하며 각 값을 **반무작위** 바이트로 수정합니다. 이 반무작위 바이트를 생성하기 위해 RC4 **키가 사용됩니다**. RC4 **키**는 **1바이트에서 256바이트** 사이일 수 있지만, 일반적으로 5바이트 이상이 권장됩니다. 일반적으로 RC4 키는 16바이트입니다. - **XOR 단계**: 마지막으로 평문 또는 암호문은 **이전에 생성된 값과 XOR됩니다**. 암호화 및 복호화 함수는 동일합니다. 이를 위해 **생성된 256바이트를 필요에 따라 반복**합니다. 이는 일반적으로 디컴파일된 코드에서 **%256 (mod 256)**으로 인식됩니다. > [!TIP] > **디스어셈블리/디컴파일된 코드에서 RC4를 식별하려면 0x100 크기의 2개의 루프(키 사용)와 입력 데이터를 이전 2개의 루프에서 생성된 256 값과 XOR하는 것을 확인하세요. 아마도 %256 (mod 256)을 사용할 것입니다.** ### **Initialization stage/Substitution Box:** (카운터로 사용된 숫자 256과 256개의 문자 각각에 0이 어떻게 쓰여졌는지 주목하세요) ![](<../../images/image (584).png>) ### **Scrambling Stage:** ![](<../../images/image (835).png>) ### **XOR Stage:** ![](<../../images/image (904).png>) ## **AES (Symmetric Crypt)** ### **Characteristics** - **치환 상자 및 조회 테이블** 사용 - **특정 조회 테이블 값**(상수)의 사용 덕분에 AES를 **구별할 수 있습니다**. _**상수**는 **이진 파일에 저장**되거나 _**동적으로 생성**될 수 있습니다._ - **암호화 키**는 **16으로 나누어 떨어져야** 하며(일반적으로 32B) 보통 **IV**는 16B가 사용됩니다. ### SBox constants ![](<../../images/image (208).png>) ## Serpent **(Symmetric Crypt)** ### Characteristics - 이 알고리즘을 사용하는 악성 코드를 찾는 것은 드물지만 예시가 있습니다(Ursnif) - 길이에 따라 알고리즘이 Serpent인지 여부를 쉽게 판단할 수 있습니다(매우 긴 함수) ### Identifying 다음 이미지에서 상수 **0x9E3779B9**가 사용되는 것을 주목하세요(이 상수는 **TEA** - Tiny Encryption Algorithm과 같은 다른 암호 알고리즘에서도 사용됩니다).\ 또한 **루프의 크기**(**132**)와 **디스어셈블리** 명령어 및 **코드** 예제에서의 **XOR 연산 수**를 주목하세요: ![](<../../images/image (547).png>) 앞서 언급했듯이 이 코드는 **점프가 없기 때문에** 어떤 디컴파일러에서도 **매우 긴 함수**로 시각화될 수 있습니다. 디컴파일된 코드는 다음과 같이 보일 수 있습니다: ![](<../../images/image (513).png>) 따라서 **매직 넘버**와 **초기 XOR**를 확인하고 **매우 긴 함수**를 보고 **긴 함수의 일부 명령어를 구현과 비교**함으로써 이 알고리즘을 식별할 수 있습니다(예: 7로 왼쪽으로 시프트 및 22로 왼쪽으로 회전). ## RSA **(Asymmetric Crypt)** ### Characteristics - 대칭 알고리즘보다 더 복잡합니다. - 상수가 없습니다! (사용자 정의 구현은 식별하기 어렵습니다) - KANAL(암호 분석기)은 RSA에 대한 힌트를 제공하지 않으며 상수에 의존합니다. ### Identifying by comparisons ![](<../../images/image (1113).png>) - 11번째 줄(왼쪽)에는 `+7) >> 3`가 있으며, 이는 35번째 줄(오른쪽)과 동일합니다: `+7) / 8` - 12번째 줄(왼쪽)은 `modulus_len < 0x040`를 확인하고, 36번째 줄(오른쪽)은 `inputLen+11 > modulusLen`을 확인합니다. ## MD5 & SHA (hash) ### Characteristics - 3개의 함수: Init, Update, Final - 유사한 초기화 함수 ### Identify **Init** 상수를 확인하여 두 가지를 식별할 수 있습니다. sha_init에는 MD5에는 없는 1개의 상수가 있습니다: ![](<../../images/image (406).png>) **MD5 Transform** 더 많은 상수의 사용에 주목하세요. ![](<../../images/image (253) (1) (1).png>) ## CRC (hash) - 데이터의 우발적인 변경을 찾는 기능으로 더 작고 효율적입니다. - 조회 테이블을 사용하므로 상수를 식별할 수 있습니다. ### Identify **조회 테이블 상수**를 확인하세요: ![](<../../images/image (508).png>) CRC 해시 알고리즘은 다음과 같습니다: ![](<../../images/image (391).png>) ## APLib (Compression) ### Characteristics - 인식할 수 있는 상수가 없습니다. - 알고리즘을 파이썬으로 작성하고 온라인에서 유사한 것을 검색해 볼 수 있습니다. ### Identify 그래프는 꽤 큽니다: ![](<../../images/image (207) (2) (1).png>) **인식하기 위한 3가지 비교**를 확인하세요: ![](<../../images/image (430).png>) {{#include ../../banners/hacktricks-training.md}}