Come aumentare la ricorrenza del gadget in un programma

1

Mi sto esercitando con ROP. In un programma vulnerabile controllo il RIP, uso "ropeme" e la ricerca di gadget trovo molti riferimenti a registri lunghi 32 bit, ma non un singolo registro esteso.

Ho bisogno di un semplice "pop rdi; ret;" passare la stringa / bin / sh alla funzione system () (ho disabilitato alsr e stack-protector).

Ho provato ad usare asm () per incorporare direttamente il gadget ma ovviamente si blocca il programma e quando accludo la funzione all'interno di un if (0) {} o un'altra funzione che non chiamiamo, il gadget non lo fa t appaiono all'interno di ropme.

Questo standard indica che un piccolo programma non avrà alcun codice che faccia riferimento ai registri estesi? Cosa devo fare per rendere possibile l'exploit usando rop e tornare a libc?

    
posta Yvain 15.08.2017 - 16:32
fonte

1 risposta

1

Suppongo che tu stia compilando il tuo programma in modalità x86-64, altrimenti non ci sarebbe alcuna possibilità (né bisogno) di scattare rdi . In generale, i programmi più piccoli hanno meno gadget. I programmi particolarmente semplici tendono a non avere molti gadget che iniziano nel mezzo di lunghe istruzioni, in quanto potrebbero avere programmi / librerie più lunghe.

I blocchi compilati in if(0){} non appariranno mai nell'output del programma, anche se l'ottimizzazione è disabilitata, è probabile che questo venga completamente ignorato dal compilatore. Invece, puoi usare una variabile globale perché è difficile per un ottimizzatore ragionare sul valore di un globale.

#include <stdio.h>

int foo = 0;

void callme() {
  asm volatile ("pop %%rdi\n\t"
      "ret"
      :
      :
      : "rdi");
}

int main(int argc, char **argv) {
  printf("Hello world!\n");
  if (foo == 0x55) {
    callme();
  }
}

L'assembly nella funzione callme esegue una sequenza pop rdi;ret . Poiché è in GCC, la sintassi AT & T è prevista, quindi i registri richiedono un % . Sfortunatamente, la macro asm usa % come meta-carattere, richiedendo il raddoppio per sfuggire a un singolo % . asm accetta diversi argomenti separati da due punti (non so perché hanno scelto i due punti anziché le virgole). Il primo è il modello di assieme, che può includere registri assegnati automaticamente se il programmatore non richiede il controllo dei propri registri. Il 2 ° e 3 ° sono i registri di destinazione (uscita) e sorgente (input). Quello finale è un elenco di altri registri sovrascritti dall'assembly. Nell'uso normale, questo dirà al compilatore come allocare i registri per questa funzione. Dato che questa funzione non viene effettivamente utilizzata normalmente, ma solo per la codifica della shell, tutto questo è in gran parte opzionale, ma sono andato con la versione lunga a scopo dimostrativo qui.

Se compili questo codice con gcc -O0 -o sample sample.c , quindi esegui il dump dello smontaggio tramite objdump -d sample , vedrai la funzione callme inclusa e contiene il gadget che stai cercando.

    
risposta data 03.02.2018 - 22:21
fonte

Leggi altre domande sui tag