# Octal

> **Um guia abrangente sobre o sistema octal** – desde os fundamentos da numeração posicional até aplicações práticas em computação, permissões de arquivo, programação e análise forense.

***

## 🔍 Introdução ao Sistema Octal

### 1.1 O que é Octal?

O **sistema octal** (base 8) é um sistema de numeração posicional que utiliza **oito símbolos** para representar valores:

| **Símbolo** | **Valor Decimal** |
| ----------- | ----------------- |
| 0           | 0                 |
| 1           | 1                 |
| 2           | 2                 |
| 3           | 3                 |
| 4           | 4                 |
| 5           | 5                 |
| 6           | 6                 |
| 7           | 7                 |

O nome "octal" vem do latim *octo* (oito). É também chamado de "base 8" ou, em contextos históricos, "sistema octonário".

### 1.2 Histórico e Origem

O sistema octal tem raízes históricas importantes na computação:

| **Ano**                 | **Evento**                                                                                                 |
| ----------------------- | ---------------------------------------------------------------------------------------------------------- |
| **Século XVII**         | Sistemas de contagem baseados em 8 usados por algumas culturas (Yuki, Pomo)                                |
| **Década de 1950**      | Computadores como o **IBM 7090** usavam palavras de 36 bits, naturalmente divisíveis em grupos de 3 bits   |
| **Década de 1960-1970** | Octal era a representação padrão para depuração em sistemas como PDP-11, DEC-10, e primeiros sistemas Unix |
| **Década de 1980**      | Hexadecimal começa a ganhar popularidade com arquiteturas de 8, 16 e 32 bits                               |
| **Atualidade**          | Octal mantém relevância principalmente para permissões de arquivo Unix e alguns contextos específicos      |

**Por que o octal era popular?**

* Computadores antigos frequentemente usavam palavras de **12, 18, 24 ou 36 bits** – números divisíveis por 3
* Cada dígito octal representa exatamente 3 bits
* Mais compacto que binário, mais fácil que decimal para engenheiros

### 1.3 Por que o Octal é Relevante?

Apesar de menos utilizado que o hexadecimal, o octal mantém importância em áreas específicas:

| **Área**                   | **Aplicação**                                    |
| -------------------------- | ------------------------------------------------ |
| **Sistemas Unix/Linux**    | Permissões de arquivo (`chmod 755`, `umask 022`) |
| **Programação C/Assembly** | Caracteres de escape (`\033`, `\0`)              |
| **Sistemas Embarcados**    | Configuração de portas, flags de hardware        |
| **Análise Forense**        | Permissões de arquivo em sistemas Unix           |
| **Legados**                | Manutenção de sistemas antigos, PDP-11, VAX      |

***

## 📐 Fundamentos Matemáticos

### 2.1 Sistemas de Numeração: Decimal, Binário, Octal e Hexadecimal

#### Sistema Octal (Base 8)

* **Símbolos**: 0, 1, 2, 3, 4, 5, 6, 7
* **Posições**: ... 8³, 8², 8¹, 8⁰
* **Exemplo**: 237₁₀? ou 237₈?

**Exemplo:** 237₈ para decimal

```
237₈ = (2 × 8²) + (3 × 8¹) + (7 × 8⁰) = (2 × 64) + (3 × 8) + (7 × 1) = 128 + 24 + 7 = 159₁₀
```

### 2.2 Conversões entre Sistemas

#### Decimal para Octal

**Método: Divisões sucessivas por 8**

**Exemplo:** Converter 245₁₀ para octal

| Passo | Divisão | Quociente | Resto |
| ----- | ------- | --------- | ----- |
| 1     | 245 ÷ 8 | 30        | 5     |
| 2     | 30 ÷ 8  | 3         | 6     |
| 3     | 3 ÷ 8   | 0         | 3     |

Lendo os restos de baixo para cima: **365₈**

**Verificação:** 3×64 + 6×8 + 5 = 192 + 48 + 5 = 245 ✅

#### Binário para Octal

