Supongo que está compilando su programa en modo x86-64, de lo contrario no habría posibilidad (ni necesidad) de hacer estallar rdi
. En términos generales, los programas más pequeños tienen menos gadgets. En particular, los programas muy simples tienden a no tener muchos gadgets que comiencen en medio de largas instrucciones, como pueden tener los programas / bibliotecas más largos.
Los bloques compilados en if(0){}
nunca aparecerán en la salida del programa, incluso cuando la optimización está deshabilitada, es probable que el compilador ignore completamente esto. En su lugar, puede usar una variable global porque es difícil para un optimizador razonar sobre el valor de un global.
#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();
}
}
El ensamblado en la función callme realiza una secuencia pop rdi;ret
. Debido a que está en GCC, se espera sintaxis AT & T, por lo que los registros requieren un %
. Desafortunadamente, la macro asm
usa %
como un meta-carácter, lo que requiere que se duplique para escapar de un solo %
. asm
toma varios argumentos separados por dos puntos (no sé por qué eligieron dos puntos en lugar de comas). La primera es la plantilla de ensamblaje, que puede incluir registros asignados automáticamente si el programador no requiere el control de sus propios registros. El segundo y el tercero son los registros de destino (salida) y de origen (entrada). El último es una lista de otros registros que son sobrescritos por el ensamblaje. En uso normal, esto le dirá al compilador cómo asignar registros para esta función. Dado que esta función en realidad no se usa normalmente, sino solo para shellcoding, todo esto es en su mayoría opcional, pero aquí se incluyó la versión larga con fines de demostración.
Si compilas este código con gcc -O0 -o sample sample.c
, y luego vuelves el desmontaje a través de objdump -d sample
, verás que la función callme
está incluida y contiene el gadget que estás buscando.