Caso di studio 2
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void win()
{
  printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
  volatile int (*fp)();
  char buffer[64];

  fp = 0;

  gets(buffer);

  if(fp) {
      printf("calling function pointer, jumping to 0x%08x\n", fp);
      fp();
  }
}
C

Fase 1: cosa notiamo ad una prima vista?
...

  1. C'è un buffer
  2. C'è anche una funzione win, tuttavia notiamo che non è raggiungibile da nessuna parte del codice, non vi è nessuna chiamata alla funzione win
    Lo scopo sembra sovrascrivere l'indirizzo di qualcosa affinché venga eseguita tale funzione.
    Notiamo che vi è un puntatore a funzione fp, che viene inizializzato a 0 e su cui viene fatto un controllo. Per entrare nell'if il valore di fp deve essere diverso da 0. All'interno vi è una stampa che ci comunica l'indirizzo corrente di fp. Quello che dobbiamo fare è sovrascrivere tale puntatore a funzione, facendolo puntare a win.

Proviamo una esecuzione riempiendo il buffer con un valore qualsiasi, per esempio delle 'A', per fare ciò usiamo python:
Pasted image 20230927111320.png
come potevamo prevedere, riempiendo il buffer si riesce ad accedere al puntatore a funzione, il cui valore viene sovrascritto con il valore esadecimale (in ASCII) della 'A', ovvero 0x61.
A questo punto sappiamo che dobbiamo replicare tale stampa aggiungendo al posto della 'A' un indirizzo, quello della funzione win

Fase 2: dove prendere l'indirizzo di win?
...

Usiamo gdb per stampare l'indirizzo della funzione win:
Pasted image 20230927111846.png
Tale indirizzo dobbiamo passare in formato little endian al programma.

Creiamo l'exploit:
Pasted image 20230927111946.png
i dati da passare al programma verranno scritti in un file.

Il programma non prende in input dei file, per cui, effettuiamo una lettura del file con cat e passiamo il suo output al programma target:
Pasted image 20230927112112.png

Ovviamente prima di effettuare la lettura del file exploit abbiamo eseguito l'exploit python per generare il file.