**Método:** Agrupar bits em grupos de 3, da direita para a esquerda

| Grupo de 3 bits | Valor Octal |
| --------------- | ----------- |
| 000             | 0           |
| 001             | 1           |
| 010             | 2           |
| 011             | 3           |
| 100             | 4           |
| 101             | 5           |
| 110             | 6           |
| 111             | 7           |

**Exemplo:** Converter 11010110₂ para octal

```
11 010 110  (agrupar da direita para esquerda, completar com zeros à esquerda)
011 010 110  (completar para 3 bits: 011, 010, 110)
 3   2   6   (converter cada grupo)
Resultado: 326₈
```

#### Octal para Binário

**Método:** Converter cada dígito octal em seu equivalente de 3 bits

**Exemplo:** Converter 365₈ para binário

```
3 = 011
6 = 110
5 = 101
Resultado: 011110101₂ = 11110101₂ (sem o zero à esquerda)
```

#### Octal para Hexadecimal

**Método:** Converter octal → binário → hexadecimal

**Exemplo:** Converter 365₈ para hexadecimal

```
365₈ = 011110101₂ (11 bits)
Agrupar em nibbles (4 bits): 0111 1010 1? (precisa completar)
0111 1010 1000 (completar com zeros para 12 bits)
 7    A    8
Resultado: 7A8₁₆? Não – verificar!

Correção:
365₈ = 3 6 5
     = 011 110 101
     = 0000 1111 0101 (agrupar em 4 bits)
     = 0    F    5
Resultado: 0xF5₁₆ = 245₁₀? Não, algo errado.

Cálculo correto:
365₈ = 245₁₀
245₁₀ = 0xF5₁₆ ✅
Então 365₈ = F5₁₆
```

### 2.3 Operações Aritméticas em Octal

#### Adição Octal

| Regra                                             | Exemplo                                             |
| ------------------------------------------------- | --------------------------------------------------- |
| Somar como decimal, converter quando ultrapassa 7 | 5 + 3 = 10 (decimal) = 8 + 2 → resultado 2, carry 1 |
| Carry quando soma ≥ 8                             |                                                     |

**Exemplo:** 365₈ + 427₈

```
   3 6 5
+  4 2 7
--------
  1 0 1 4

Passo a passo:
1. 5 + 7 = 12 → 12 - 8 = 4, carry 1
2. 6 + 2 + 1 = 9 → 9 - 8 = 1, carry 1
3. 3 + 4 + 1 = 8 → 8 - 8 = 0, carry 1
4. carry final = 1

Resultado: 1014₈
```

#### Subtração Octal

**Exemplo:** 1014₈ - 427₈

```
   1 0 1 4
-  0 4 2 7
-----------
   0 3 6 5

Passo a passo:
1. 4 - 7 = não pode → empresta 1 → 12 - 7 = 5
2. 0 (após empréstimo) - 2 = não pode → empresta 1 → 8 - 2 = 6
3. 0 (após empréstimo) - 4 = não pode → empresta 1 → 8 - 4 = 4? Não, verificar.

Correção:
Posições: [1] [0] [1] [4]
[0] [4] [2] [7]

Posição 0 (unidades): 4 - 7 → empresta 1 → 12 - 7 = 5
Posição 1: 1 (após empréstimo) - 2 → empresta 1 → 9 - 2 = 7 (pois 1 - 1 = 0, mas emprestou)
Melhor fazer passo a passo cuidadoso.
```

***

## 💻 Representação em Computação

### 3.1 Relação com Binário: 3 Bits = 1 Dígito Octal

A relação fundamental que torna o octal útil é que **cada dígito octal representa exatamente 3 bits**:

| **Bits** | **Octal** | **Bits** | **Octal** |
| -------- | --------- | -------- | --------- |
| 000      | 0         | 100      | 4         |
| 001      | 1         | 101      | 5         |
| 010      | 2         | 110      | 6         |
| 011      | 3         | 111      | 7         |

**Vantagem:** Representação compacta de dados binários para sistemas com palavras de comprimento múltiplo de 3 bits.

