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:

  • gcc to make your ELF.
  • readelf to parse the ELF header.
  • objdump to parse the ELF header and disassemble the source code.
  • nm to view your ELF’s symbols.
  • patchelf to change some ELF properties.
  • objcopy to swap out ELF sections.
  • strip to remove otherwise-helpful information (such as symbols).
  • kaitai struct to 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 -i per azzerare l’ambiente
    • dalla manpage di bash, sezione exec: 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 <&283

Questa 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 pipe contiene un esempio
  • python: pwntools e` fatto apposta