journalctl -u micro – Telegram
journalctl -u micro
94 subscribers
2.16K photos
210 videos
280 files
1.43K links
Esperienze e consigli di uno sviluppatore tech−unenthusiast

creation — 2021-04-29
owner — @Microeinstein

networks
@sigma_hub Σ
@ageiroumena
Download Telegram
E invece, sarebbe stato bello
😢2
Molto triste cercare documentazione per il kernel linux — spesso e volentieri trovi codice vecchio (esempio linux 2.6) che con tutta probabilità è stato cambiato, spostato o rimosso...

Qui mancano un sacco di funzioni
https://www.kernel.org/doc/html/latest

L'unico workaround: cercare nei sorgenti indicizzati
https://elixir.bootlin.com/linux/latest/source/include/linux
CE L'HO FATTA

$ ln -s /bin/bash alter-me

$ clear; make && {
sudo insmod hello2.ko;
(export PATH=".:$PATH"; alter-me);
sudo rmmod hello2.ko;
}
1
Ok ecco i passaggi chiave di merda:

0. definizioni
typedef unsigned long addr_t;
typedef unsigned char byte;
typedef const char __user *const __user *usr_str_arr;

// max size mmaped to userspace (8KB+)
#define MAX_SIZE (PAGE_SIZE * 2)

static byte *MYBUFF;

addr_t (*orig_do_mmap)(
struct file *file, addr_t addr, addr_t len,
addr_t prot, addr_t flags, //vm_flags_t vm_flags,
addr_t pgoff, addr_t *populate, struct list_head *uf
);


1. recuperare la funzione do_mmap (il simbolo è nascosto)
orig_do_mmap = (void*)kallsyms_lookup_name("do_mmap");

2. allocare nuova memoria kernel con kmalloc (o altro, ma con passaggi diversi in seguito)
⚠️ la nuova memoria deve essere page-aligned
MYBUFF = kmalloc(MAX_SIZE, GFP_USER);

3. ogni chiamata ad una syscall ha associata il processo chiamante nella macro current — recuperare tale processo e la struttura di memory management
struct task_struct *task = current;
struct mm_struct *mm = get_task_mm(task);

4. wrappare le prossime modifiche alla memoria con un lock in scrittura
mmap_write_lock_killable(mm);
mmap_write_unlock(mm);

5. aggiungere nuovo spazio di indirizzamento (virtual memory address) al processo [extremely hard] senza mappare alcun file (anonimo)
addr_t populate;
addr_t vmaddr = orig_do_mmap(
0, 0,
MAX_SIZE
,
PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS,
0, &populate, NULL
);

6. recuperare la struttura vma dall'indirizzo ottenuto
vma = vma_lookup(mm, vmaddr);

7. recuperare il numero di pagina della memoria inizialmente allocata con kmalloc
addr_t pfn = virt_to_phys((void*)kaddr) >> PAGE_SHIFT;

8. mappare la pagina al processo
remap_pfn_range(vma, vma->vm_start,  pfn,  MAX_SIZE, vma->vm_page_prot)

9. l'environment è un puntatore ad un array di stringhe [quindi array di puntatori] null-terminato — è salvato nel registro dx della syscall — non è possibile modificarlo direttamente, perciò bisogna copiare tutto nella memoria allocata e patchare lì
usr_str_arr *envp = (usr_str_arr*)&regs->dx;

📜 struttura custom:
MYBUFF —> {
ptr1, ptr2, NULL,
| |
"aa=1\0", "bb=2\0", NULL
}
⚠️ nonostante si possa usare MYBUFF per scrivere tutto, è necessario salvare i puntatori delle stringhe con indirizzi utente (quindi vmaddr e incrementandolo man mano)

10. alterare il registro con il puntatore alla memoria con l'indirizzo utente
*envp = (usr_str_arr)vmaddr;

11. eseguire la vera syscall
👍1
journalctl -u micro
hello2.c
hello2.c
12.3 KB
Full code

Dopo l'inserimento del modulo,
se un processo conterrà "alter-me" in argv[0],
si troverà la variabile d'ambiente FUCKING_EPIC=1
Kernel Linux
> unsigned long do_mmap(...)
> return -EINVAL
> (EINVAL = 22)

https://elixir.bootlin.com/linux/latest/source/mm/mmap.c#L1191

Non ha senso o sbaglio?
Ogni volta che avvio LibreOffice mi si apre sempre in una finestrella 24x24px, non capirò mai la ragione
Desktop icons
small, 2 text lines
plasma [w/ hacks] vs win7
Top, su questo portatile si può accedere alle opzioni avanzate del bios senza patchare

> hold Fn + Tab
> press Power
> count 3sec
> release Fn + Tab
> spam F2
Ok ci sono così tante opzioni che fa venire il mal di testa — mi fermo con i video
Dalle opzioni avanzate ho attivato gli idle-state C8 C9 C10 della CPU, sembra andare (?)

• non ricordo se andasse anche prima
• non sono sicuro che siano effettivamente questi c-states (dalle descrizioni mi sembra un po' troppo)