[Taller en construcción]Secciones en archivos PE.

Iniciado por The Swash, 23 Mayo 2012, 18:44 PM

0 Miembros y 1 Visitante están viendo este tema.

x64core

The Swash, Una pregunta... bueno estoy seguro que sobreescribes 28 bytes de la Bound cierto?
tambien puse a pensar y si el exe tiene muchas secciones e intento agregar otra sección se rompe... pero
estamos hablando de 8,10 secciones... por cierto todos los ejecuatbles albolutamente todos tiene bound... aunque no
sea ocupada?

The Swash

Expliqué los 2 métodos:

  • Mover la BOUND_IMPORT_TABLE.
  • Remover la BOUND_IMPORT_TABLE.

Todos los ejecutables NO tienen BOUND_IMPORT_TABLE, y para comprobar si tienen o no debes comparar el directorio de datos número 12 y ver si su RVA es 0 o no.

Un saludo,
Iván Portilla.

Belial & Grimoire

#12
bueno, entonces lo de 0x17... es la frase y tambien virtualsize

ya entendi mas sobre los multiplos que me tenia confundido

pero a ver, para obtener VirtualAddress, como mencionas en el taller, hay que regresar una sección y tomar el virtualaddress + SizeOfRawData que seria algo asi

0x28 - 0x1C8 = 0x1A0


000001a0  2e 69 64 61 74 61 00 00  98 00 00 00 00 20 00 00  |.idata....... ..|


2e 69 64 61 74 61 <--- esto debe ser .idata
00 00 <--- esto debe ser virtualsize
98 00 00 00 <---- esto es VitualAddress
00 20 00 00 <---- esto es SizeOfRawData

bueno, esto esta en little endian, lo que seria

00 00 00 98
00 02 00 00


si sumo esos 2, seria 00 02 00 98, equivalente a 2098, si lo redondeo seria 3000

y finalmente quedaria asi, cierto?

00 00 00 98
00 02 00 00
/////////////
00 03 00 00


para encontrar SizeOfRawData entonces seria lo que sigue de VirtualAddress

000001a0  2e 69 64 61 74 61 00 00  98 00 00 00 || 00 20 00 00 <--- seria este

entonces si busco FileAlignment + SizeOfRawData seria

CitarFileAlignment: -> Lo encontramos con 0x98 + 0x24 = 0xBC y tiene un valor 00 02 00 00 (real: 00 00 02 00).

00 20 00 00
00 02 00 00


seria 0x220, su multiplo seria 400

aqui una duda, porque 400?, y porque no 300?

y para encontrar PointerToRawData, seria el siguiente de SizeOfRawData

000001b0  00 02 00 00 <---- aqui se encuentra 00 04 00 00  00 00 00 00 00 00 00 00  |................|

si se lo sumo al resultado de FileAlignment + SizeOfRawData + PointerToRawData... seria

0x400 + 200 = 0x600 <--- 00 06 00 00


espero haber entendido, si tengo algun error, espero puedan coregirme

bueno, al rato intentare hacerlo en windows, salu2
.                                 

The Swash

#13
Creo que lo entendiste mucho mejor.

Recuerda que todos los campos de IMAGE_SECTION_HEADER tienen un tamaño cada uno de 4 bytes con excepción del nombre de la sección que ocupa 8 y NumberOfRelocations y NumberOfLineNumers (WORD) estos últimos. (Debes tener muy en cuenta el tamaño de cada campo).

Ahora tienes un pequeño problema con las alineaciones.
NO se deben sumar, solamente un valor debe ser múltiplo del otro, cuando digo múltiplo es que al hacer la operación:

Num mod Alineamiendo = 0.

Entonces no es 0x220, mira bien que esos 2 valores que marcaste:
Citar00 20 00 00
00 02 00 00

Son VirtualAddress y SizeOfRawData correspondientemente. Entonces para encontrar SizeOfRawData, este valor corresponde al tamaño de los datos de TU sección, y ese valor se debe alinear al FileAlignment:

FileAlignment: 0x200
Tus datos: 0x17
0x17 alineado a 0x200 = 0x200.

Citar2e 69 64 61 74 61 <--- esto debe ser .idata
00 00 <--- esto debe ser virtualsize
98 00 00 00 <---- esto es VitualAddress
00 20 00 00 <---- esto es SizeOfRawData

Estás mal, idata cubre 8 bytes, los siguientes 4 corresponden al VirtualSize que sería 0x98, los siguientes 4 al VirtualAddress, los siguientes 4 SizeOfRawData, los siguientes 4 a PointerToRawData...



Un saludo.

x64core

ok, entonces me pongo a pensar si un ejecutable no tiene bound... entonces creo que sería un gran problema no...
ya que ningun metodo mecionado se podría aplicar...

x64core

ok chicos solucionado error mío :D que viva el taller

79137913

HOLA!!!

El lunes hablame por msn que quiero ver si me armas una cosa artesanal XD.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

Belial & Grimoire

hola

ya hice la primera parte igual en windows 7 y funciono perfecto

ahora quise hacer el intento con notepad en windows 7, pero me encontre con un problema

notepad, tiene 4 secciones, el ultimo es .reloc, al intentar calcular VirtualAddress, me aparece de esta forma

00000242 00 00 00 00 00 00 00 00 00 00 40 00 00 40 2E 72 65 ..........@..@.re
00000253 6C 6F 63 00 00 34 0E 00 00 00 F0 02 00 00 10 00 00 loc..4...........
00000264 00 AE 02 00 00 00 00 00 00 00 00 00 00 00 00 00 40 ................@
00000275 00 00 42                                           ..B             


por lo visto aqui esta

----> 00 F0 02 00 || 00 10 00 00 loc..4...........

de que manera se obtendria aqui VirtualAddress?

CitarVirtualSize: 00 00 00 17 y VirtualAddress: 00 00 20 00, procedemos a sumarlos: 0x2017 y alineamos, recuerden el múltiplo mayor inmediato es 0x3000 y listo, tenemos nuestro VirtualAddress.

seria 00 f0 02 17?, y cual seria el resultado?

por cierto, usare la misma cantidad de 0x17 para no revolver tanto y seguir el ejemplo del taller

y otra cosa, esto hice para obtener la direccion donde se encontrara mi sección pero no encontre espacios vacios

28 * 4= A0 + 1D8 = 278

habra algun problema si le agrego 28 bytes para agregar mi sección?

salu2
.                                 

Karcrack

Muy buen trabajo, espero que lo sigas ampliando :P

Lo añado a la biblioteca en cuanto llegue a casa.

saludos >:D

The Swash

Amigo,
Te felicito por lo de la primera parte. En cuanto al notepad.

Si tu VirtualAddress de la ultima sección es 0x2F000 y el VirtualAddress es Tamaño (0xE34 Alineado 0x1000 = 0x1000) = 0x30000 -> Ese es el nuevo VirtualAddress.

En cuanto a lo de tus espacios, eso se especifica en la parte del Taller llamada "We vs BOUND_IMPORT"

Un saludo,
Iván Portilla