### 3.2 Notação Octal em Diferentes Linguagens

| **Linguagem**  | **Notação**           | **Exemplo**                    |
| -------------- | --------------------- | ------------------------------ |
| **C/C++**      | `0` prefix            | `int x = 0755;` (755₈ = 493₁₀) |
| **Python 2**   | `0` prefix            | `x = 0755`                     |
| **Python 3**   | `0o` prefix           | `x = 0o755`                    |
| **JavaScript** | `0o` prefix (ES6+)    | `let x = 0o755;`               |
| **Java**       | `0` prefix (obsoleto) | `int x = 0755;`                |
| **Rust**       | `0o` prefix           | `let x = 0o755;`               |
| **Go**         | `0o` prefix           | `x := 0o755`                   |
| **Ruby**       | `0` prefix ou `0o`    | `x = 0755`                     |
| **PHP**        | `0` prefix            | `$x = 0755;`                   |
| **Perl**       | `0` prefix            | `$x = 0755;`                   |

**Atenção:** Em Python 3, Java (moderno) e outras linguagens, o prefixo `0` é obsoleto ou inválido para octal.

### 3.3 Endianness e Octal

A endianness não afeta diretamente a representação octal, mas sim a ordem dos bytes. Para valores multi-byte, o octal é aplicado após a determinação do valor numérico.

***

## 🎯 Aplicações Práticas do Octal

### 4.1 Permissões de Arquivo em Unix/Linux

As permissões de arquivo Unix são a aplicação mais conhecida do sistema octal.

**Estrutura das permissões:**

```
-rwxr-xr-x 1 user group 1024 Mar 27 12:00 file.txt
```

| **Campo** | **Descrição**                                          |
| --------- | ------------------------------------------------------ |
| `-`       | Tipo de arquivo (- = regular, d = diretório, l = link) |
| `rwx`     | Permissões do proprietário (user)                      |
| `r-x`     | Permissões do grupo (group)                            |
| `r-x`     | Permissões de outros (others)                          |

**Valores octais por permissão:**

| **Permissão** | **Valor Octal** | **Bits** |
| ------------- | --------------- | -------- |
| ---           | 0               | 000      |
| --x           | 1               | 001      |
| -w-           | 2               | 010      |
| -wx           | 3               | 011      |
| r--           | 4               | 100      |
| r-x           | 5               | 101      |
| rw-           | 6               | 110      |
| rwx           | 7               | 111      |

### 4.2 Chmod: O Coração Octal

O comando `chmod` (change mode) utiliza valores octais para definir permissões:

```bash
chmod 755 arquivo
```

**Análise do 755₈:**

```
7 = 111 = rwx (proprietário)
5 = 101 = r-x (grupo)
5 = 101 = r-x (outros)

Resultado: -rwxr-xr-x
```

**Exemplos comuns:**

| **Octal** | **Permissões** | **Descrição**                                                |
| --------- | -------------- | ------------------------------------------------------------ |
| 400       | r--------      | Apenas leitura para proprietário                             |
| 600       | rw-------      | Leitura/escrita apenas para proprietário                     |
| 644       | rw-r--r--      | Leitura/escrita para proprietário, leitura para grupo/outros |
| 664       | rw-rw-r--      | Leitura/escrita para proprietário/grupo, leitura para outros |
| 755       | rwxr-xr-x      | Comum para executáveis                                       |
| 750       | rwxr-x---      | Apenas proprietário e grupo têm acesso                       |
| 777       | rwxrwxrwx      | Todos têm acesso total (inseguro)                            |

### 4.3 Umask: Máscara de Permissões Padrão

O **umask** (user file-creation mode mask) define as permissões padrão para novos arquivos e diretórios.

**Como funciona:**

* Permissão base para arquivos: 666 (rw-rw-rw-)
* Permissão base para diretórios: 777 (rwxrwxrwx)
* Umask subtrai (bitwise AND com complemento) da permissão base

**Exemplo:** `umask 022`

