estaba intentando crear una shellcode con este tutorial:
http://www.portalhacker.net/b2/tutorial-creando-shellcode/125582/
utilizo code blocks y windows 7 en una maquina virtual , estoy haciendo algo mal o es que esta forma de hacerlas no funciona para win 7 y me falta hacer algo?
el proceso es : se busca la ubicacion de las apis a usar, se crea la hice en nasm luego con ollydbg se abre y se le da binary copy para luego pegarlo todo en un editor te texto.
pero me da error a en el momento crearla y compilarla en un programa de c
cuando la ejecuto normal funciona perfectamente:
.386
.model flat,stdcall
option casemap:none
.code
lib db "User32.dll",0
inicio:
call delta
delta:
pop ecx
sub ecx,offset delta
add ecx,offset lib
mov eax,776f2864h ;direccion de loadlibraryA
push ecx
call eax
push 0
push 0
push 0
push 0
mov eax,777dea71h ;//direccion de MessageBoxA
call eax
end inicio
muchas gracias de antemano :D
Buenas no entendí muy bien el problema, pero la shellcode que has puesto está programada en MASM, además de que posee algunas inconsistencias como por ejemplo algunos includes que no son necesarios debido a que las APIs se están llamando directamente.
Algunas pruebas:
- Ensamblar en MASM
- verifica que las direcciones de las APis concuerden con las de tu SO (OllyDbg -> go to -> LoadLibraryA y verificas que el address sea el mismo, al igual que para MessageBoxA)
- ¿En qué parte falla el código?
Saludos
Citaralgunos includes que no son necesarios debido a que las APIs se están llamando directamente.
sep tienes razon ya las quite
CitarEnsamblar en MASM
ok probare eso
Citarverifica que las direcciones de las APis concuerden con las de tu SO (OllyDbg -> go to -> LoadLibraryA y verificas que el address sea el mismo, al igual que para MessageBoxA)
las direcciones las saque de mi mismo pc usando el programa arwin. Asi que no creo ademas cuando compilo normal el programa funciona perfecto.
Citar- ¿En qué parte falla el código?
no lo se exactamente pero crashea cuando tengo la shellcode e intento compilarla en este programa:
char code[] = "mi shellcode";
int main()
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
Pues entonces llamala directamente.
char code[] = "mi shellcode";
int main()
{
__asm call code
}
Un saludo.
gracias cpu pero no funciono
el tutorial del que me guio esta hecho para fasm y ahi si funciona con sus respectivos cambios pero en masm no.(empezare con fasm pero igual me gustaria saber que esta pasando)
@.:UND3R:. tenias razon era masm no nasm en todo caso ya se cual es el error pero no como solucionarlo
el delta offsetno esta sirviendo cuando le digo:
lib db "User32.dll",0
add ecx,offset lib
push ecx
al parecer no esta tomando la direccion que indica la ubicacion de la cadena "user32.dll" por eso cuando lo compilo funciona correctamente pero cuando lo convierto en shellcode no.
para llegar a esa Conclusión probe lo siguiente:
en el codigo en c carge User32.dll necesaria para MessageBoxA
char code[] = "mi shellcode";
int main()
{
LoadLibrary("User32.dll");
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
y le quite el delta offset a el codigo en asm
.386
.model flat,stdcall
option casemap:none
.code
lib db 'User32.dll',0
inicio:
mov ecx,offset lib
mov eax,75a62864h ;direccion de loadlibraryA
push ecx
call eax
push 0
push 0
push 0
push 0
mov eax,76d3ea71h ;//direccion de MessageBoxA
call eax
mov eax,75a62acfh // exitprocess
call eax
end inicio
en ese caso si sale la ventanita e_e
No te lo tomes como ofensivo pero lo que veo es que tienes muy pocos conocimientos de assembly. Te recomiendo que lo aprendas.Un muy buen libro es el de kip irvine (En español encima) y tiene un workbook para practicar.Despues el shellcode no es mas que una secuencia de opcodes.El libro de irvine explica con el ensamblador MASM , si tengo que decidir cual aprender desde el principio seria NASM (Disponible en GNU/Linux, OpenBSD, todo tipo de UNIX like). Tambien podrias escribir el code en C y dsp obtener los opcodes con objdump u otro por el estilo , pero deberias sacar todo lo que agrega el compilador.
PD:Te das cuenta que es MASM por las directivas que utiliza.
si tienes razon hasta ahora chapuceo en todo esto , pero no comprare un libro : P
Hay que leer primero el libro y luego comprarlo si te gusta. Yo lo baje de internet y lo mande a imprimir a una imprenta que me hace precio.
El workbook: http://kipirvine.com/asm/workbook/asmWorkbook.pdf
Saludos!
se borro todo , decia que disculpa pero ese libro esta terrible es de 16 bits , para msdos y las paginas es tan todas al costado
si quieren cierren el post ya se desvio : P
Tas muy equivocado cubre 32 bits , "Lenguaje ensamblador para computadoras basadas en intel" , va por la sexta edicion creo , yo tengo la 5ta.Es mas hay un capitulo dedicado a la API de windows. Ademas si quieres diseñar tu propio OS tienes que saber 16 bits para el bootloader y en el tema de rootkits tmb juega un importante papel.
Sludos y perdon por desviar el tema , solo que si lees este libro , vas a tener muchas menos preguntas y una gran variedad de herramientas para afrontar el tema del exploiting, malware ,etc.
solucionado
ya me funciono , al parecer desde windows vista la ubicacion de kernel32.dll es varia con cada reinicio y hay que hacer algunas cosas adicionales.Pero al menos ahora una vez encontrado la ubicacion de las librerias funciona perfecto:
.386
.model flat,stdcall
option casemap:none
.code
inicio:
call delta
delta:
pop ecx
sub ecx,offset delta
add ecx,offset lib
mov eax,77272864h ;direccion de loadlibraryA varia
push ecx
call eax
push 0
push 0
push 0
push 0
mov eax,778eea71h ;//direccion de MessageBoxA varia
call eax
retn
lib db "User32.dll",0
end inicio
Otra cosa que puedes hacer (para no usar el deltaoffset) es:
.386
.model flat,stdcall
option casemap:none
.code
inicio:
call delta ;provoca el PUSH de la direccion del string que sigue
db "User32.dll",0
delta:
mov eax,77272864h ;direccion de loadlibraryA varia
call eax
push 0
push 0
push 0
push 0
mov eax,778eea71h ;//direccion de MessageBoxA varia
call eax
retn
end inicio
Para solucionar el problema de las DLLs, sólo necesitas LoadLibrary y GetProcAddress. Luego, usando el método que haz puesto o el que te dejo aquí; haces LoadLibrary y GetProcAddress y ya tienes la direccion real de la API.
Hay múltiples ejemplos de llamadas a API con código pic en internet.
Saludos!
perdón la ignorancia pero ustedes le llaman shellcode al bytecode que copian y pegan de su depurador y lo usan en c++ ? o llaman shellcode a otra cosa, ?
Shellcode es esto (http://en.wikipedia.org/wiki/Shellcode).
Saludos!