Cómo aumentar la aparición de gadgets en un programa

1

Estoy haciendo ejercicio con ROP. En un programa vulnerable, controlo el RIP, uso "ropeme" y busco gadgets. Encuentro muchas referencias a registros de 32 bits, pero no a un solo registro extendido.

Necesito un simple "pop rdi; ret;" para pasar la cadena / bin / sh a la función system () (deshabilité alsr y stack-protector).

Intenté usar asm () para incorporar directamente el gadget pero, por supuesto, bloquea el programa, y cuando encierro la función dentro de un if (0) {} u otra función que no llamamos, el gadget no lo hace. Aparecen dentro de ropme.

¿Es esta norma que un programa pequeño no tendrá ningún código que haga referencia a los registros extendidos? ¿Qué debo hacer para hacer posible la explotación utilizando rop y volver a libc?

    
pregunta Yvain 15.08.2017 - 16:32
fuente

1 respuesta

1

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.

    
respondido por el David 03.02.2018 - 22:21
fuente

Lea otras preguntas en las etiquetas