Obtención de una excepción DEP al intentar llamar a la excepción SetProcessDEPException (falso)

1

Estoy demostrando un exploit para una aplicación antigua.

En Windows XP SP3 32bit (EN) , la dirección de SetProcessDEPPolicy() generalmente es 0x7C8622A4 . Tengo esa versión de Windows (también en inglés) y he construido con éxito una cadena de ROP que me lleva exactamente a ese lugar en la memoria con mi dirección de retorno a mi código de shell y un 0 argumentos ordenados de forma clara y correcta en la pila .

Pero cuando intento ejecutar en ese punto, obtengo debugged program was unable to process exception en mi depurador o un DEP exception al desencadenar el exploit fuera del depurador.

Me pregunto si podría ser debido a mi nivel de parches (tengo los parches más recientes). ¿Ha cambiado la dirección de SetProcessDEPPolicy() ?

¿Cómo puedo encontrar manualmente la dirección de esa función de API?

Si la dirección de SetProcessDEPPolicy() no ha cambiado, ¿por qué recibo una excepción?

La captura de pantalla a continuación muestra la situación en la que recibo la excepción, por lo que puedo decir, tengo todo lo que debería estar y debería poder deshabilitar el DEP en lugar de recibir un error. Hay comentarios en la captura de pantalla y puede obtener una mejor resolución haciendo clic con el botón derecho en > ver imagen.

    
pregunta Juicy 26.01.2015 - 18:31
fuente

1 respuesta

1

Las funciones de búsqueda vienen en dos tipos:

  1. Exportado: super fácil.

En el uso de Windows

HANDLE kernel32 = GetModuleHandle(L"kernel32");
FARPROC funcAddr = (FARPROC *) GetProcAddress(kernel32, "SetProcessDEPPolicy");

Esto devolverá la dirección de la función si es exportada por el módulo, en este caso el módulo es kernel32.

  1. No exportado - Molesto

El primer paso es encontrarlo primero manualmente a través de algún tipo de ingeniería inversa. Esto puede ser áspero. Si conoce ciertos tipos de error constante que podría devolver, puede limitar la búsqueda a unos pocos procedimientos. A Windows le encanta usar constantes, y documentan su uso en MSDN. A veces, las funciones no exportadas están documentadas por otros investigadores, o si tiene la suerte de estar haciendo esto en un proyecto de código abierto, puede buscar las constantes allí. Pero realmente tienes que encontrar la función a través de la buena moda antigua RE.

Puede ir un paso más allá para hacer esto más fácil para usted en el futuro. Encuentra un flujo de bytes único para la función. Luego, escriba su propia función que pueda buscar una imagen determinada para esa secuencia única y calcule el desplazamiento hasta el comienzo de la función. Boom tienes una dirección.

Por supuesto, el uso de esta búsqueda dinámica no está garantizado de una versión a otra. Tal vez el compilador tomó una optimización diferente en SP1 que SP2? El flujo único entonces se vuelve inválido. Pero esa es realmente la mejor opción que tiene para funciones no exportadas.

    
respondido por el RoraΖ 26.01.2015 - 19:26
fuente

Lea otras preguntas en las etiquetas