Creando Una ShellCode En Fasm.

Iniciado por Juan, Febrero 26, 2011, 12:58:34 PM

Tema anterior - Siguiente tema

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

Bueno, ago este 'tutorial' porque me costo bastante pillar esto de como crear una ShellCode. Estube parte de la tarde de ayer y parte de la tarde de hoy para crear una propia ShellCode basiquita.

Conocimientos previos de ASM y algo de C y VB.

Lo primero que tenemos que hacer es saber lo que quieres que haga nuestra shellcode ( obvio,no?  :laugh:) me refiero a que api usara... para sacar la direccion de la api en su correspondiente libreria. Para eso usaremos un simple programilla creado en C:

Código: php
#include <windows.h>
#include <stdio.h>

/***************************************
arwin - win32 address resolution program
by steve hanna v.01
  vividmachines.com
  shanna      @uiuc.edu
you are free to modify this code
but please attribute me if you
change the code. bugfixes & additions
are welcome please email me!
to compile:
you will need a win32 compiler with
the win32 SDK

this program finds the absolute address
of a function in a specified DLL.
happy shellcoding!
***************************************/


int main(int argc, char** argv)
{
HMODULE hmod_libname;
FARPROC fprc_func;

printf("arwin - win32 address resolution program - by steve hanna - v.01\n");
if(argc < 3)
{
printf("%s <Library Name> <Function Name>\n",argv[0]);
exit(-1);
}

hmod_libname = LoadLibrary(argv[1]);
if(hmod_libname == NULL)
{
printf("Error: could not load library!\n");
exit(-1);
}
fprc_func = GetProcAddress(hmod_libname,argv[2]);

if(fprc_func == NULL)
{
printf("Error: could find the function in the library!\n");
exit(-1);
}
printf("%s is located at 0x%08x in %s\n",argv[2],(unsigned int)fprc_func,argv[1]);
}


yo por ejemplo voi a hacer que mi ShellCode haga un MessageBox. Osea que obtengo la direccion de [email protected] que es: 0x7E3D07EA
Y la direccion de otra API mas [email protected] que es: 0x7C801D7B

Con LoadLibrary lo que haremos sera cargar la libreria User32 para poder hacer el MessageBox.

Yo ya programe el código de mi ShellCode en Fasm:

Código: asm
; direcciones de funciones obtenidas en windows Sp3
Format PE GUI 4.0
entry start

include 'win32ax.inc'

start:
    stdcall funcion

    proc funcion
        call delta ; aplicamos la tecnica del Offset Delta
        delta:
            pop edx
            sub edx,delta
            mov ecx,edx
            add ecx,libreria

        mov eax,7C801D7Bh ;Metemos el eax la direccion de LoadLibrary@Kernel32

        push ecx   ; Metemos en la pila la libreria User32
        call eax     ;Llamamos a LoadLibrary  para cargar User32

        push 0
        push 0
        push 0
        push 0

        mov eax,7E3D07EAh ; Metemos en eax la direccion de MessageBoxA@User32.

        call eax  ; Llamamos a MessageBoxA
        ret
    endp
        libreria db 'user32.dll'

                                       


Si se fijan obtengo la direccion de la variable una vez esta cargado el código en memoria, ya que si simplemente metiera el código normal sin obtener la direccion de la variable en memoria petaría porque la variable seguramente no se encontraria en la misma direccion de memoria donde la compilamos  :).

Para obtener la direccion en memoria de la variable usamos la tecnica del " Delta Offset". Tutorial explicativo sobre como funciona esta tecnica No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



Bien, aora que tenemos shellcode programada generamos el ejecutable y lo abrimos con el OllyDbg para obtener los opcodes a mano.

a mi me quedo una cosa así:



Aora copie linea por linea los opcodes. Seleccione la linea y hice Edit >Binary Copy.
Copie todos los opcodes en un bloc de notas y para pasarlo a una shellcode real utilizaremos una pequeña funcion programada por Messerschmitt en vb6:

Código: vb
Private Sub command1_click()
' codigo by Messerchmitt
Dim Drinky() As String
Drinky() = Split(Text1.Text, " ")
For a = LBound(Drinky) To UBound(Drinky)
Text2.Text = Text2.Text & Drinky(a) & "\x"
Next a
Text2.Text = "\x" & Mid(Text2.Text, 1, Len(Text2.Text) - 2)
End Sub


E Introduciendo los opcodes tal cual los optengo del Olly en el text1:

Código: php
E8 00 00 00 00 E8 00 00 00 00 5A 81 EA 0A 10 40 00 89 D1 81 C1 31 10 40 00 B8 7B 1D 80 7C 

Código: php
51 FF D0 6A 00 6A 00 6A 00 6A 00 B8 EA 07 3D 7E FF D0 C3 75 73 65 72 33 32 2E 64 6C 6C 00


Me saldra ya con formato de ShellCode en el text2:

Código: php
\xE8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x5A\x81\xEA\x0A\x10\x40\x00\x89\xD1\x81\xC1

Código: php
\x31\x10\x40\x00\xB8\x7B\x1D\x80\x7C\x51\xFF\xD0\x6A\x00\x6A\x00\x6A\x00\x6A\x00\xB8\xEA\x07\x3D

Código: php
\x7E\xFF\xD0\xC3\x75\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x00


(Lo siento, parti las cadenas porque sino deforman el Post..)

:laugh: Aora solo provamos nuestra ShellCode (yo la prove en Dev c++ con la siguiente función):

Código: c
char code[] = "\xE8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x5A\x81\xEA\x0A\x10\x40"\
"\x00\x89\xD1\x81\xC1\x31\x10\x40\x00\xB8\x7B\x1D\x80\x7C\x51\xFF\xD0\x6A\x00\x6A"\
"\x00\x6A\x00\x6A\x00\xB8\xEA\x07\x3D\x7E\xFF\xD0\xC3\x75\x73\x65\x72\x33\x32\x2E"\
"\x64\x6C\x6C\x00";

int main()
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}



Y vemos que funciona  :D:



Maravilloso,no?
jaja, bueno aora podrán crear sus shellcodes desde FAsm y porlomenos si fallan en algo, ya no caeran en las mismas tonterias que cai yo..



Este tutorial no habría sido posible sin el Tutorial De |Shadow| con el que me inicie. Tambien quiero agradecer a Zero toda la ayuda que me da y como no a Jep... este tutorial va dedicado a el  :cura:

PD: tambien a MesserschatGay por ese código en VB.  ;)


Espero que les halla gustado. sin mas que decir me despido.

salu2!,Drinky94.