hacktricks/reversing/cryptographic-algorithms/README.md

213 lines
10 KiB
Markdown
Raw Normal View History

# Cryptographic/Compression Algorithms
2022-04-28 16:01:33 +00:00
## Cryptographic/Compression Algorithms
2022-05-01 16:57:45 +00:00
{% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>HackTricks 지원하기</summary>
2024-01-01 17:15:42 +00:00
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
## 알고리즘 식별
코드가 **시프트 연산, XOR 및 여러 산술 연산**을 사용하는 경우, 이는 **암호화 알고리즘**의 구현일 가능성이 높습니다. 여기서는 **각 단계를 리버스할 필요 없이 사용된 알고리즘을 식별하는 방법**을 보여줍니다.
2024-02-10 21:30:13 +00:00
### API 함수
2020-12-06 11:24:41 +00:00
2022-04-28 23:27:22 +00:00
**CryptDeriveKey**
2020-12-06 11:24:41 +00:00
이 함수가 사용되면 두 번째 매개변수의 값을 확인하여 **어떤 알고리즘이 사용되고 있는지** 알 수 있습니다:
2020-12-06 11:24:41 +00:00
![](<../../.gitbook/assets/image (375) (1) (1) (1) (1).png>)
가능한 알고리즘과 그에 할당된 값의 표는 여기에서 확인하세요: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
2022-04-28 23:27:22 +00:00
**RtlCompressBuffer/RtlDecompressBuffer**
주어진 데이터 버퍼를 압축하고 압축 해제합니다.
2022-04-28 23:27:22 +00:00
**CryptAcquireContext**
[문서에서](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): **CryptAcquireContext** 함수는 특정 암호화 서비스 공급자(CSP) 내의 특정 키 컨테이너에 대한 핸들을 획득하는 데 사용됩니다. **이 반환된 핸들은 선택된 CSP를 사용하는 CryptoAPI** 함수 호출에 사용됩니다.
2022-04-28 23:27:22 +00:00
**CryptCreateHash**
데이터 스트림의 해싱을 시작합니다. 이 함수가 사용되면 두 번째 매개변수의 값을 확인하여 **어떤 알고리즘이 사용되고 있는지** 알 수 있습니다:
![](<../../.gitbook/assets/image (376).png>)
\
가능한 알고리즘과 그에 할당된 값의 표는 여기에서 확인하세요: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
2020-12-06 11:24:41 +00:00
2024-02-10 21:30:13 +00:00
### 코드 상수
때때로 알고리즘을 식별하는 것이 매우 쉽습니다. 이는 특별하고 고유한 값을 사용해야 하기 때문입니다.
![](<../../.gitbook/assets/image (370).png>)
첫 번째 상수를 구글에서 검색하면 다음과 같은 결과를 얻습니다:
![](<../../.gitbook/assets/image (371).png>)
따라서 디컴파일된 함수가 **sha256 계산기**라고 가정할 수 있습니다.\
다른 상수를 검색하면 (아마도) 같은 결과를 얻을 수 있습니다.
2024-02-10 21:30:13 +00:00
### 데이터 정보
코드에 중요한 상수가 없으면 **.data 섹션에서 정보를 로드하고 있을 수 있습니다**.\
해당 데이터에 접근하여 **첫 번째 DWORD를 그룹화**하고 이전 섹션에서 했던 것처럼 구글에서 검색할 수 있습니다:
![](<../../.gitbook/assets/image (372).png>)
이 경우 **0xA56363C6**를 검색하면 **AES 알고리즘의 테이블**과 관련이 있음을 알 수 있습니다.
2024-02-10 21:30:13 +00:00
## RC4 **(대칭 암호)**
2020-12-03 11:05:29 +00:00
2024-02-10 21:30:13 +00:00
### 특징
3개의 주요 부분으로 구성됩니다:
2020-12-03 11:05:29 +00:00
* **초기화 단계/**: **0x00에서 0xFF까지의 값 테이블**을 생성합니다(총 256바이트, 0x100). 이 테이블은 일반적으로 **대체 상자**(또는 SBox)라고 불립니다.
* **섞기 단계**: 이전에 생성된 테이블을 **반복**하며(0x100 반복) 각 값을 **반무작위** 바이트로 수정합니다. 이 반무작위 바이트를 생성하기 위해 RC4 **키가 사용됩니다**. RC4 **키는 1바이트에서 256바이트 사이의 길이를 가질 수 있지만**, 일반적으로 5바이트 이상이 권장됩니다. 일반적으로 RC4 키는 16바이트 길이입니다.
* **XOR 단계**: 마지막으로, 평문 또는 암호문은 **이전에 생성된 값과 XOR됩니다**. 암호화 및 복호화 함수는 동일합니다. 이를 위해 **생성된 256바이트를 필요한 만큼 반복**합니다. 이는 일반적으로 디컴파일된 코드에서 **%256 (mod 256)**으로 인식됩니다.
2020-12-03 11:05:29 +00:00
{% hint style="info" %}
**디스어셈블리/디컴파일된 코드에서 RC4를 식별하기 위해서는 0x100 크기의 2개의 루프(키 사용)와 그 후에 입력 데이터를 2개의 루프에서 생성된 256값과 XOR하는 것을 확인할 수 있습니다. 아마도 %256 (mod 256)을 사용할 것입니다.**
2020-12-03 11:05:29 +00:00
{% endhint %}
### **초기화 단계/대체 상자:** (카운터로 사용된 숫자 256과 256개의 문자 각각에 0이 기록된 방식을 주목하세요)
![](<../../.gitbook/assets/image (377).png>)
### **섞기 단계:**
![](<../../.gitbook/assets/image (378).png>)
2024-02-10 21:30:13 +00:00
### **XOR 단계:**
![](<../../.gitbook/assets/image (379).png>)
2024-02-10 21:30:13 +00:00
## **AES (대칭 암호)**
2024-02-10 21:30:13 +00:00
### **특징**
* **대체 상자 및 조회 테이블** 사용
* **특정 조회 테이블 값**(상수)의 사용 덕분에 AES를 **구별할 수 있습니다**. _상수가 **이진 파일에 저장**되거나 _**동적으로 생성**될 수 있습니다._
* **암호화 키**는 **16으로 나누어 떨어져야** 하며(일반적으로 32B) 보통 **IV**로 16B가 사용됩니다.
2024-02-10 21:30:13 +00:00
### SBox 상수
![](<../../.gitbook/assets/image (380).png>)
2024-02-10 21:30:13 +00:00
## Serpent **(대칭 암호)**
2024-02-10 21:30:13 +00:00
### 특징
* 이 알고리즘을 사용하는 악성코드를 찾는 것은 드물지만 예시가 있습니다 (Ursnif)
* 길이에 따라 알고리즘이 Serpent인지 여부를 쉽게 판단할 수 있습니다(매우 긴 함수)
### 식별
다음 이미지에서 상수 **0x9E3779B9**가 사용되는 방식을 주목하세요(이 상수는 **TEA** - Tiny Encryption Algorithm과 같은 다른 암호 알고리즘에서도 사용됩니다).\
또한 **루프의 크기**(**132**)와 **디스어셈블리** 명령어 및 **코드** 예제에서의 **XOR 연산 수**를 주목하세요:
![](<../../.gitbook/assets/image (381).png>)
앞서 언급했듯이, 이 코드는 **점프가 없기 때문에** 어떤 디컴파일러에서도 **매우 긴 함수**로 시각화될 수 있습니다. 디컴파일된 코드는 다음과 같이 보일 수 있습니다:
![](<../../.gitbook/assets/image (382).png>)
따라서 **매직 넘버**와 **초기 XOR**를 확인하고, **매우 긴 함수**를 보고, **긴 함수의 일부 명령어를 구현과 비교**함으로써 이 알고리즘을 식별할 수 있습니다(예: 7비트 왼쪽 시프트 및 22비트 왼쪽 회전).
## RSA **(비대칭 암호)**
2024-02-10 21:30:13 +00:00
### 특징
* 대칭 알고리즘보다 더 복잡합니다.
* 상수가 없습니다! (사용자 정의 구현은 식별하기 어렵습니다)
* KANAL(암호 분석기)은 RSA에 대한 힌트를 제공하지 않으며 상수에 의존합니다.
2024-02-10 21:30:13 +00:00
### 비교를 통한 식별
![](<../../.gitbook/assets/image (383).png>)
* 11번째 줄(왼쪽)에는 `+7) >> 3`가 있으며, 이는 35번째 줄(오른쪽)과 동일합니다: `+7) / 8`
* 12번째 줄(왼쪽)은 `modulus_len < 0x040`를 확인하고, 36번째 줄(오른쪽)은 `inputLen+11 > modulusLen`을 확인합니다.
2024-02-10 21:30:13 +00:00
## MD5 & SHA (해시)
2024-02-10 21:30:13 +00:00
### 특징
* 3개의 함수: Init, Update, Final
2024-02-10 21:30:13 +00:00
* 유사한 초기화 함수
2024-02-10 21:30:13 +00:00
### 식별
2022-04-28 23:27:22 +00:00
**Init**
상수를 확인하여 두 가지를 식별할 수 있습니다. sha\_init에는 MD5에는 없는 1개의 상수가 있습니다:
![](<../../.gitbook/assets/image (385).png>)
**MD5 변환**
더 많은 상수의 사용을 주목하세요.
![](<../../.gitbook/assets/image (253) (1) (1) (1).png>)
2024-02-10 21:30:13 +00:00
## CRC (해시)
* 데이터의 우발적인 변경을 찾는 기능으로 더 작고 효율적입니다.
* 조회 테이블을 사용하므로 상수를 식별할 수 있습니다.
2024-02-10 21:30:13 +00:00
### 식별
2024-02-10 21:30:13 +00:00
**조회 테이블 상수**를 확인하세요:
![](<../../.gitbook/assets/image (387).png>)
2024-02-10 21:30:13 +00:00
CRC 해시 알고리즘은 다음과 같습니다:
![](<../../.gitbook/assets/image (386).png>)
2024-02-10 21:30:13 +00:00
## APLib (압축)
2024-02-10 21:30:13 +00:00
### 특징
* 인식할 수 있는 상수가 없습니다.
* 알고리즘을 파이썬으로 작성하고 온라인에서 유사한 것을 검색해 볼 수 있습니다.
2024-02-10 21:30:13 +00:00
### 식별
그래프는 꽤 큽니다:
![](<../../.gitbook/assets/image (207) (2) (1).png>)
식별하기 위해 **3개의 비교를 확인하세요**:
![](<../../.gitbook/assets/image (384).png>)
2022-04-28 16:01:33 +00:00
{% hint style="success" %}
AWS 해킹 배우기 및 연습하기:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
GCP 해킹 배우기 및 연습하기: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>HackTricks 지원하기</summary>
2024-01-01 17:15:42 +00:00
* [**구독 계획**](https://github.com/sponsors/carlospolop) 확인하기!
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 참여하거나 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}