```
Permissão base (arquivo): 666 (110 110 110)
Umask:                  022 (000 010 010)
Complemento:           111 101 101
Resultado (AND):       110 100 100 = 644 (rw-r--r--)
```

**Umask comuns:**

| **Umask** | **Permissão Arquivo** | **Permissão Diretório** | **Descrição**             |
| --------- | --------------------- | ----------------------- | ------------------------- |
| 022       | 644 (rw-r--r--)       | 755 (rwxr-xr-x)         | Padrão em muitos sistemas |
| 002       | 664 (rw-rw-r--)       | 775 (rwxrwxr-x)         | Grupo compartilhado       |
| 027       | 640 (rw-r-----)       | 750 (rwxr-x---)         | Restritivo                |

### 4.4 Setuid, Setgid e Sticky Bit

Além das permissões básicas, existem três bits especiais representados por um quarto dígito octal:

| **Bit**        | **Valor Octal** | **Descrição**                                                               |
| -------------- | --------------- | --------------------------------------------------------------------------- |
| **Setuid**     | 4               | Executa com permissões do proprietário (em arquivos)                        |
| **Setgid**     | 2               | Executa com permissões do grupo; em diretórios, novos arquivos herdam grupo |
| **Sticky Bit** | 1               | Em diretórios, apenas proprietário pode excluir arquivos                    |

**Exemplos:**

```bash
# Setuid: /usr/bin/passwd (4755)
chmod 4755 arquivo   # rwsr-xr-x

# Setgid: diretório compartilhado (2770)
chmod 2770 diretorio   # rwxrws---

# Sticky bit: /tmp (1777)
chmod 1777 /tmp        # rwxrwxrwt
```

### 4.5 Controles de Acesso em Sistemas Embarcados

Em sistemas embarcados, configurações de hardware e periféricos frequentemente usam valores octais:

```c
// Configuração de portas em microcontroladores
#define PORT_MODE 0b10110010  // binário
#define PORT_MODE 0o262       // octal (equivalente)
```

***

## 💻 Octal em Programação

### 5.1 Literais Octais em Linguagens

```c
// C/C++
int perms = 0755;        // 755₈ = 493₁₀
printf("%o\n", perms);   // Saída: 755
```

```python
# Python 3
perms = 0o755           # 755₈ = 493₁₀
print(oct(perms))       # Saída: 0o755
```

```javascript
// JavaScript (ES6+)
let perms = 0o755;      // 755₈ = 493₁₀
console.log(perms.toString(8)); // Saída: "755"
```

### 5.2 Armadilhas: O Problema do Leading Zero

Em algumas linguagens, um zero à esquerda pode ser interpretado como octal:

```python
# Python 2 (comportamento problemático)
x = 010  # 8 em decimal (não 10!)

# Python 3 (corrigido)
x = 010  # SyntaxError
x = 0o10 # 8 em decimal
```

```javascript
// JavaScript (strict mode proíbe)
"use strict";
let x = 010; // SyntaxError
let y = 0o10; // 8 em decimal
```

### 5.3 Formatação e Conversão

```c
// C/C++ - formatação octal
int x = 493;
printf("%o\n", x);   // "755"
printf("%#o\n", x);  // "0755"
```

```python
# Python - conversões
x = 493
print(oct(x))        # "0o755"
print(format(x, 'o')) # "755"
```

```bash
# Bash - conversões
echo $((0755))       # 493
printf "%o\n" 493    # 755
```

### 5.4 Flags e Máscaras em C/C++

Em programação de sistemas, octais são usados para flags e máscaras:

```c
// Flags de abertura de arquivo
#define O_RDONLY 0o0
#define O_WRONLY 0o1
#define O_RDWR   0o2
#define O_CREAT  0o100
#define O_TRUNC  0o1000
#define O_APPEND 0o2000

// Uso
int fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
```

***

## 🌐 Octal em Redes e Telecomunicações

### 6.1 Máscaras de Sub-rede (Histórico)

Historicamente, algumas máscaras de sub-rede eram representadas em octal:

