send
Grupo de Telegram
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Creando Una ShellCode En Fasm.

  • 0 Respuestas
  • 1952 Vistas

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

Desconectado Juan

  • *
  • Underc0der
  • Mensajes: 159
  • Actividad:
    0%
  • Reputación 0
  • Ex-Drinky
    • Ver Perfil
« en: Febrero 26, 2011, 12:58:34 pm »
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: 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
#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 MessageBoxA@User32.dll que es: 0x7E3D07EA
Y la direccion de otra API mas LoadLibrary@Kernel32.dll 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
  1. ; direcciones de funciones obtenidas en windows Sp3
  2. Format PE GUI 4.0
  3. entry start
  4.  
  5. include 'win32ax.inc'
  6.  
  7. start:
  8.     stdcall funcion
  9.  
  10.     proc funcion
  11.         call delta ; aplicamos la tecnica del Offset Delta
  12.         delta:
  13.             pop edx
  14.             sub edx,delta
  15.             mov ecx,edx
  16.             add ecx,libreria
  17.  
  18.         mov eax,7C801D7Bh ;Metemos el eax la direccion de LoadLibrary@Kernel32
  19.  
  20.         push ecx   ; Metemos en la pila la libreria User32
  21.         call eax     ;Llamamos a LoadLibrary  para cargar User32
  22.  
  23.         push 0
  24.         push 0
  25.         push 0
  26.         push 0
  27.  
  28.         mov eax,7E3D07EAh ; Metemos en eax la direccion de MessageBoxA@User32.
  29.  
  30.         call eax  ; Llamamos a MessageBoxA
  31.         ret
  32.     endp
  33.         libreria db 'user32.dll'
  34.  
  35.                                        

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 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


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: Visual Basic
  1. Private Sub command1_click()
  2. ' codigo by Messerchmitt
  3. Dim Drinky() As String
  4. Drinky() = Split(Text1.Text, " ")
  5. For a = LBound(Drinky) To UBound(Drinky)
  6. Text2.Text = Text2.Text & Drinky(a) & "\x"
  7. Next a
  8. Text2.Text = "\x" & Mid(Text2.Text, 1, Len(Text2.Text) - 2)
  9. End Sub
  10.  

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

Código: 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
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: 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
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: 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
\xE8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x5A\x81\xEA\x0A\x10\x40\x00\x89\xD1\x81\xC1
Código: 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
\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: 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
\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
  1. char code[] = "\xE8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x5A\x81\xEA\x0A\x10\x40"\
  2. "\x00\x89\xD1\x81\xC1\x31\x10\x40\x00\xB8\x7B\x1D\x80\x7C\x51\xFF\xD0\x6A\x00\x6A"\
  3. "\x00\x6A\x00\x6A\x00\xB8\xEA\x07\x3D\x7E\xFF\xD0\xC3\x75\x73\x65\x72\x33\x32\x2E"\
  4. "\x64\x6C\x6C\x00";
  5.  
  6. int main()
  7. {      
  8.         int (*func)();
  9.         func = (int (*)()) code;
  10.         (int)(*func)();
  11. }
  12.  
  13.  

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.

 

¿Te gustó el post? COMPARTILO!