journalctl -u micro – Telegram
journalctl -u micro
93 subscribers
2.17K photos
210 videos
287 files
1.44K links
Esperienze e consigli di uno sviluppatore tech−unenthusiast

creation — 2021-04-29
owner — @Microeinstein

networks
@sigma_hub Σ
@ageiroumena
Download Telegram
BIOS hacking 😳
😈1😨1
È possibile avviare gmic-qt senza dover per forza aprire Krita
x86_risc_root.c
1.8 KB
Non ricordo più in che chat ho mandato/ricevuto il link a quel talk, sulla vulnerabilità del coprocessore RISC negli Intel per scrivere in kernel space ed essere root — sta di fatto che ho trascritto il codice, l'ho ritrovato in una gif

gcc -m32 -o x86_risc_root{,.c}
Wtf mi è arrivata la nuova carta prepagata ESU — peccato che io non sto studiando [non sono iscritto]
😢1
journalctl -u micro
hello2.c
Niente, non riesco ad alterare le variabili d'ambiente dal modulo kernel, ogni volta da Bad address prima di eseguire il processo — immagino sarà dovuto agli indirizzamenti diversi kernel-space / user-space, ma non ho idea di come risolvere...
Media is too big
VIEW IN TELEGRAM
Crazy Machines 2 Ita, finalmente scaricato dall'oltretomba
🔥1
c-ce l'ho fatta..?
🤯2
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?