Paso del parámetro Shellcode

1

Estoy tratando de usar una variable de entorno para almacenar mi código de shell y luego apuntarlo con mi RET, para poder ejecutar mi código de shell. Aquí está mi programa vulnerable 'abc.c'

#include string.h
#include stdio.h

void foo(const char* str){
 char buf[100];
 printf("\n%p\n",buf);
 strcpy(buf,str);
}
int main(int argc, const char* argv[]){

 foo(argv[1]);
}

He estado haciendo los siguientes pasos hasta ahora

$gcc -z execstack -fno-stack-protector -o abc abc.c 

Usando getenv () dentro de otro programa, determiné cuál era la dirección de mi shellcode. Digamos que es algo de 0xbfffc209

Usando  %código% bloquea mi programa sin piedad, pero si uso una dirección en lugar de las cuatro A, mi programa saldrá limpiamente.

Usando A's

AhorausandounadirecciónenformatoIntel

Comosepuedever,nadahasidosobrescrito.Lasalidadeltracecon

$./abc$(python-c'print"AAAA"*30') y también

$ltrace ./abc $(python -c 'print "\x09\xc2\xff\xbf"*30') es

Estoy totalmente desconcertado con un comportamiento inexplicable de este tipo, y me alegraría que alguien me ayude a entender por qué sucede esto.

Gracias de antemano

PS

  1. Utilizo una VM de Ubuntu 14.04 32 bit

  2. Recibo los mismos resultados sin importar la dirección que use

pregunta user148898 13.08.2017 - 23:55
fuente

1 respuesta

3

No todos los caracteres de su carga útil pueden enviarse a través del argumento de su binario. Hay algunos "caracteres malos" que no puedes tener en tu shellcode. Un ejemplo es "\ x00", ya que está usando strcpy para copiar cadenas y "\ x00" es el delimitador de sus cadenas. Entonces, primero averigüe cuáles son los caracteres malos para su plataforma y luego haga una carga útil que esté libre de esos bytes.

PS: Podría haberlo comentado pero solo tenía 49 reputación.

    
respondido por el sudhackar 21.12.2017 - 09:43
fuente

Lea otras preguntas en las etiquetas