Underc0de - La Casa de los Informáticos

Programación General => ASM => Mensaje iniciado por: Juan en Abril 15, 2013, 09:31:29 AM

Título: ShellCode Kernel32
Publicado por: Juan en Abril 15, 2013, 09:31:29 AM
// ShellCode que obtiene la direccion de Kernel32.DLL en el proceso
// Programada por Juan fary (mDrinky)
// [email protected]

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

char code[] = "\x31\xFF\x64\x03\x7F\x30\x8B\x7F\x0C\x8B\x7F\x1C\x8B\x3F\x8B\x57"\
              "\x20\x8B\x4F\x08\x52\x51\x57\x56\xE8\x00\x00\x00\x00\x5B\x81\xEB"\
              "\x1D\x10\x40\x00\x53\x59\x81\xC1\x8A\x10\x40\x00\x53\x81\xC3\x46"\
              "\x10\x40\x00\x51\x52\xFF\xD3\x5B\x5E\x5F\x59\x5A\x8B\x3F\x83\xF8"\
              "\x01\x75\xCB\x89\xC8\xC3\xE8\x00\x00\x00\x00\x5B\x81\xEB\x4B\x10"\
              "\x40\x00\x81\xC3\x62\x10\x40\x00\x55\x89\xE5\x8B\x75\x08\x8B\x4D"\
              "\x0C\x49\x41\xAC\x38\x01\x75\x0D\x3C\x00\x74\x02\xFF\xE3\x80\x39"\
              "\x00\x74\x0B\x75\x00\xB8\x00\x00\x00\x00\x5D\xC2\x08\x00\xB8\x01"\
              "\x00\x00\x00\x5D\xC2\x08\x00\x0A\x0D\x00\x6B\x00\x65\x00\x72\x00"\
              "\x6E\x00\x65\x00\x6C\x00\x33\x00\x32\x00\x2E\x00\x64\x00\x6C\x00\x6C\x00";

int main()
{
        int (*func)();
        func = (int (*)()) code;
        printf("Kernel32 Shellcode: 0x%x\n",(int)(*func)());
        printf("KernelGetModuleHandle: 0x%x\n",GetModuleHandle("KERNEL32.DLL"));
        system("PAUSE");
       
        return 0;
}


Código (asm) [Seleccionar]
; mDrinky

format PE Console

include 'win32ax.inc'
entry start

section '.text' code readable executable
start:
;db 0x31,0xFF,0x64,0x03,0x7F,0x30,0x8B,0x7F,0x0C,0x8B,0x7F,0x1C,0x8B,0x3F,0x8B,0x57
;db 0x20,0x8B,0x4F,0x08,0x52,0x51,0x57,0x56,0xE8,0x00,0x00,0x00,0x00,0x5B,0x81,0xEB
;db 0x1D,0x10,0x40,0x00,0x53,0x59,0x81,0xC1,0x88,0x10,0x40,0x00,0x53,0x81,0xC3,0x44
;db 0x10,0x40,0x00,0x51,0x52,0xFF,0xD3,0x5B,0x5E,0x5F,0x59,0x5A,0x8B,0x3F,0x83,0xF8
;db 0x01,0x75,0xCB,0xC3,0xE8,0x00,0x00,0x00,0x00,0x5B,0x81,0xEB,0x49,0x10,0x40,0x00
;db 0x81,0xC3,0x60,0x10,0x40,0x00,0x55,0x89,0xE5,0x8B,0x75,0x08,0x8B,0x4D,0x0C,0x49
;db 0x41,0xAC,0x38,0x01,0x75,0x0D,0x3C,0x00,0x74,0x02,0xFF,0xE3,0x80,0x39,0x00,0x74
;db 0x0B,0x75,0x00,0xB8,0x00,0x00,0x00,0x00,0x5D,0xC2,0x08,0x00,0xB8,0x01,0x00,0x00
;db 0x00,0x5D,0xC2,0x08,0x00,0x0A,0x0D,0x00,0x6B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00
;db 0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00
;db 0x00

       xor edi,edi
       add edi,[fs:edi+30h]
       mov edi,[edi+0ch]
       mov edi,[edi+1ch]
       mov edi,[edi]

       next_module:

       mov edx,[edi+0x20]
       mov ecx,[edi+0x8]

       push edx
       push ecx
       push edi ;..
       push esi ;..

       call offset1
       offset1:
       pop ebx
       sub ebx,offset1

       push ebx
       pop ecx  ; Para calcular kernel
       add ecx,Kernel

       push ebx ; guardamos delta

       add ebx,CompararCadenas

       push ecx
       push edx
       call ebx ; Funcion comparar

       ;stdcall ebx,edx,ecx

       pop ebx  ; salvamos el delta

       pop esi ;..
       pop edi ;..
       pop ecx
       pop edx

       mov edi,[edi]

       ;add ebx,next_module

       cmp eax,1
       jne next_module

       mov eax,ecx   ; EAX = KERNEL32.DLL


       cinvoke printf,"Mediante el PEB: %x",eax;ecx
       cinvoke printf,salto

       cinvoke GetModuleHandleW,Kernel
       cinvoke printf,"Mediante GetModuleHandle: %x",eax
       cinvoke printf,salto


       ret

