elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  [Script]Script para calcular offset de un ejectuable
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Script]Script para calcular offset de un ejectuable  (Leído 3,179 veces)
.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
[Script]Script para calcular offset de un ejectuable
« en: 26 Septiembre 2011, 20:40 »

Me surgió la duda de como obtener el OffsetRaw de manera manual, buscando en google todos recomendaban programas y siempre que se tocaba la palabra "fórmula o cálculo" venía con la palabra "no es necesaria por existen programas...", por eso se me ocurrió crear un script encargado de mostrar el offset raw, en la cabecera del script se puede apreciar detalladamente de forma explicativa y con ejemplos el cálculo para obtener offset raw

Los datos que entregan son:
offset RAW y la sección que corresponde el address buscado
para buscar se debe insertar el address en VA (Como lo muestra Ollydbg)

Código
  1. /*
  2.    -=================================================================-
  3.  
  4.        Script realizado por :UND3R                                      
  5.        Script para : Encontrar Offset RAW                                                                                            
  6.        Fecha : 26/09/2011                                          
  7.  
  8.                    -=[ Comentario del Script ]=-
  9.     Fórmula:
  10.     RVA: Valor relativo en memoria (Relative Value Address)                                  
  11.     VA: Valor absoluto en memoria (Value Absolute)                                                              
  12.     RAW: Dirección en el disco
  13.  
  14.     -OllyDBG Nos muestra por defecto direciones de tipo VA
  15.     VA(Value Absolute)=ImageBase+RVA    
  16.  
  17.     Ejemplo: 40101D=400000(ImageBase)+101D(RVA)
  18.  
  19.     -Si queremos saber el raw de un address ubicado en la cabezera PE (PE header)
  20.     se debe restar address-ImageBase=RVA=RAW    
  21.  
  22.     Ejemplo: 400056(VA)-400000(ImageBase)=56h(RAW)    
  23.  
  24.     -Si queremos saber el raw de un address ubicado en una sección    
  25.     se debe hacer lo siguiente:
  26.  
  27.     Obtener el RVA del addres:
  28.     Address-ImageBase=RVA
  29.  
  30.     luego a RVA restarle los siguientes valores:    
  31.     RVA-(VirtualAddress-PointerToRawData)=RAW    
  32.  
  33.     *VirtualAddress y PointerToRawData varían en cada sección
  34.  
  35.  
  36.  
  37.    -=================================================================-
  38. */
  39. VAR NOM_SECCION
  40. VAR VALOR
  41. VAR HEADER
  42. VAR CONTADOR_SEC
  43. VAR VIRTUAL_ADDRESS
  44. VAR VIRTUAL_SIZE
  45. VAR N_SECCIONES
  46. VAR MODULE_BASE
  47. VAR PUNTERO_PE
  48. INC CONTADOR_SEC //Incrementa CONTADOR_SEC en 1
  49. PREGUNTAR:
  50. ASK "Introduzca el address a calcular el Offset RAW"
  51. MOV RESULTADO,$RESULT //Mueve el resultado a la variable RESULTADO
  52. MOV VALOR,RESULTADO //Mueve RESULTADO a la variable VALOR
  53. GMI eip,MODULEBASE //Obtiene la Base del módulo
  54. MOV MODULE_BASE,$RESULT //Mueve el resultado a MODULE_BASE
  55. MOV PUNTERO_PE,MODULE_BASE //Mueve la Base del módulo a la variable PUNTERO_PE
  56. ADD PUNTERO_PE,3C //Suma 3C con PUNTERO_PE
  57. MOV PUNTERO_PE,[PUNTERO_PE] //Mueve el contenido dentro de PUNTERO_PE a PUNTERO_PE
  58. ADD PUNTERO_PE,MODULE_BASE  //Suma PUNTERO_PE con MODULE_BASE
  59. MOV N_SECCIONES,PUNTERO_PE  //Mueve PUNTERO_PE a N_SECCIONES
  60. ADD N_SECCIONES,6 //Suma N_SECCIONES con 6 para obtener el número de secciones
  61. MOV N_SECCIONES,[N_SECCIONES],1 //Mueve el primer byte del contenido dentro de N_SECCIONES a N_SECCIONES
  62. ADD PUNTERO_PE,F8 //Suma PUNTERO_PE con F8
  63. MOV HEADER,PUNTERO_PE //Mueve PUNTERO_PE a la variable HEADER
  64. ADD HEADER,C //Suma C a la variable HEADER
  65. MOV HEADER,[HEADER] //Mueve lo que está dentro de HEADER a la variable HEADER
  66. ADD HEADER,MODULE_BASE
  67. CMP RESULTADO,MODULE_BASE //Compara si el valor introducido con el valor de la ImageBase
  68. JB  ERROR_ADDRESS //Si el valor introducido es menor salta a ERROR_ADDRESS
  69. CMP RESULTADO,HEADER //Compara el valor introducido con el inicio de la primera sección
  70. JB CALCULAR_1 //Si el valor introducido es menor hará el cálculo correspondiente de un address ubicado en la sección PE header
  71. BUCLE:          //Bucle encargado de buscar la sección que corresponde el valor introducido
  72. ADD PUNTERO_PE,8
  73. MOV VIRTUAL_SIZE,[PUNTERO_PE]
  74. ADD PUNTERO_PE,4
  75. MOV VIRTUAL_ADDRESS,[PUNTERO_PE]
  76. ADD VIRTUAL_SIZE,VIRTUAL_ADDRESS
  77. ADD VIRTUAL_SIZE,MODULE_BASE
  78. SUB VIRTUAL_SIZE,1
  79. CMP RESULTADO,VIRTUAL_SIZE
  80. JB CALCULAR_2
  81. CMP CONTADOR_SEC,N_SECCIONES
  82. JA ERROR_ADDRESS
  83. INC CONTADOR_SEC
  84. ADD PUNTERO_PE,1C
  85. JMP BUCLE
  86. CALCULAR_1:     //Fórmula de address ubicada en PE header
  87. SUB VALOR,MODULE_BASE
  88. MOV NOM_SECCION,"PE header"
  89. JMP SALIR
  90. CALCULAR_2:  //Fórmula de address ubicada en una sección
  91. ADD PUNTERO_PE,8
  92. MOV NOM_SECCION,PUNTERO_PE
  93. SUB NOM_SECCION,14
  94. MOV NOM_SECCION,[NOM_SECCION],8
  95. BUF NOM_SECCION
  96. STR NOM_SECCION
  97. LOG NOM_SECCION
  98. MOV PUNTERO_PE,[PUNTERO_PE]
  99. SUB VALOR,MODULE_BASE
  100. SUB VIRTUAL_ADDRESS,PUNTERO_PE
  101. SUB VALOR,VIRTUAL_ADDRESS
  102. JMP SALIR
  103. ERROR_ADDRESS:
  104. MSG "ERROR:Address introducida incorrecta"
  105. JMP PREGUNTAR
  106. SALIR:
  107. EVAL "VA:[{RESULTADO}]=Offset RAW:[{VALOR}h] sección:{NOM_SECCION}"
  108. MSG $RESULT
  109. ret
  110.  

