diff --git a/src/AI/AI-llm-architecture/1.-tokenizing.md b/src/AI/AI-llm-architecture/1.-tokenizing.md
index 7c7556b7e..bbac67485 100644
--- a/src/AI/AI-llm-architecture/1.-tokenizing.md
+++ b/src/AI/AI-llm-architecture/1.-tokenizing.md
@@ -4,7 +4,7 @@
## Tokenizing
-**Tokenizing** 是将数据(如文本)分解为称为 _tokens_ 的更小、更易管理的部分的过程。每个 token 然后被分配一个唯一的数字标识符 (ID)。这是为机器学习模型处理文本做准备的基本步骤,特别是在自然语言处理 (NLP) 中。
+**Tokenizing** 是将数据(如文本)分解为称为 _tokens_ 的较小、可管理的部分的过程。每个 token 然后被分配一个唯一的数字标识符 (ID)。这是为机器学习模型处理文本做准备的基本步骤,特别是在自然语言处理 (NLP) 中。
> [!TIP]
> 这个初始阶段的目标非常简单:**以某种有意义的方式将输入划分为 tokens (ids)**。
@@ -12,12 +12,12 @@
### **How Tokenizing Works**
1. **Splitting the Text:**
-- **Basic Tokenizer:** 一个简单的 tokenizer 可能将文本分割为单个单词和标点符号,去除空格。
+- **Basic Tokenizer:** 一个简单的 tokenizer 可能将文本拆分为单个单词和标点符号,去除空格。
- _Example:_\
文本: `"Hello, world!"`\
Tokens: `["Hello", ",", "world", "!"]`
2. **Creating a Vocabulary:**
-- 为了将 tokens 转换为数字 ID,创建一个 **vocabulary**。这个 vocabulary 列出了所有唯一的 tokens(单词和符号),并为每个 token 分配一个特定的 ID。
+- 为了将 tokens 转换为数字 ID,创建一个 **vocabulary**。这个 vocabulary 列出了所有唯一的 tokens(单词和符号),并为每个分配一个特定的 ID。
- **Special Tokens:** 这些是添加到 vocabulary 中以处理各种场景的特殊符号:
- `[BOS]` (Beginning of Sequence): 表示文本的开始。
- `[EOS]` (End of Sequence): 表示文本的结束。
@@ -33,7 +33,7 @@ _(假设 `[UNK]` 的 ID 是 `987`)_
### **Advanced Tokenizing Methods**
-虽然基本的 tokenizer 对于简单文本效果很好,但在处理大型 vocabulary 和新词或稀有词时存在局限性。高级 tokenizing 方法通过将文本分解为更小的子单元或优化 tokenization 过程来解决这些问题。
+虽然基本的 tokenizer 对于简单文本效果很好,但它在处理大型 vocabulary 和新词或稀有词时存在局限性。高级 tokenizing 方法通过将文本分解为更小的子单元或优化 tokenization 过程来解决这些问题。
1. **Byte Pair Encoding (BPE):**
- **Purpose:** 通过将稀有或未知单词分解为频繁出现的字节对,减少 vocabulary 的大小并处理稀有或未知单词。
@@ -45,7 +45,7 @@ _(假设 `[UNK]` 的 ID 是 `987`)_
- 消除了对 `[UNK]` token 的需求,因为所有单词都可以通过组合现有的子词 tokens 来表示。
- 更高效和灵活的 vocabulary。
- _Example:_\
-`"playing"` 可能被 tokenized 为 `["play", "ing"]`,如果 `"play"` 和 `"ing"` 是频繁的子词。
+`"playing"` 可能被 tokenized 为 `["play", "ing"]` 如果 `"play"` 和 `"ing"` 是频繁的子词。
2. **WordPiece:**
- **Used By:** 像 BERT 这样的模型。
- **Purpose:** 类似于 BPE,它将单词分解为子词单元,以处理未知单词并减少 vocabulary 大小。
diff --git a/src/AI/AI-llm-architecture/3.-token-embeddings.md b/src/AI/AI-llm-architecture/3.-token-embeddings.md
index 0a67c3809..0205a73a3 100644
--- a/src/AI/AI-llm-architecture/3.-token-embeddings.md
+++ b/src/AI/AI-llm-architecture/3.-token-embeddings.md
@@ -8,7 +8,7 @@
> [!TIP]
> 这个第三阶段的目标非常简单:**为词汇表中的每个先前标记分配一个所需维度的向量以训练模型。** 词汇表中的每个单词将在 X 维空间中有一个点。\
-> 请注意,最初每个单词在空间中的位置只是“随机”初始化的,这些位置是可训练的参数(将在训练过程中得到改善)。
+> 请注意,最初每个单词在空间中的位置是“随机”初始化的,这些位置是可训练的参数(将在训练过程中得到改善)。
>
> 此外,在 token embedding 过程中 **创建了另一层嵌入**,它表示(在这种情况下)**单词在训练句子中的绝对位置**。这样,句子中不同位置的单词将具有不同的表示(含义)。
@@ -130,7 +130,7 @@ cssCopy codeBatch
### **为什么需要位置嵌入:**
- **令牌顺序很重要:** 在句子中,意义往往依赖于单词的顺序。例如,“猫坐在垫子上”与“垫子坐在猫上”。
-- **嵌入限制:** 如果没有位置信息,模型将令牌视为“词袋”,忽略它们的顺序。
+- **嵌入限制:** 没有位置信息,模型将令牌视为“词袋”,忽略它们的顺序。
### **位置嵌入的类型:**
diff --git a/src/AI/AI-llm-architecture/5.-llm-architecture.md b/src/AI/AI-llm-architecture/5.-llm-architecture.md
index 7519127bd..5724eed0d 100644
--- a/src/AI/AI-llm-architecture/5.-llm-architecture.md
+++ b/src/AI/AI-llm-architecture/5.-llm-architecture.md
@@ -260,20 +260,20 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
#### **目的和功能**
-- **多头自注意力:** 允许模型在编码一个标记时关注输入序列中的不同位置。
+- **多头自注意力:** 允许模型在编码一个令牌时关注输入序列中的不同位置。
- **关键组件:**
- **查询、键、值:** 输入的线性投影,用于计算注意力分数。
- **头:** 多个并行运行的注意力机制(`num_heads`),每个具有减少的维度(`head_dim`)。
- **注意力分数:** 作为查询和键的点积计算,经过缩放和掩蔽。
-- **掩蔽:** 应用因果掩蔽,以防止模型关注未来的标记(对于像 GPT 这样的自回归模型很重要)。
+- **掩蔽:** 应用因果掩蔽,以防止模型关注未来的令牌(对于像 GPT 这样的自回归模型很重要)。
- **注意力权重:** 掩蔽和缩放后的注意力分数的 Softmax。
- **上下文向量:** 根据注意力权重的值的加权和。
- **输出投影:** 线性层以组合所有头的输出。
> [!TIP]
-> 该网络的目标是找到同一上下文中标记之间的关系。此外,标记被分配到不同的头中,以防止过拟合,尽管每个头找到的最终关系在该网络的末尾被组合在一起。
+> 该网络的目标是找到同一上下文中令牌之间的关系。此外,令牌被分配到不同的头中,以防止过拟合,尽管每个头找到的最终关系在该网络的末尾被组合在一起。
>
-> 此外,在训练期间应用 **因果掩蔽**,以便在查看特定标记的关系时不考虑后续标记,并且还应用了一些 **dropout** 以 **防止过拟合**。
+> 此外,在训练期间应用 **因果掩蔽**,以便在查看特定令牌的关系时不考虑后来的令牌,并且还应用了一些 **dropout** 以 **防止过拟合**。
### **层** 归一化
```python
@@ -293,10 +293,10 @@ return self.scale * norm_x + self.shift
```
#### **目的和功能**
-- **层归一化:** 一种用于对每个批次中单个示例的特征(嵌入维度)进行归一化的技术。
+- **层归一化:** 一种用于规范化批次中每个单独示例的特征(嵌入维度)输入的技术。
- **组件:**
-- **`eps`:** 一个小常数(`1e-5`),添加到方差中以防止在归一化过程中出现除以零的情况。
-- **`scale` 和 `shift`:** 可学习的参数(`nn.Parameter`),允许模型对归一化输出进行缩放和偏移。它们分别初始化为1和0。
+- **`eps`:** 一个小常数(`1e-5`),在归一化过程中添加到方差中以防止除以零。
+- **`scale` 和 `shift`:** 可学习参数(`nn.Parameter`),允许模型对归一化输出进行缩放和偏移。它们分别初始化为1和0。
- **归一化过程:**
- **计算均值(`mean`):** 计算输入 `x` 在嵌入维度(`dim=-1`)上的均值,同时保持维度以便广播(`keepdim=True`)。
- **计算方差(`var`):** 计算 `x` 在嵌入维度上的方差,同样保持维度。`unbiased=False` 参数确保方差使用有偏估计量计算(除以 `N` 而不是 `N-1`),这在对特征而非样本进行归一化时是合适的。
@@ -306,7 +306,7 @@ return self.scale * norm_x + self.shift
> [!TIP]
> 目标是确保同一标记的所有维度的均值为0,方差为1。这样做的目的是**通过减少内部协变量偏移来稳定深度神经网络的训练**,内部协变量偏移是指由于训练过程中参数更新而导致的网络激活分布的变化。
-### **Transformer 块**
+### **变换器块**
_已添加形状作为注释,以更好地理解矩阵的形状:_
```python
@@ -351,8 +351,8 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
#### **目的和功能**
- **层的组成:** 结合多头注意力、前馈网络、层归一化和残差连接。
-- **层归一化:** 在注意力和前馈层之前应用,以实现稳定的训练。
-- **残差连接(快捷方式):** 将层的输入添加到其输出,以改善梯度流并使深层网络的训练成为可能。
+- **层归一化:** 在注意力和前馈层之前应用,以确保稳定的训练。
+- **残差连接(快捷方式):** 将层的输入添加到其输出中,以改善梯度流并使深层网络的训练成为可能。
- **丢弃法:** 在注意力和前馈层之后应用,以进行正则化。
#### **逐步功能**
@@ -374,11 +374,11 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
> transformer块将所有网络组合在一起,并应用一些**归一化**和**丢弃法**以改善训练的稳定性和结果。\
> 注意丢弃法是在每个网络使用后进行的,而归一化是在之前应用的。
>
-> 此外,它还使用快捷方式,即**将网络的输出与其输入相加**。这有助于防止梯度消失问题,确保初始层的贡献与最后一层“相当”。
+> 此外,它还使用快捷方式,即**将网络的输出与其输入相加**。这有助于防止消失梯度问题,确保初始层的贡献与最后一层“相当”。
### **GPTModel**
-_已添加形状作为注释,以更好地理解矩阵的形状:_
+_形状已作为注释添加,以更好地理解矩阵的形状:_
```python
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
class GPTModel(nn.Module):
@@ -436,17 +436,17 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
#### **目的和功能**
- **嵌入层:**
-- **令牌嵌入 (`tok_emb`):** 将令牌索引转换为嵌入。作为提醒,这些是赋予词汇中每个令牌每个维度的权重。
-- **位置嵌入 (`pos_emb`):** 向嵌入添加位置信息,以捕捉令牌的顺序。作为提醒,这些是根据令牌在文本中的位置赋予的权重。
+- **令牌嵌入 (`tok_emb`):** 将令牌索引转换为嵌入。提醒一下,这些是赋予词汇中每个令牌每个维度的权重。
+- **位置嵌入 (`pos_emb`):** 向嵌入添加位置信息,以捕捉令牌的顺序。提醒一下,这些是根据令牌在文本中的位置赋予的权重。
- **丢弃 (`drop_emb`):** 应用于嵌入以进行正则化。
-- **变换器块 (`trf_blocks`):** 一组 `n_layers` 变换器块,用于处理嵌入。
+- **变换器块 (`trf_blocks`):** 堆叠 `n_layers` 个变换器块以处理嵌入。
- **最终归一化 (`final_norm`):** 输出层之前的层归一化。
- **输出层 (`out_head`):** 将最终隐藏状态投影到词汇大小,以生成预测的 logits。
> [!TIP]
> 该类的目标是使用所有其他提到的网络来**预测序列中的下一个令牌**,这对于文本生成等任务至关重要。
>
-> 注意它将**使用尽可能多的变换器块**,并且每个变换器块使用一个多头注意力网络,一个前馈网络和几个归一化。因此,如果使用12个变换器块,则将其乘以12。
+> 注意它将**使用尽可能多的变换器块**,并且每个变换器块使用一个多头注意力网络、一个前馈网络和几个归一化。因此,如果使用12个变换器块,则将其乘以12。
>
> 此外,在**输出**之前添加了一个**归一化**层,并在最后应用一个最终线性层以获得具有适当维度的结果。注意每个最终向量的大小与使用的词汇相同。这是因为它试图为词汇中的每个可能令牌获取一个概率。
@@ -612,7 +612,7 @@ total_params = 163,009,536
拥有一个像之前那样预测下一个标记的模型,只需从输出中获取最后一个标记的值(因为它们将是预测标记的值),这将是**词汇表中每个条目的值**,然后使用`softmax`函数将维度归一化为总和为1的概率,然后获取最大条目的索引,这将是词汇表中单词的索引。
-代码来自 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb):
+来自 [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch04/01_main-chapter-code/ch04.ipynb):
```python
def generate_text_simple(model, idx, max_new_tokens, context_size):
# idx is (batch, n_tokens) array of indices in the current context
diff --git a/src/SUMMARY.md b/src/SUMMARY.md
index f83536cbe..e099c09b3 100644
--- a/src/SUMMARY.md
+++ b/src/SUMMARY.md
@@ -795,6 +795,7 @@
- [BF Forked & Threaded Stack Canaries](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
- [Print Stack Canary](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md)
- [Write What Where 2 Exec](binary-exploitation/arbitrary-write-2-exec/README.md)
+ - [Aw2exec Sips Icc Profile](binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md)
- [WWW2Exec - atexit()](binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md)
- [WWW2Exec - .dtors & .fini_array](binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
diff --git a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md
new file mode 100644
index 000000000..749107fcb
--- /dev/null
+++ b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md
@@ -0,0 +1,53 @@
+# WWW2Exec - sips ICC Profile Out-of-Bounds Write (CVE-2024-44236)
+
+{{#include ../../banners/hacktricks-training.md}}
+
+## 概述
+
+Apple macOS Scriptable Image Processing System (`sips`) ICC 配置文件解析器中的越界写入漏洞(macOS 15.0.1, sips-307),由于对 `lutAToBType` (`mAB `) 和 `lutBToAType` (`mBA `) 标签中的 `offsetToCLUT` 字段的验证不当。一个精心制作的 ICC 文件可以触发零写,最多达到堆缓冲区之后的 16 字节,破坏堆元数据或函数指针,并启用任意代码执行(CVE-2024-44236)。
+
+## 易受攻击的代码
+
+易受攻击的函数从攻击者控制的偏移量开始读取并将 16 字节置为零,而不确保其位于分配的缓冲区内:
+```c
+// Pseudocode from sub_1000194D0 in sips-307 (macOS 15.0.1)
+for (i = offsetToCLUT; i < offsetToCLUT + 16; i++) {
+if (i > numberOfInputChannels && buffer[i] != 0)
+buffer[i] = 0;
+}
+```
+仅执行检查 `offsetToCLUT <= totalDataLength`。通过设置 `offsetToCLUT == tagDataSize`,循环索引到 `buffer` 末尾之后的 16 字节,破坏相邻的堆元数据。
+
+## 利用步骤
+
+1. **构造恶意 `.icc` 配置文件:**
+- 构建 ICC 头(128 字节),签名为 `acsp`,并包含一个 `lutAToBType` 或 `lutBToAType` 标签条目。
+- 在标签表中,将 `offsetToCLUT` 设置为标签的 `size`(`tagDataSize`)。
+- 在标签数据块后面放置攻击者控制的数据,以覆盖堆元数据。
+2. **触发解析:**
+
+```bash
+sips --verifyColor malicious.icc
+```
+
+3. **堆元数据损坏:** OOB 零写覆盖分配器元数据或相邻指针,使攻击者能够劫持控制流并在 `sips` 进程的上下文中实现任意代码执行。
+
+## 影响
+
+成功利用会导致在运行易受攻击的 `sips` 实用程序的 macOS 系统上以用户权限进行远程任意代码执行。
+
+## 检测
+
+- 监控常见协议(FTP、HTTP/S、IMAP、SMB、NFS、SMTP)上的文件传输。
+- 检查传输的文件是否具有签名 `acsp`。
+- 对于每个 `mAB ` 或 `mBA ` 标签,验证 `Offset to CLUT` 字段是否等于 `Tag data size`。
+- 如果满足此条件,则标记为可疑。
+
+## 参考
+
+- ZDI 博客:CVE-2024-44236:Apple macOS sips 实用程序中的远程代码执行漏洞
+https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulnerability-in-apple-macos
+- Apple 2024 年 10 月安全更新(修补 CVE-2024-44236)
+https://support.apple.com/en-us/121564
+
+{{#include /banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/array-indexing.md b/src/binary-exploitation/array-indexing.md
index d6311ed53..e86fe2917 100644
--- a/src/binary-exploitation/array-indexing.md
+++ b/src/binary-exploitation/array-indexing.md
@@ -9,10 +9,12 @@
然而,您可以找到一些不错的 **示例**:
- [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html)
-- 有 **2 个冲突的数组**,一个用于 **地址**,存储数据,另一个用于该数据的 **大小**。可以从一个数组覆盖另一个数组,从而写入一个任意地址,将其视为大小。这允许在 GOT 表中写入 `free` 函数的地址,然后用 `system` 的地址覆盖它,并从内存中调用 `/bin/sh` 的 free。
+- 有 **2 个冲突的数组**,一个用于存储数据的 **地址**,另一个用于该数据的 **大小**。可以从一个数组覆盖另一个数组,从而写入一个任意地址并将其标记为大小。这允许在 GOT 表中写入 `free` 函数的地址,然后用 `system` 的地址覆盖它,并从内存中调用 free,使用 `/bin/sh`。
- [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html)
-- 64 位,无 nx。覆盖一个大小以获得一种缓冲区溢出,其中每个东西都将被用作双倍数字,并按从小到大的顺序排序,因此需要创建一个满足该要求的 shellcode,考虑到 canary 不应从其位置移动,最后用一个返回地址覆盖 RIP,该地址满足先前的要求,并将最大的地址放置为指向栈开始的新地址(由程序泄漏),以便可以使用 ret 跳转到那里。
+- 64 位,无 nx。覆盖一个大小以获得一种缓冲区溢出,其中每个东西都将被用作双倍数字并按从小到大的顺序排序,因此需要创建一个满足该要求的 shellcode,考虑到 canary 不应从其位置移动,最后用一个返回地址覆盖 RIP,该地址满足先前的要求,并将最大的地址设置为指向栈开始的新地址(由程序泄露),以便可以使用 ret 跳转到那里。
- [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
-- 64 位,无 relro,canary,nx,无 pie。栈中的数组存在一个 off-by-one 漏洞,允许控制一个指针,从而授予 WWW(它将数组中所有数字的总和写入被数组中的 off-by-one 覆盖的地址)。栈被控制,因此 GOT 的 `exit` 地址被覆盖为 `pop rdi; ret`,并在栈中添加 `main` 的地址(循环回到 `main`)。使用 ROP 链泄漏 GOT 中 put 的地址,使用 puts(`exit` 将被调用,因此将调用 `pop rdi; ret`,因此在栈中执行此链)。最后,使用新的 ROP 链执行 ret2lib。
+- 64 位,无 relro,canary,nx,无 pie。栈中的数组存在一个 off-by-one 漏洞,允许控制一个指针,从而授予 WWW(它将数组中所有数字的总和写入被数组中的 off-by-one 覆盖的地址)。栈被控制,因此 GOT 的 `exit` 地址被覆盖为 `pop rdi; ret`,并在栈中添加 `main` 的地址(循环回到 `main`)。使用 ROP 链泄露 GOT 中 put 的地址,使用 puts(`exit` 将被调用,因此将调用 `pop rdi; ret`,因此在栈中执行此链)。最后,使用执行 ret2lib 的新 ROP 链。
- [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html)
-- 32 位,无 relro,无 canary,nx,pie。利用错误的索引泄漏 libc 和堆的地址。利用缓冲区溢出进行 ret2lib 调用 `system('/bin/sh')`(需要堆地址以绕过检查)。
+- 32 位,无 relro,无 canary,nx,pie。利用错误的索引泄露 libc 和堆的地址。利用缓冲区溢出进行 ret2lib 调用 `system('/bin/sh')`(需要堆地址以绕过检查)。
+
+{{#include /banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md
index 190912f17..952edb25e 100644
--- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md
+++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md
@@ -2,19 +2,19 @@
{{#include ../../../banners/hacktricks-training.md}}
-**如果你面临一个受 canary 和 PIE(位置无关可执行文件)保护的二进制文件,你可能需要找到一种方法来绕过它们。**
+**如果你面临一个受到 canary 和 PIE(位置无关可执行文件)保护的二进制文件,你可能需要找到一种方法来绕过它们。**
.png>)
-> [!NOTE]
+> [!TIP]
> 请注意,**`checksec`** 可能无法发现一个二进制文件受到 canary 保护,如果它是静态编译的,并且无法识别该函数。\
> 然而,如果你发现一个值在函数调用开始时被保存到栈中,并且在退出之前检查这个值,你可以手动注意到这一点。
## Brute force Canary
-绕过简单 canary 的最佳方法是,如果二进制文件是一个**每次你与它建立新连接时都会分叉子进程的程序**(网络服务),因为每次你连接到它时**将使用相同的 canary**。
+绕过简单 canary 的最佳方法是,如果二进制文件是一个**每次你与之建立新连接时都会分叉子进程的程序**(网络服务),因为每次你连接到它时**将使用相同的 canary**。
-因此,绕过 canary 的最佳方法就是**逐字符暴力破解**,你可以通过检查程序是否崩溃或继续其正常流程来判断猜测的 canary 字节是否正确。在这个例子中,函数**暴力破解一个 8 字节的 canary(x64)**,并通过**检查**服务器是否发送了**响应**来区分正确猜测的字节和错误字节(在**其他情况下**,另一种方法可以使用**try/except**):
+因此,绕过 canary 的最佳方法就是**逐字符暴力破解**,你可以通过检查程序是否崩溃或继续其正常流程来判断猜测的 canary 字节是否正确。在这个例子中,函数**暴力破解一个 8 字节的 canary(x64)**,并通过**检查**服务器是否发送了**响应**来区分正确猜测的字节和错误的字节(在**其他情况下**,另一种方法可以使用**try/except**):
### Example 1
@@ -103,15 +103,17 @@ log.info(f"The canary is: {canary}")
```
## 线程
-同一进程的线程将**共享相同的 canary token**,因此如果二进制文件在每次发生攻击时都会生成一个新线程,就有可能**暴力破解**一个 canary。
+同一进程的线程将**共享相同的 canary token**,因此如果二进制文件在每次攻击发生时生成一个新线程,将有可能**暴力破解**一个 canary。
-此外,在受 canary 保护的**线程函数**中发生的缓冲区**溢出**可能被用来**修改存储在 TLS 中的主 canary**。这是因为,可能通过线程的**栈中的 bof**到达存储 TLS(因此也包括 canary)的内存位置。\
-因此,缓解措施是无效的,因为检查使用的是两个相同的 canary(尽管已被修改)。\
+此外,在受 canary 保护的**线程函数**中发生的缓冲区**溢出**可能被用来**修改存储在 TLS 中的主 canary**。这是因为,可能通过线程的**栈**中的**bof**到达存储 TLS(因此也包括 canary)的内存位置。\
+因此,该缓解措施是无效的,因为检查使用的是两个相同的 canary(尽管被修改过)。\
此攻击在以下写作中进行了描述:[http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
-还可以查看 [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) 的演示,其中提到通常**TLS**是通过**`mmap`**存储的,当创建**线程**的**栈**时,它也是通过 `mmap` 生成的,这可能允许如前所述的溢出。
+还可以查看 [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) 的演示,其中提到通常**TLS**是通过**`mmap`**存储的,当创建**线程**的**栈**时,它也是通过 `mmap` 生成的,这可能允许如前述写作中所示的溢出。
-## 其他示例和参考
+## 其他示例与参考
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
- 64 位,无 PIE,nx,BF canary,在某些内存中写入 ROP 以调用 `execve` 并跳转到那里。
+
+{{#include /banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md
index e526aa727..68da60a1c 100644
--- a/src/binary-exploitation/ios-exploiting.md
+++ b/src/binary-exploitation/ios-exploiting.md
@@ -12,7 +12,7 @@ iOS上用户进程的**虚拟内存地址空间**范围从**0x0到0x8000000000**
#### iOS中的页表级别
-页表以三层的层次结构组织:
+页表分为三个层次的层次结构:
1. **L1页表(第1级)**:
* 这里的每个条目表示一个大范围的虚拟内存。
@@ -57,30 +57,30 @@ iOS上用户进程的**虚拟内存地址空间**范围从**0x0到0x8000000000**
**物理使用后释放**(UAF)发生在:
-1. 一个进程**分配**了一些内存作为**可读和可写**。
+1. 进程**分配**一些内存为**可读和可写**。
2. **页表**被更新以将此内存映射到进程可以访问的特定物理地址。
-3. 该进程**释放**(释放)内存。
-4. 然而,由于一个**错误**,内核**忘记从页表中删除映射**,尽管它将相应的物理内存标记为已释放。
-5. 内核随后可以**重新分配这块“释放”的物理内存**用于其他目的,例如**内核数据**。
+3. 进程**释放**(释放)内存。
+4. 然而,由于一个**错误**,内核**忘记从页表中删除映射**,尽管它将相应的物理内存标记为可用。
+5. 内核可以**重新分配这块“释放”的物理内存**用于其他目的,例如**内核数据**。
6. 由于映射未被删除,进程仍然可以**读写**这块物理内存。
这意味着进程可以访问**内核内存的页面**,这些页面可能包含敏感数据或结构,可能允许攻击者**操纵内核内存**。
### 利用策略:堆喷射
-由于攻击者无法控制哪些特定的内核页面将被分配给释放的内存,他们使用一种称为**堆喷射**的技术:
+由于攻击者无法控制哪些特定的内核页面将分配给释放的内存,他们使用一种称为**堆喷射**的技术:
1. 攻击者在内核内存中**创建大量IOSurface对象**。
2. 每个IOSurface对象在其字段中包含一个**魔法值**,使其易于识别。
-3. 他们**扫描释放的页面**,查看这些IOSurface对象是否落在释放的页面上。
-4. 当他们在释放的页面上找到一个IOSurface对象时,他们可以用它来**读写内核内存**。
+3. 他们**扫描释放的页面**以查看这些IOSurface对象是否落在释放的页面上。
+4. 当他们在释放的页面上找到一个IOSurface对象时,他们可以使用它来**读写内核内存**。
关于此的更多信息请参见[https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)。
### 步骤堆喷射过程
1. **喷射IOSurface对象**:攻击者创建许多带有特殊标识符(“魔法值”)的IOSurface对象。
-2. **扫描释放的页面**:他们检查是否有任何对象已在释放的页面上分配。
+2. **扫描释放的页面**:他们检查是否有任何对象已分配在释放的页面上。
3. **读/写内核内存**:通过操纵IOSurface对象中的字段,他们获得在内核内存中执行**任意读写**的能力。这使他们能够:
* 使用一个字段**读取内核内存中的任何32位值**。
* 使用另一个字段**写入64位值**,实现稳定的**内核读/写原语**。
@@ -142,16 +142,16 @@ return 0;
```
### Achieving Kernel Read/Write with IOSurface
-在内核内存中控制一个 IOSurface 对象(映射到一个可以从用户空间访问的已释放物理页面)后,我们可以将其用于 **任意内核读写操作**。
+在内核内存中控制一个 IOSurface 对象(映射到一个可以从用户空间访问的已释放物理页面)后,我们可以利用它进行 **任意内核读写操作**。
**IOSurface 中的关键字段**
IOSurface 对象有两个关键字段:
-1. **使用计数指针**:允许 **32 位读取**。
-2. **索引时间戳指针**:允许 **64 位写入**。
+1. **使用计数指针**:允许进行 **32 位读取**。
+2. **索引时间戳指针**:允许进行 **64 位写入**。
-通过覆盖这些指针,我们将其重定向到内核内存中的任意地址,从而启用读/写功能。
+通过覆盖这些指针,我们将它们重定向到内核内存中的任意地址,从而启用读/写功能。
#### 32 位内核读取
@@ -195,13 +195,13 @@ set_indexed_timestamp(info.client, info.surface, value);
iosurface_set_indexed_timestamp_pointer(info.object, orig);
}
```
-#### Exploit Flow Recap
+#### 漏洞利用流程回顾
1. **触发物理使用后释放**: 可重用的空闲页面。
2. **喷射IOSurface对象**: 在内核内存中分配许多具有唯一“魔法值”的IOSurface对象。
-3. **识别可访问的IOSurface**: 找到一个在你控制的空闲页面上的IOSurface。
+3. **识别可访问的IOSurface**: 找到一个在你控制的已释放页面上的IOSurface。
4. **滥用使用后释放**: 修改IOSurface对象中的指针,以通过IOSurface方法启用任意**内核读/写**。
-通过这些原语,漏洞提供了对内核内存的受控**32位读取**和**64位写入**。进一步的越狱步骤可能涉及更稳定的读/写原语,这可能需要绕过额外的保护(例如,在较新的arm64e设备上的PPL)。
+通过这些原语,漏洞利用提供了对内核内存的受控**32位读取**和**64位写入**。进一步的越狱步骤可能涉及更稳定的读/写原语,这可能需要绕过额外的保护(例如,在较新的arm64e设备上的PPL)。
{{#include /banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md
index 81e20f28d..9f5e60f0f 100644
--- a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md
+++ b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md
@@ -8,13 +8,13 @@
### Unsorted Bins
-当你释放一个不是快速块的内存块时,它会进入未排序桶。这个桶就像一个列表,新释放的块被添加到前面(“头”)。当你请求一个新的内存块时,分配器从后面(“尾”)查看未排序桶,以找到一个足够大的块。如果未排序桶中的块大于你所需的大小,它会被拆分,前面的部分被返回,剩余的部分留在桶中。
+当你释放一个不是快速块的内存块时,它会进入未排序桶。这个桶就像一个列表,新释放的块会添加到前面(“头”)。当你请求一个新的内存块时,分配器会从未排序桶的后面(“尾”)查看,以找到一个足够大的块。如果未排序桶中的块大于你所需的大小,它会被拆分,前面的部分被返回,剩余的部分留在桶中。
示例:
- 你分配 300 字节(`a`),然后 250 字节(`b`),释放 `a` 并再次请求 250 字节(`c`)。
-- 当你释放 `a` 时,它进入未排序桶。
-- 如果你再次请求 250 字节,分配器在尾部找到 `a` 并将其拆分,返回适合你请求的部分,并将其余部分保留在桶中。
+- 当你释放 `a` 时,它会进入未排序桶。
+- 如果你再次请求 250 字节,分配器会在尾部找到 `a` 并将其拆分,返回适合你请求的部分,并将其余部分保留在桶中。
- `c` 将指向之前的 `a` 并填充 `a` 的内容。
```c
char *a = malloc(300);
@@ -24,12 +24,12 @@ char *c = malloc(250);
```
### Fastbins
-Fastbins用于小内存块。与未排序的bins不同,fastbins将新块添加到头部,创建后进先出(LIFO)行为。如果您请求一个小内存块,分配器将从fastbin的头部提取。
+Fastbins用于小内存块。与未排序的bins不同,fastbins将新块添加到头部,形成后进先出(LIFO)行为。如果您请求一个小内存块,分配器将从fastbin的头部提取。
示例:
-- 您分配四个20字节的块(`a`,`b`,`c`,`d`)。
-- 当您以任何顺序释放它们时,释放的块会被添加到fastbin的头部。
+- 您分配四个每个20字节的块(`a`,`b`,`c`,`d`)。
+- 当您以任何顺序释放它们时,释放的块将添加到fastbin的头部。
- 如果您随后请求一个20字节的块,分配器将从fastbin的头部返回最近释放的块。
```c
char *a = malloc(20);
@@ -45,7 +45,7 @@ b = malloc(20); // c
c = malloc(20); // b
d = malloc(20); // a
```
-## 其他参考资料与示例
+## 其他参考与示例
- [**https://heap-exploitation.dhavalkapil.com/attacks/first_fit**](https://heap-exploitation.dhavalkapil.com/attacks/first_fit)
- [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
@@ -58,3 +58,5 @@ d = malloc(20); // a
- 可以分配一些内存,写入所需值,释放它,重新分配它,由于之前的数据仍然存在,它将根据块中的新预期结构进行处理,从而可以设置值以获取标志。
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
- 在这种情况下,需要在特定块中写入 4,该块是第一个被分配的块(即使在强制释放所有块后)。在每个新分配的块中,其在数组索引中的编号被存储。然后,分配 4 个块(+ 最初分配的),最后一个块将包含 4,释放它们并强制重新分配第一个块,这将使用最后释放的块,即包含 4 的块。
+
+{{#include /banners/hacktricks-training.md}}
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md
index d061c0841..69ed63ee9 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md
@@ -29,7 +29,7 @@
### `com.apple.security.cs.disable-library-validation`
-此权限允许 **加载框架、插件或库,而不需要由 Apple 签名或与主可执行文件具有相同的团队 ID 签名**,因此攻击者可以利用某些任意库加载来注入代码。查看 [**此处获取更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)。
+此权限允许 **加载框架、插件或库,而无需由 Apple 签名或与主可执行文件具有相同的团队 ID**,因此攻击者可以利用某些任意库加载来注入代码。查看 [**此处获取更多信息**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation)。
### `com.apple.private.security.clear-library-validation`
@@ -58,7 +58,7 @@
**iMovie** 和 **Garageband** 拥有此权限。
-有关利用此权限 **获取 iCloud 令牌** 的更多 **信息**,请查看演讲:[**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
+有关 **从该权限获取 iCloud 令牌的漏洞** 的更多 **信息**,请查看演讲:[**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
### `com.apple.private.tcc.manager.check-by-audit-token`
@@ -87,7 +87,7 @@ TODO: 在 [**这份报告**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA
```
### **`kTCCServiceSystemPolicyAllFiles`**
-授予**完全磁盘访问**权限,这是您可以拥有的TCC最高权限之一。
+授予**完全磁盘访问**权限,这是TCC可以拥有的最高权限之一。
### **`kTCCServiceAppleEvents`**
@@ -97,19 +97,19 @@ TODO: 在 [**这份报告**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA
```bash
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
```
-或使它们执行 **任意操作**。
+或使它们执行**任意操作**。
### **`kTCCServiceEndpointSecurityClient`**
-允许在其他权限中 **写入用户的 TCC 数据库**。
+允许在其他权限中**写入用户的 TCC 数据库**。
### **`kTCCServiceSystemPolicySysAdminFiles`**
-允许 **更改** 用户的 **`NFSHomeDirectory`** 属性,从而更改其主文件夹路径,因此允许 **绕过 TCC**。
+允许**更改**用户的**`NFSHomeDirectory`**属性,从而更改其主文件夹路径,因此允许**绕过 TCC**。
### **`kTCCServiceSystemPolicyAppBundles`**
-允许修改应用程序包内的文件(在 app.app 内),这在 **默认情况下是不允许的**。
+允许修改应用程序包内的文件(在 app.app 内),这在默认情况下是**不允许的**。