<index> / <experiments> / ansi-ink-phile
[ en | fr ]
┌───────────────────────┐
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
│                       │
└───────────────────────┘
Encre ANSI pour les Philes
~ CuB3y0nd
/*----------------------------------------------------------------------------*
|*                         ENTROPIC / ANSI INK                                *|
|*           grammaire ANSI portable pour la couleur en texte brut            *|
*----------------------------------------------------------------------------*/

--[ sommaire ]-------------------------------------------------------------//---

  00  .text.summary    ................................................. contrat
  01  .text.inline     ............................................ source/rendu
  02  .rodata.palette  ............................................... map roles
  03  .data.ink        ....................................... surcharges denses
  3a  .data.e_ident    ............................................. ELF e_ident
  3b  .data.p_flags    ................................................. p_flags
  3c  .stack.savedrip  ........................................... RIP sauvegard
  04  .text.writer     ................................................ notation
  05  .debug.vmmap     .................................................. vm map
  06  .note.rules      .......................................... erreurs dures
  07  .note.refs       ............................................. sources doc

[ 0. Résumé ]─────────────────────────────────────────────────────────────//────

    primitive : couleur ANSI de premier plan sur texte fixed-width
    inline    : #[role|texte]
    bloc      : --[ ink ]-- + voie texte + voie masque
    palette   : Tokyo Night ANSI [0][1], 16 rôles de premier plan
    erreur    : un rôle inconnu fait échouer le build

L'encre ANSI est une petite couche de notation pour le texte `.phile`. Elle a 
deux missions :
    garder la source lisible dans un terminal ;
    poser la couleur exactement là où un octet, un bit, un champ ou un nom compt
e.

Ce n'est pas du HTML, du Markdown, ni un langage sémantique d'annotation 
binaire. La prose porte toujours l'argument ; l'encre dit juste à l'œil où
atterrir.
    .--[ NOTE : signal parcimonieux ]--------------------.
    | Traite la couleur comme un breakpoint : pose-la    |
    | seulement où le lecteur doit s'arrêter et inspecter.|
    '----------------------------------------------------'

[ 1. Encre inline ]───────────────────────────────────────────────────────//────

L'encre inline sert aux spans parsemés dans la prose ordinaire :
    source : #[G|r--] marque la lecture seule, #[R|PF_X] marque l'exécution.
    rendu  : r-- marque la lecture seule, PF_X marque l'exécution.

La grammaire est volontairement une seule forme :
    #[role|texte]

Les noms de rôle les plus courts sont des octets ANSI uniques :
    red green yellow blue magenta cyan

Les couleurs vives utilisent les noms courts en majuscules :
    bright-red bright-green bright-yellow bright-blue
    bright-magenta bright-cyan bright-black bright-white

Les noms longs sont acceptés quand la lisibilité de la source compte :
    source : #[bright-cyan|limite de champ]
    rendu  : limite de champ

L'échappement est local :
    #[r|syntaxe littérale]
    échapper un pipe : |
    échapper un crochet fermant : ]

[ 2. Palette ]────────────────────────────────────────────────────────────//────

La palette suit les couleurs de terminal Tokyo Night [1], mais reste de forme 
ANSI, pas de forme métier. Elle est assez petite pour être mémorisée et assez
stricte pour échouer rapidement quand une faute de frappe se glisse dans un
phile.
    .--[ ABI de la palette ]-------------------------.
    | 16 noms en entrée, un foreground déterministe. |
    | typo == build cassé ; alias drift == bug.      |
    '------------------------------------------------'

    k black          K bright-black
    r red            R bright-red
    g green          G bright-green
    y yellow         Y bright-yellow
    b blue           B bright-blue
    m magenta        M bright-magenta
    c cyan           C bright-cyan
    w white          W bright-white

Map des rôles :
    .--[ map des rôles ]-----------------------------------------.
    | C  syntaxe / délimiteur / limite de champ                  |
    | G  parse valide / bit set / signal récupéré                |
    | Y  input contrôlé / offset / voie sélectionnée             |
    | R  exécutable / dangereux / preuve négative                |
    | K  padding / zéro / bruit de fond                          |
    | B  plage d'adresses / région mappée                        |
    | M  symbole / nom d'objet / mapping externe                 |
    '------------------------------------------------------------'

Page palette du terminal :
+--[ normal ]-----------------------------------------------------------------+
| 00 k.black        01 r.red          02 g.green        03 y.yellow           |
| 04 b.blue         05 m.magenta      06 c.cyan         07 w.white            |
+--[ bright ]-----------------------------------------------------------------+
| 08 K.bright-black 09 R.bright-red   0a G.bright-green 0b Y.yellow           |
| 0c B.bright-blue  0d M.bright-mag   0e C.bright-cyan  0f W.white            |
+--[ end ]--------------------------------------------------------------------+