| **Octal** | **Binário** | **Máscara Decimal** |
| --------- | ----------- | ------------------- |
| 377       | 11111111    | 255                 |
| 177       | 01111111    | 127                 |

### 6.2 Códigos de Controle de Erro

Em alguns protocolos legados, códigos de erro e controle eram representados em octal.

### 6.3 Protocolos Legados

Sistemas como PDP-11, VAX e primeiras versões do Unix usavam octal extensivamente para depuração de rede.

***

## 🔬 Análise Forense e Octal

### 7.1 Análise de Permissões em Investigações

Em investigações forenses em sistemas Unix/Linux, a análise de permissões é crucial:

```bash
# Verificar permissões suspeitas
find / -perm -4000 -type f 2>/dev/null  # Setuid binaries
find / -perm -2000 -type f 2>/dev/null  # Setgid binaries
find / -perm -1000 -type d 2>/dev/null  # Sticky bit directories
```

### 7.2 Artefatos em Sistemas Unix/Linux

| **Artefato**               | **Localização**          | **Valor Octal Comum** |
| -------------------------- | ------------------------ | --------------------- |
| SSH private keys           | `~/.ssh/id_rsa`          | 600                   |
| SSH authorized\_keys       | `~/.ssh/authorized_keys` | 644                   |
| Passwd file                | `/etc/passwd`            | 644                   |
| Shadow file                | `/etc/shadow`            | 640 (ou 600)          |
| System binaries            | `/bin/*`, `/usr/bin/*`   | 755                   |
| World-writable directories | `/tmp`                   | 1777                  |

### 7.3 Recuperação de Dados e Carving

Em análise forense, a identificação de permissões em backups e imagens de disco pode ser feita via octal:

```bash
# Extrair permissões de arquivos de uma imagem
fls -r -l /dev/sda1 | awk '{print $1, $2}'
```

***

## 🛠️ Ferramentas para Trabalhar com Octal

### 8.1 Comandos de Linha de Comando

```bash
# Exibir permissões em octal
stat -c "%a %n" arquivo
# Saída: 644 arquivo

# Chmod com octal
chmod 755 arquivo

# Umask atual
umask
# Saída: 0022

# Octal para decimal
echo $((0755))        # 493

# Decimal para octal
printf "%o\n" 493     # 755
```

```bash
# Encontrar arquivos por permissão octal
find . -perm 644 -type f
find . -perm -4000 -type f    # setuid
find . -perm -2000 -type f    # setgid
find . -perm -1000 -type d    # sticky
```

### 8.2 Calculadoras e Conversores

| **Ferramenta**         | **Descrição**               |
| ---------------------- | --------------------------- |
| **bc**                 | `echo "obase=8; 493" \| bc` |
| **Python**             | `oct(493)`, `int('755', 8)` |
| **Windows Calculator** | Modo Programador → OCT      |
| **CyberChef**          | Conversor Octal/Decimal     |

### 8.3 Ferramentas de Análise de Permissões

| **Ferramenta** | **Descrição**                         |
| -------------- | ------------------------------------- |
| **stat**       | Exibe permissões em octal e simbólico |
| **ls**         | `ls -l` para visualização simbólica   |
| **getfacl**    | Exibe ACLs (quando usadas)            |
| **namei**      | Analisa permissões de caminho         |

***

## 🔬 Exemplos Práticos

### 9.1 Calculando Permissões com Chmod

**Cenário:** Definir permissões `rwxr-x--x`

```
rwx = 111 = 7
r-x = 101 = 5
--x = 001 = 1

Resultado: 751
Comando: chmod 751 arquivo
```

### 9.2 Decodificando uma Máscara Umask

**Cenário:** Umask 027

```
Umask: 027 = 000 010 111 (binário)

Permissão base arquivo (666): 110 110 110
Complemento umask:           111 101 000 (inverso de 000 010 111)
AND:                         110 100 000 = 640 (rw-r-----)

Permissão base diretório (777): 111 111 111
Complemento umask:               111 101 000
AND:                             111 101 000 = 750 (rwxr-x---)
```

