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: Seleccionar todo
#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]);
}
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: Seleccionar todo
; 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'
Para obtener la direccion en memoria de la variable usamos la tecnica del "Offset Delta". Tutorial explicativo sobre como funciona esta tecnica [Enlace externo eliminado para invitados]
[hr]
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: Seleccionar todo
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
Código: Seleccionar todo
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: Seleccionar todo
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
Código: Seleccionar todo
\xE8\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x5A\x81\xEA\x0A\x10\x40\x00\x89\xD1\x81\xC1
Código: Seleccionar todo
\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: Seleccionar todo
\x7E\xFF\xD0\xC3\x75\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x00
:laugh: Aora solo provamos nuestra ShellCode (yo la prove en Dev c++ con la siguiente función):
Código: Seleccionar todo
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)();
}

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..
[hr]
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.