Conversión de decimal negativo a hexadecimal

3

Pasé por una publicación en Seguridad ofensiva y mientras leía, el autor declaró que:

  

En la próxima SEH (cuando se usa una dirección de manejador de SE que comienza con un byte nulo), por lo general, pondremos un código para saltar. Después de todo, el byte nulo actuaría como un terminador de cadena y no tiene sentido poner algo después de la dirección del controlador SE (después de todo, no podría saltar a él de todos modos, ¿verdad?)

     

Por lo general, en un escenario como este, queremos hacer un salto corto hacia atrás ... este código de operación de retorno se ve así: xebxf0xffxff (así que, básicamente, saltar 10 bytes)

Entonces, según mi entendimiento, a jmp back, tengo que convertir el valor decimal a hexadecimal (estoy usando este [printf "%x\n" -7] en mi shell como una forma rápida de convertir -7 a hex) y luego agregar este valor a la instrucción jmp \xeb .

Tengo 2 preguntas aquí:

1: el formato final del código de operación debe ser \xeb\xAA\xBB\xCC\xDD (la instrucción de salto \xeb seguida de 4 bytes), sin embargo, el autor incluye solo 3 bytes después de \xeb ? ¿hay un \xff faltante?

2-el autor afirma que \xeb\xf0\xff\xff salta 10 bytes, sin embargo, lo convertí yo mismo y encontré que saltar 10 bytes debería ser \xeb\xf6\xff\xff en lugar de \xeb\xf0\xff\xff ¿cuál salta 16 bytes?

    
pregunta Ahmed Taher 28.07.2013 - 05:20
fuente

1 respuesta

4

Hay varios opcodes de salto; Consulte los manuales de Intel. Recomiendo el manual 80386 original que habla solo sobre el 80386 de 32 bits, omitiendo así todas las características adicionales de ulterior CPU: esto hará que sea mucho más fácil, más corto leer.

Vaya a la página 319 de ese manual: verá que, a nivel de código de máquina, no hay menos de 21 códigos de operaciones de salto distintos. El que comienza con EB es un salto corto, seguido de un solo byte, lo que permite un rango de salto de -128 a +127 bytes. El desplazamiento se cuenta desde el byte que inmediatamente sigue a toda la instrucción (el primer byte después de el parámetro de desplazamiento de un byte), por lo que EB 00 es una operación sin operación: Salta a la instrucción que sigue al salto, donde habría ido de todos modos si no hubiera habido salto. Del mismo modo, EB FE es un bucle infinito (saltar de nuevo a sí mismo). EB F0 salta 16 bytes atrás, por lo tanto 14 bytes antes del EB byte.

Nota: desconfíe de la dualidad de 16 bits / 32 bits de los procesadores x86. Todos los sistemas operativos modernos se ejecutan en modo de 32 bits. Esto no cambia nada para el "salto corto" del que estamos hablando aquí, pero altera los "saltos cercanos", que tomarán un desplazamiento de desplazamiento de 32 bits en el modo de 32 bits.

    
respondido por el Thomas Pornin 29.07.2013 - 15:22
fuente

Lea otras preguntas en las etiquetas