pregunta sobre runPE en windows 10 basado en talleres antiguos del foro

Iniciado por Belial & Grimoire, 27 Febrero 2018, 03:27 AM

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

Belial & Grimoire

Hola

Estaba tratando de recrear el runPE que The Swash hizo una vez, quería ver si todavia funcionaba en Windows 10 y al parecer si, agregue una sección y notepad sigue funcionando. Pero me quedé con la idea de como se ejecutaba código, así que buscando en el foro, retomaron varios talleres y hay uno de Ferchu donde explica una manera de ejecutar código mediante opcodes, pero hay algo que no entendí, yo sé que la mejor manera es con programación pero siempre se me ha hecho más interesante saber como funcionan las cosas manualmente.

Bueno, les explico.

el menciona que agrega un registro y modifica algunas cosas

CitarEl metodo para agregar la sección es igual que en el capitulo anterior, pero con la diferencia que ahora en vez de desvincular la "Bound Import Table", lo que vamos a hacer es un truquito que consiste en bajar la cabecera PE 0x28 bytes, para tener lugar para definir nuestra sección sin pisar la tabla. Al bajar la cabecera pisamos datos que no son importantes. Luego solo modificamos en offset PE, y listo, agregamos la sección sin desvincular la tabla.

Los datos a modificar en la cabecera entonces son:


Nombre   Valor   Tamaño
offset PE:   0xE0 - 0x28 = 0xB8   (4 bytes)
NumberOfSections:    0x0004 (+1)    (2 bytes)
AddressOfEntryPoint:   0x00014031    (4 bytes)
SizeOfImagebase:   0x00014050    (4 bytes)



Como notaran, ahora modificamos el OEP, con el de nuestro codigo (como ya tengo el codigo echo ya se que empiza en esa dire), y debemos anotar el OEP original del programa para hacer un salto luego de que nuestro codigo finalize, para que comienze el programa normalmente.

Lo cual elimina 0x28 bytes de la zona donde no hay nada o solo garbage, despues agrega esos 0x28 bytes para agregar la nueva sección y no modificar el archivo, sino queda inservible, después agrega la nueva sección.

A SizeOfImageBase le agrega los 50 bytes de la sección o eso creo.

En el código de ASM solo le agrega un jmp a donde inicia la ejecución normal, por ejemplo... en el ejemplo de Ferchu, la ejecución es en el offset 0x9D730000 e ImageBase 0x00000001

Entonces yo lo que haría es algo así

Código (asm) [Seleccionar]
    [BITS 32]                 
     
    jmp short cmd                 
     
    init:
       mov edx,7634e695h     
       call edx                           
       mov edx,76312acfh     
       call edx
       mov eax, 0x010739D
       jmp  eax                     
    cmd:
       CALL init
       db 'cmd',00h 


lo que significa que es AddressOfEntryPoint + ImageBase = 0x010739D

Pero aqui viene mi duda, ¿no entiendo donde Ferchu consiguió este dato?, ¿de dondé sacó 0x00014031?

CitarAddressOfEntryPoint:   0x00014031    (4 bytes)

quiero imaginar que abrio con ollydbg su codigo en asm, y 0x00014031 es la dirección de donde inicia

CitarCadena titulo                         "Soy el notepad y estoy infectado!!!\0"
Cadena msg                            "Infectado!!!\0"
call [siguiente instruccion]          E8 00 00 00 00
pop eax                               58
push 0                                6A 00
sub eax, 0x12                         2C 12
push eax                              50
sub eax, 0x24                         2C 24
push eax                              50
push 0                                6A 00
mov eax, 0x77D5050B                   B8 0B 05 D5 77       // B8 + direccion de MessageBoxA
call eax                              FF D0
mov eax, 0x010739D                    B8 9D 73 00 01       // B8 + entry point
jmp eax                               FF E0

¿Alguien sabe si 0x00014031 será la posición  en memoria de "call [siguiente instruccion] E8 00 00 00 00"? o  de donde saco 0x00014031?, a ver si alguien recuerda, y es que no puedo abrir cosas con ollydbg porque no me funciona aunque lo seguiré intentando, y casi no le entiendo a Windbg y con gdb pues no logro saber si funciona y no me gusta wine para cosas de windows.

Ya se que es un metodo muy viejo, y practicamente los AV ya lo detienen y etc... pero me dio por repasar  esto tan antiguo y tratar de hacerlas funcionar en Windows 10, ya es lo unico que me falta para intentar con nasm, espero me puedan ayudar

Saludos
.                                 

Flamer

hola belia tanto tiempo sin verte por acá

no te emociones no creo que pueda ayudarte con tu problema pero te cuento que si agregas bytes de mas y agrandas un archivo creo que te quedara inservible y tendrás que editarlo todo así que trata de mantener el mismo tamaño.

otra cosa en vez de ollydbg usa mejor este, ya que tiene su versión para 64 bits también

https://x64dbg.com/

saludos Flamer

Belial & Grimoire

Hola, si.. ya paso un buen rato

No lo pienso agrandar, tiene que quedar igual... solo es reemplazar bytes, pero en el ejemplo elimina bytes basura y luego agrega la misma cantidad de bytes que elimino para no desacomodar las posiciones y ahi coloca el nuevo registro, después cambia el entrypoint para que se ejecute tu código y en tu código tener ya un jmp de regreso al EntryPoint original para que se ejecute el programa normalmente, solo que no recuerdo de donde sale este registro

AddressOfEntryPoint:   0x00014031    (4 bytes)

.