Si un rôle est difficile à distinguer sur cette bande, ne lui fais pas porter le 
seul signal important d'une vraie note d'exploit.
[ 3. Blocs d'encre ]──────────────────────────────────────────────────────//────

Utilise la forme bloc quand un artefact a beaucoup de spans colorés. La source 
reste deux voies de texte brut :
    voie texte  : commence par |
    voie masque : commence par ~
    no-op       : "." ou espace laisse le caractère inchangé

Le masque est à la granularité du caractère, donc la surcharge peut pointer la 
moitié d'un champ, un octet ou un bit de permission sans changer l'artefact.
[ 3.1 Voie octet ]────────────────────────────────────────────────────────//────

 e_ident  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00

    R  magic ELF
    C  octet de classe
    G  octets endian/version
    K  padding zéro

Cette ligne d'en-tête est ennuyeuse exprès : elle prouve l'alignement avant 
qu'une annotation maline n'apparaisse.
[ 3.2 Voie flags ]────────────────────────────────────────────────────────//────

 p_flags  0x00000005  00000101b  PF_R=1  PF_W=0  PF_X=1

Ici le vert marque les bits readable activés, le noir marque les chiffres de 
fond, et le rouge marque la permission exécutable.
[ 3.3 Voie stack ]────────────────────────────────────────────────────────//────

 rbp-10  41 41 41 41 41 41 41 41  | AAAAAAAA | sled contrôlé
 rbp-08  00 9b 2f 74 f8 7f 00 00  | ../t.... | canari, à garder intact
 rbp+08  90 10 40 00 00 00 00 00  | ..@..... | RIP sauvegardé

    Y  padding contrôlé
    G  octets de canari à préserver
    C  cible de retour / RIP sauvegardé
    K  extension zéro

[ 4. L'écrire ]───────────────────────────────────────────────────────────//────

La source littérale reste destinée à être éditée à la main. Un bloc compact :
    | rbp+08  90 10 40 00 00 00 00 00
    ~         CC CC CC KK KK KK KK KK

rend comme :
 rbp+08  90 10 40 00 00 00 00 00

Contraste inline :
    source : #[Y|offset 0x200] contient #[C|encrpted_img]
    rendu  : offset 0x200 contient encrpted_img

    source : #[R|CBC continu] échoue ; #[G|CBC par PEB] survit.
    rendu  : CBC continu échoue ; CBC par PEB survit.

    .--[ dispatch ]----------------------------------.
    | 1 octet d'intérêt    -> encre inline           |
    | octets alignés       -> bloc d'encre           |
    | chemin de raisonn.   -> prose simple           |
    '------------------------------------------------'

[ 5. Lignes de debug ]────────────────────────────────────────────────────//────

L'encre inline marche pour une note de debugger parcimonieuse :
    pwndbg> x/gx $rsp
    0x7fffffffe3d8: 0x4141414141414141
    0x7fffffffe3e0: 0x0000000000401090  ; saved rip

Quand toute la ligne est une carte, utilise un masque :
 00400000-00401000 r--p 00000000 ./a.out         ; en-têtes ELF
 00401000-00402000 r-xp 00001000 ./a.out         ; .text, exécutable
 7ffffffde000-7ffffffff000 rw-p 00000000 [stack] ; stack utilisateur

    B  plage d'adresses
    G  permission readable/writable
    R  permission exécutable
    K  champ offset/padding
    M  objet mappé

[ 6. Règles ]─────────────────────────────────────────────────────────────//────

Rôles inline acceptés :
    .--[ rôles inline acceptés ]---------------------------------------.
    | court  : k r g y b m c w    K R G Y B M C W                      |
    | long   : black red green yellow blue magenta cyan white          |
    | bright : bright-black bright-red bright-green bright-yellow      |
    |          bright-blue bright-magenta bright-cyan bright-white     |
    | forme  : #[role|texte]                                           |
    '------------------------------------------------------------------'

Octets de masque acceptés :
    .--[ octets de masque ]--------------------.
    | k r g y b m c w    K R G Y B M C W       |
    | no-op : . ou espace                      |
    '------------------------------------------'

Tout le reste est rejeté. Une faute de frappe dans la notation de couleur doit 
échouer comme une faute de frappe dans une adresse, un nom de registre, ou une
constante d'exploit.
[ 7. Références ]─────────────────────────────────────────────────────────//────

    [0] Thème VS Code Tokyo Night
        https://github.com/tokyo-night/tokyo-night-vscode-theme

    [1] Palette ANSI iTerm Tokyo Night
        fichier : tokyo-night.itermcolors
        repo    : tokyo-night/tokyo-night-vscode-theme

--[ fin de la grammaire ]--------------------------------------------------//---