### 9.3 Convertendo Permissões em Texto

**Cenário:** Converter `rw-rw-r--` para octal

```
rw- = 110 = 6
rw- = 110 = 6
r-- = 100 = 4

Resultado: 664
```

### 9.4 Analisando um Binário com Strings Octais

Em análise de malware, strings octais podem aparecer como ofuscação:

```python
# Exemplo de string octal em código malicioso
payload = "\150\164\164\160\163\072\057\057\145\166\151\154\056\143\157\155"
# Decodifica para: https://evil.com
```

***

## 📊 Tabelas de Referência Rápida

### 10.1 Tabela de Conversão Decimal-Octal-Binário

| **Decimal** | **Octal** | **Binário (3 bits)** |
| ----------- | --------- | -------------------- |
| 0           | 0         | 000                  |
| 1           | 1         | 001                  |
| 2           | 2         | 010                  |
| 3           | 3         | 011                  |
| 4           | 4         | 100                  |
| 5           | 5         | 101                  |
| 6           | 6         | 110                  |
| 7           | 7         | 111                  |
| 8           | 10        | 001 000              |
| 9           | 11        | 001 001              |
| 10          | 12        | 001 010              |

### 10.2 Tabela de Permissões Unix (Octal)

| **Octal** | **Binário** | **Permissões (simbólico)** | **Descrição**               |
| --------- | ----------- | -------------------------- | --------------------------- |
| 0         | 000         | ---                        | Nenhuma                     |
| 1         | 001         | --x                        | Apenas execução             |
| 2         | 010         | -w-                        | Apenas escrita              |
| 3         | 011         | -wx                        | Escrita e execução          |
| 4         | 100         | r--                        | Apenas leitura              |
| 5         | 101         | r-x                        | Leitura e execução          |
| 6         | 110         | rw-                        | Leitura e escrita           |
| 7         | 111         | rwx                        | Leitura, escrita e execução |

### 10.3 Tabela de Caracteres de Escape Octais

| **Octal** | **Caractere** | **Descrição**   |
| --------- | ------------- | --------------- |
| \0        | NUL           | Null character  |
| \007      | BEL           | Bell            |
| \010      | BS            | Backspace       |
| \011      | TAB           | Horizontal tab  |
| \012      | LF            | Line feed       |
| \015      | CR            | Carriage return |
| \033      | ESC           | Escape          |
| \040      | SPACE         | Space           |
| \177      | DEL           | Delete          |

***

## 📚 Conclusão

O sistema octal, embora menos utilizado que o hexadecimal, mantém sua relevância em áreas específicas da computação:

* **Sistemas Unix/Linux**: Permissões de arquivo são a aplicação mais significativa
* **Programação de sistemas**: Caracteres de escape e flags
* **Análise forense**: Permissões como indicadores de comprometimento
* **Sistemas embarcados**: Configuração de hardware

Dominar o octal é essencial para:

* Administradores de sistemas Unix/Linux
* Programadores de sistemas e embarcados
* Profissionais de segurança da informação
* Analistas forenses

Compreender a relação entre octal e binário (3 bits por dígito) é a chave para sua aplicação eficaz, especialmente no contexto de permissões de arquivo onde o octal reina absoluto.

***

## 🔗 Referências

### Documentação

* [POSIX chmod Specification](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/chmod.html)
* [Linux man pages: chmod(1), umask(2)](https://man7.org/linux/man-pages/man1/chmod.1.html)

### Livros

* **"The Unix Programming Environment"** – Brian W. Kernighan, Rob Pike
* **"Advanced Programming in the Unix Environment"** – W. Richard Stevens
* **"The C Programming Language"** – Brian W. Kernighan, Dennis M. Ritchie

### Ferramentas

* [CyberChef – Octal Converter](https://gchq.github.io/CyberChef/)
* [Unix Permissions Calculator](https://chmod-calculator.com/)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://0xmorte.gitbook.io/bibliadopentestbr/conceitos/sistemas-numericos/octal.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
