05-30-2017, 10:12 AM
(Este mensaje fue modificado por última vez en: 05-30-2017, 10:45 AM por Reaper45.)
A grandes rasgos:
Los parsers, decoders, y reproductores en general se hacen en C o C++ por temas de eficiencia, y ahí hay que controlar que no te pases de la memoria reservada. Entiendo que sabes lo que es un buffer overflow, esto es habitual, y es parecido a lo que ha pasado en este caso:
char miBuffer[256];
[blablabla]
int nLength = strlen(lineaDelSubtitulo);
puntero = malloc(nLength);
[copiar linea del subtitulo a puntero]
Después se hace un for o lo que sea y se copia puntero a miBuffer que es limitado. Si simplemente te pasas del limite, sea codigo java o no, la aplicación se explota. Pero en lenguajes que no administran la memoria y que delegan la comprobación del límite al copiar el buffer al programador, se explotan por violación de segmento, lo que viene ser que has sobrescrito lo que no tocaba (en lugar de detectarlo y explotarse deliberadamente a lo bestia como en java, c#, etc, como toca).
El caso es, puedes sobreescribir suficiente memoria que no le pertenece hasta llegar al puntero del stack con la siguiente instrucción de código. Se puede poner ahí una instrucción jmp que salte al principio de tu buffer, el cual has llenado con basura, NOPs y tu código precompilado para tomar control, pues el SRT es el que provee lineaDelSubtitulo.
Hay muchos nombres de técnicas de explotación de bugs, vulnerabilidades y sus correspondientes protecciones, pero todo se basa en joder la RAM de formas imaginativas, o de hacer complicado joderla por datos que se desconocen.
Los parsers, decoders, y reproductores en general se hacen en C o C++ por temas de eficiencia, y ahí hay que controlar que no te pases de la memoria reservada. Entiendo que sabes lo que es un buffer overflow, esto es habitual, y es parecido a lo que ha pasado en este caso:
char miBuffer[256];
[blablabla]
int nLength = strlen(lineaDelSubtitulo);
puntero = malloc(nLength);
[copiar linea del subtitulo a puntero]
Después se hace un for o lo que sea y se copia puntero a miBuffer que es limitado. Si simplemente te pasas del limite, sea codigo java o no, la aplicación se explota. Pero en lenguajes que no administran la memoria y que delegan la comprobación del límite al copiar el buffer al programador, se explotan por violación de segmento, lo que viene ser que has sobrescrito lo que no tocaba (en lugar de detectarlo y explotarse deliberadamente a lo bestia como en java, c#, etc, como toca).
El caso es, puedes sobreescribir suficiente memoria que no le pertenece hasta llegar al puntero del stack con la siguiente instrucción de código. Se puede poner ahí una instrucción jmp que salte al principio de tu buffer, el cual has llenado con basura, NOPs y tu código precompilado para tomar control, pues el SRT es el que provee lineaDelSubtitulo.
Hay muchos nombres de técnicas de explotación de bugs, vulnerabilidades y sus correspondientes protecciones, pero todo se basa en joder la RAM de formas imaginativas, o de hacer complicado joderla por datos que se desconocen.