Mod 2: Program Interaction
Appunti lezioni
Linux command line
TODO:
Binary Files
Executable and Linkable Format: definisce la forma che deve avere un binario per poter essere eseguito su linux. Bel blogpost
Un file ELF è divisibile in segmenti. questi definiscono dove le varie parti del binario verranno caricate in memoria.
Ortogonalmente alla divisione in segmenti, è possibile anche dividere il binario in sezioni, queste definiscono la semantica delle parti del binario. A noi interesseranno le seguenti sezioni:
.text: sezione eseguibile del binario.plt,.got: sezione in cui verranno caricate le librerie dinamiche utilizzate dal binario.data: variabili dichiarate a compile time.rodata: costanti a compile time (tipo le stringhe).bss: variabili dichiarate a compile time ma non inizializzate
Per interagire con l’ELF, possiamo utilizzare i seguenti tools:
gccto make your ELF.readelfto parse the ELF header.objdumpto parse the ELF header and disassemble the source code.nmto view your ELF’s symbols.patchelfto change some ELF properties.objcopyto swap out ELF sections.stripto remove otherwise-helpful information (such as symbols).kaitai structto look through your ELF interactively.
Linux Process Loading
TODO:
Linux Process Execution
TODO:
Materiale aggiuntivo
pwntools: libreria molto utile per semplificare l’interazione con i processi a runtime. QUESTO VA IMPARATO BENE, leggere almeno una volta line by line il tutorial
Challenges
Opinioni generali
TODO: scrivere opinioni una volta finite le challenges
embryoio 1-28
flag gratis, ti chiede di fare cose su:
- stdin/stdout
 - argomenti
 - variabili di ambiente
env -iper azzerare l’ambiente- dalla manpage di 
bash, sezioneexec:The -c option causes command to be executed with an empty environment. 
 - redirezione
 - lanciare script bash/python
 
embryoio 29-85,88-97,102-105,107,110,115-123
qui inizia a chiederti di generare nuovi processi (fork), gestire redirezione con pipe e fifo, argv, env e segnali inizi a dover scrivere qualche riga di C. Le challenge sono speculari in C, bash e python.
- La chall 66 chiede di utilizzare 
find, questa è interessante (anche se molto facile) - La chall 73, 79, 85 chiede roba sulla CWD (working dir) tra padre e figlio: TODO: check
 - La chall 94 chiedere di avere come input il file descriptor 283. Questo e` facile da fare in bash (TODO: provare a rifarla in sh posix):
 
exec 283< tmp
/challenge/embryoio_level94 <&283Questa soluzione funziona sono in bash, non is shell posix. La motivazione la troviamo qui:
Open files are represented by decimal numbers starting with zero. The largest possible value is implementation-defined; however, all implementations shall support at least 0 to 9, inclusive, for use by the application. These numbers are called “file descriptors”.
Quindi, il file descriptor 283 e` accettato dallo standard ma non implementato in diverse shell posix (tipo dash).
Ecco le informazioni utili per svolgere questi esecizi
- un processo figlio eredita dal padre i file descriptor
- i due processi condividono anche la posizione nel file (fseek). TODO: cercare docs su sta cosa
 
 - il figlio passa a zombie (aka orfani, con padre init) se il padre vero muore
 - i figli ereditano l’environment dal padre
 - ricorda che il programma per mandare un segnale ad un processo e` 
kill 
embryoio 86,87,99,100,106,112,113,126-142
qui bisogna comunicare con il processo che sta girando. Per comunicare, ti chiede di utilizzare vari medodi, quali:
- stdin/stdout
 - fifo
 - tcp
 - (forse altro) In pratica sono date dal sw di checking delle operazioni matematiche da completare, e lo scopo e` quello di risolverle programmaticamente. Un’altra sottocategoria, sempre simile, consiste nel dover programmaticamente mandare n segnali, scelti dinamicamente dalla challenge al processo figlio. Anche questi sono divisi tra bash , C e python, la soluzione per comunicare interattivamente e`:
 - bash: TODO: capire come si fa (maybe http://tiswww.case.edu/php/chet/bash/bashref.html#Coprocesses)
 - C: semplice ciclo consumer con pipe. 
man pipecontiene un esempio - python: pwntools e` fatto apposta