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.