Underc0de

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
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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 ;)