Stelio Kontos
Desconectado
Mensajes: 17
|
Exactamente igual que en local. Cuando un programa que funciona en local pide que introduzcas X argumento, y la funcion para leer el contenido de esa cadena provoca un desbordamiento (es decir, reserva X bytes de espacio en la pila, y si al leerlos, éstos sobrepasan el límite, el cual no tenga un filtro, por ejemplo, provocan el desbordamiento), el tema va a estar en desbordar ese espacio de memoria y calcular cuantos bytes son necesarios para llegar a la dirección de retorno, la cual si es sobreescrita, el programa pegará el error. Entonces, el tema va a estar en sobreescribir ese retorno con una dirección de memoria válida, donde se encuentre la shellcode. Te voy a poner un ejemplo: Un programa que lee una cadena, el cual, reserva un buffer de 100 bytes. Si el programa tiene una función (strcpy, por ejemplo) que lea esa cadena, y si la cadena es de por ejemplo 150 bytes, esos 50 bytes restantes van a sobreescribir lo que haya después de ese espacio en la pila, si el exceso es suficiente como para llegar a la dirección de retorno, el flujo del programa se interrumpirá, ya que esa dirección de retorno va a apuntar a algo que ha sido sobreescrito, y obviamente, "no existe". Ahora imagina, que hago una aplicación en ensamblador, la cual deje una shell a la escucha por el puerto 4444, creo el binario, saco sus opcodes, y hago la shellcode. He calculado cuantos bytes son necesarios para llegar al retorno y me da 124, esa cantidad de bytes, es la que hay desde el principio del espacio reservado, hasta la dirección de retorno, a la cual llego desbordando el limite del espacio. Ahora sé, que 4 de esos bytes (los últimos), son pertenecientes a la dirección de retorno sobreescrita, de lo que saco la conclusión de que en 120 bytes tiene que ir mi sellcode. Entonces, en el argumento, tengo que introducir 120 bytes + 4 del retorno, en esos 120 bytes tiene que ir mi shellcode, si ésta no es suficiente, meto basura. Ahora tenemos basura + shellcode + ret, ese retorno tiene que ser sobreescrito con la dirección de memoria donde se encuentre la shellcode. En resumen, en 120 bytes tiene que ir mi shellcode y basura si es necesario, para que al sobreescribir el retorno, retorne a mi shellcode, el flujo se "cambie" y se ejecute mi shellcode.
¿Tu pregunta era refiriendote a remoto, no? Pues igual, en vez de meter los argumentos desde el teclado, se los envías mediante un socket.
|