CompararCadenas:
        ; registros que usa EAX, ECX, ESI, EDI, EBX

        call offset2   ; delta offset
        offset2:
        pop ebx
        sub ebx,offset2

        add ebx, bucle   ; delta para la etiquta bucle

        push ebp
        mov ebp, esp

        mov esi,dword[ebp+8]
        mov ecx,dword[ebp+12]
        dec ecx
        bucle:
            inc ecx
            lodsb
            cmp byte[ecx],al
            jne diferentes
            cmp al,0
            je comprobar
            jmp ebx
        comprobar:
            cmp byte[ecx],0
            je iguales
            jne diferentes
        diferentes:
            mov eax,0
            pop ebp
            ret 8
        iguales:
            mov eax,1
            pop ebp
            ret 8

       salto              db 10,13,0
       Kernel             db 0x6B,0x00,0x65,0x00,0x72,0x00,0x6E,0x00,0x65,0x00,0x6C,0x00,0x33,0x00,0x32,0x00,0x2E,0x00,0x64,0x00,0x6C,0x00,0x6C,0x00,0x00,0x00

section '.idata' import data readable writeable
        library MSVCRT,'msvcrt.dll',\
                KERNEL32,'KERNEL32.DLL'

        import MSVCRT,printf,'printf'

        import KERNEL32,lstrcmpW,'lstrcmpW',\
               GetModuleHandleW,'GetModuleHandleW'         


saludos.
Título: Re:ShellCode Kernel32
Publicado por: ANTRAX en Abril 15, 2013, 10:10:03 AM
Pedazo de codigo!
Muchisimas gracias bro!
Te dare tu primer karma!
Título: Re:ShellCode Kernel32
Publicado por: Danyfirex en Abril 19, 2013, 10:08:05 AM
Excelente mDrinky. me podrias decir porque en W7 x64 el código en FASM se cuelga. osea muestra los datos bien pero deja de funcionar.
con  C funciona perfecto.

Título: Re:ShellCode Kernel32
Publicado por: Juan en Abril 19, 2013, 03:14:41 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Excelente mDrinky. me podrias decir porque en W7 x64 el código en FASM se cuelga. osea muestra los datos bien pero deja de funcionar.
con  C funciona perfecto.

Hola, no tengo x64 y no lo puedo probar bien pero vamos así mirando por encima he he dado cuenta de que aqui:

Código (asm) [Seleccionar]

cinvoke GetModuleHandleW,Kernel


No sería con cinvoke sino con invoke

Código (asm) [Seleccionar]
invoke GetModuleHandleW,Kernel

Ya que es una llamada stdcall y no _cdecl

Prueba haber si es eso y me comentas ;)

un saludo!
Título: Re:ShellCode Kernel32
Publicado por: Danyfirex en Abril 19, 2013, 05:22:18 PM
Como no me di cuenta  >:(  Excelente Capo era eso.  ;D gracias
Título: Re:ShellCode Kernel32
Publicado por: Juan en Abril 19, 2013, 11:55:47 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Como no me di cuenta  >:(  Excelente Capo era eso.  ;D gracias

El fallo era mio, nada de gracias.

Un saludo. ;)
Título: Re:ShellCode Kernel32
Publicado por: -Nox- en Mayo 15, 2013, 05:58:52 PM
Funciona en wVista para arriba? Si no mal recuerdo en el orden de inicialización que se cargan los módulos es ntdl.dll, kernelbase.dll, kernel32.dll y tú estás cogiendo el segundo módulo, dando por entendido que es kernel32.dll sin tener en cuenta que kernelbase se carga antes...

Saludos,
Nox.
Título: Re:ShellCode Kernel32
Publicado por: Juan en Mayo 15, 2013, 07:22:27 PM
Hola iNox, si lees el código completo, vas a ver que va comparando todos los modulos con la cadena "KERNEL32.DLL", hasta que encuentra la cadena verdadera y a apartir de ahí obtiene el modulo.

Creo que funciona en todas las versiones de windows incluso en windows 8.

un saludo!
Título: Re:ShellCode Kernel32
Publicado por: -Nox- en Mayo 16, 2013, 01:25:03 PM
uh! tienes razón, no le di al scroll para bajar jeje, sin embargo el código se puede reducir bastante, yo hice hace tiempo un escrito acerca del peb y como obtener los módulos:

http://www.noxsoft.net/2012/06/undocumented-peb-accediendo-los-modulos/


Saludos,
Nox.
Título: Re:ShellCode Kernel32
Publicado por: Juan en Mayo 16, 2013, 04:12:04 PM
Muy bueno iNox, me lo voy a leer sin duda  :)

un saludo!
Título: Re:ShellCode Kernel32
Publicado por: Juan en Mayo 17, 2013, 09:05:37 AM
La verdad es que la shellcode sale 3 veces mas reducida, lo que nose es hasta que punto puede ser fiable comprobar el '3' en la posición 12  :-\

Para FASM.

Código (asm) [Seleccionar]
db 0x64,0x8B,0x40,0x30,0x8B,0x40,0x0C,0x8D,0x40,0x14,0x31,0xC0,0x64,0x8B,0x40,0x30
db 0x8B,0x40,0x0C,0x8B,0x40,0x14,0x8B,0x00,0x89,0xC2,0x8B,0x52,0x28,0x80,0x7A,0x0C
db 0x33,0x75,0xF3,0x8B,0x40,0x10 ;,0xC3

; eax = Kernel32.dll





Muy interesante tu web!!  ;D
Título: Re:ShellCode Kernel32
Publicado por: -Nox- en Junio 17, 2013, 03:07:45 PM
Es muy fiable :D, no me ha dado problemas hasta ahora ;)