explicación del código de shell

6

He encontrado este shellcode en enlace :

#include <stdio.h>
char sh[]="\xeb\x0b\x5f\x48\x31\xd2\x52\x5e\x6a\x3b\x58\x0f\x05\xe8\xf0\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";
void main(int argc, char **argv)
{
    int (*func)();
    func = (int (*)()) sh;
    (int)(*func)();
}

Instrucciones:

  

Cómo ejecutar

$ gcc -o sh_shell sh_shell.c
$ execstack -s sh_shell
$ ./sh_shell

¿Puede alguien explicar cómo funciona realmente?

¿De qué manera puede hacer daño a algo?

¿Para qué se usa sh ? ( "뀋_H1ҀR^j;X耰bin/sh" (Unicode) o "�_H1�R^j;X�����/bin/sh" (ASCII) no tiene mucho sentido, a excepción de los últimos 6 caracteres, ¿cuáles son esos caracteres al frente?)

    
pregunta Shomz 09.04.2016 - 03:41
fuente

2 respuestas

8

utilizando ndisasm , los datos de la matriz sh se pueden desmontar en el siguiente código de 64 bits x86:

00000000  EB0B              jmp short 0xd
00000002  5F                pop rdi
00000003  4831D2            xor rdx,rdx
00000006  52                push rdx
00000007  5E                pop rsi
00000008  6A3B              push byte +0x3b
0000000A  58                pop rax
0000000B  0F05              syscall
0000000D  E8F0FFFFFF        call qword 0x2
00000012                    '/bin/sh'

Parece que la línea simple shellcode independiente de la posición hace un syscall del kernel para ejecutar /bin/sh .

La primera instrucción avanza a la instrucción justo antes de la cadena /bin/sh , que a su vez hace que call vuelva a la segunda instrucción. La dirección de retorno se extrae de la pila en el registro rdi . Este es un truco para obtener la dirección de memoria de la cadena /bin/sh , ya que el shellcode no sabe dónde está en la memoria cuando se ejecuta.

El registro rdx luego se establece en 0 y se empuja a la pila y vuelve a aparecer en el registro rsi . El byte 0x3b luego se empuja a la pila y vuelve a aparecer en el registro rax .

Ahora estamos configurados de la siguiente manera:

  • rdi = puntero a la cadena /bin/sh
  • rdx = 0
  • rsi = 0
  • rax = 0x3b

En este punto, entregamos el control al kernel con syscall , donde el argumento 0x3b en rax le dice que ejecute () la ruta del archivo que está en el puntero rdi

Si traducimos esto de nuevo a C, básicamente lo está haciendo:

execve('/bin/sh', NULL, NULL);
    
respondido por el tlund 09.04.2016 - 10:46
fuente
-1

Saber exactamente lo que hace este código requiere conocer el sistema operativo y el procesador de la plataforma. La variable sh contiene instrucciones hexadecimales para el procesador, y el compilador no compila este contenido de la variable. Las tres líneas en main () se usan para llamar a la variable sh como un puntero de función. El contenido de sh contiene instrucciones para ejecutar una llamada del sistema a Linux. Probablemente este código le da al atacante acceso al shell SH.

Me parece que este código C es el comienzo de un exploit de inyección de código. Uno podría diseñar el código para inyectarlo probándolo en un programa en C como este. Luego, para implementar la inyección de código, el atacante solo necesita tener acceso a un búfer que se desborda y necesita copiar y pegar algo como este código en la parte de desbordamiento del búfer. Este tipo de ataque se denomina saturación del búfer. El shell SH en esta vulnerabilidad se ejecutará con los mismos permisos que el programa con la saturación del búfer explotado.

    
respondido por el Brent Kirkpatrick 09.04.2016 - 04:29
fuente

Lea otras preguntas en las etiquetas