Saludos a Tinkipinki que nunca me hizo un reto, tomaré este script como reto ya que de forma indirecta lo hizo.
« Última modificación: 28 Septiembre 2011, 16:32 por .:UND3R:. » En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
Tinkipinki

Desconectado Desconectado

Mensajes: 242



Ver Perfil
Re: [Script]Script para calcular offset de un ejectuable
« Respuesta #1 en: 28 Septiembre 2011, 10:58 »

Hola .:UND3R:.  felicitarte por el aporte. Estoy ansioso por llegar a casa y poderlo probar detenidamente y comentarte como me va.

Citar
Saludos a Tinkipinki que nunca me hizo un reto, tomaré este script como reto ya que de forma indirecta lo hizo.

Es dificil retarte pero seguro que te voy a dar algun que otro dolor de cabeza mas... jeje  :rolleyes:  Todavia estoy digiriendo toda la informacion surgida de preguntas al foro en posts anteriores.

Saludos
En línea

.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: [Script]Script para calcular offset de un ejectuable
« Respuesta #2 en: 28 Septiembre 2011, 16:23 »

jaja no creo que sea difícil, no me manejo mucho en script, Saludos

EDIT: modifiqué la explicación (El script no)

ya que restaba imagebase-rva dando esto negativo, por lo que debía ser al revés.
« Última modificación: 28 Septiembre 2011, 16:31 por .:UND3R:. » En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
Tinkipinki

Desconectado Desconectado

Mensajes: 242



Ver Perfil
Re: [Script]Script para calcular offset de un ejectuable
« Respuesta #3 en: 29 Septiembre 2011, 12:11 »

Ok .:UND3R:. , ya lo he probado y funciona correctamente.
Es una pequeña maravilla, al menos para mi... ;-)

Saludos
En línea

.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: [Script]Script para calcular offset de un ejectuable
« Respuesta #4 en: 29 Septiembre 2011, 16:13 »

que bueno que te haya gustado :D, sirve mucho si no quieres usar programas anexos a ollydbg

Saludos
En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines