|
Mostrar Temas
|
Páginas: 1 [2]
|
11
|
Seguridad Informática / Bugs y Exploits / ¿me echais una mano? es un programa en assembler muy fácil.
|
en: 9 Febrero 2011, 01:06 am
|
a ver si alguien me puede echar una mano con este programa en assembler (pensado para generar una shellcode). Más simple no puede ser, quiero llamar a winexec para que ejecute la calculadora: (no hace nada). Cuando lo depuro con olly, por pasos, al llegar a la llamada a la dirección de winexec me dá un error de modo que esa dirección no puede ser leída. La dirección de winexec la obtengo con el típico programa que utiliza la función getprocadress, y en principio debería ser correcta.
.386 .model flat, stdcall option casemap:none
.data .code start: sub esp, 9h mov byte ptr [ebp-11h],63h mov byte ptr [ebp-10h],61h mov byte ptr [ebp-0fh],6Ch mov byte ptr [ebp-0eh],63h mov byte ptr [ebp-0dh],2Eh mov byte ptr [ebp-0ch],65h mov byte ptr [ebp-0bh],78h mov byte ptr [ebp-0ah],65h mov byte ptr [ebp-09h],00h push 5 lea eax, [ebp-11h] ;cargamos la direccion que apunta a nuestra cadena push eax mov eax,71c326d3h ;winexec call eax push 1 mov eax,772e2aefh ;exit process call eax end start
no hace nada, lo intento depurar con ollydbg pero no entiendo muy bien si hace lo correcto o no.
lo primero que hago es reservar espacio en la pila para 9 bytes. Luego inserto la cadena pero me salto unos bytes que había antes en la pila, por eso empieza en ebp-11h.
una vez insertada la cadena en la pila, "calc.exe/0", meto el parametro 5 (que equivale a SW_SHOW, y que es otro parámetro de winexec).
y finalmente llamo a winexec.
|
|
|
12
|
Seguridad Informática / Bugs y Exploits / duda acerca de cómo obtener la dirección de una función en una dll.
|
en: 7 Febrero 2011, 13:18 pm
|
hola estoy peleandome con una shellcode basica, sólo con fines didácticos, (en windows7) y he observado que a la hora de obtener la dirección (hardcodeada) de una función de una dll hay dos formas de hacerlo (pero me dá que en realidad son cosas distintas): - Una (que es la que utilizo yo y he comprobado que funciona) es obtentiendo la dirección de la función, con un programa que llame a getprocadress y me devuelva la dirección. Esta dirección es la que utilizo en la shellcode (y funciona, sólo que hay que volver a calcularla cada vez que se reinicia el sistema). - La otra no la he probado sólo la he visto, y consiste en utilizar un programa que me muestre las dependencias de un ejecutable, como por ejemplo dumpbin o dependencyWalker. Con estos lo que se obtiene es la dirección base de la dll y luego la dirección de la función en dicha dll y se suman ambas para obtener la dirección absoluta de la función, y así utillizarla en la shellcode. He observado que con este método siempre dá los mismos valores, aunque se reinicie el sistema. Además me dá los mismos valores aún analizando dos programas diferentes. entonces llegados a este punto me surge la duda de qué es lo que estoy obteniendo realmente en ambos casos ya que parece que estoy obteniendo la dirección de una función en ambos, pero obtengo resultados distintos en uno y en otro. un saludo.
|
|
|
13
|
Programación / Programación C/C++ / duda con getprocadress y kernel32.
|
en: 4 Febrero 2011, 00:07 am
|
hola, estoy intentando conseguir una shellcode basica para windows, y me encuentro con el siguiente problema, que no sé por qué sucede:
Tengo una shellcode que hace algo simple: llama a sleep y sale del proceso. La cargo mediante una aplicación en c también simple que no hace otra cosa que cargarse y llamar ejecutar la shellcode.
Para obtener las direcciones de las funciones Sleep y ExitProcess lo he hecho mediante un programa en c que llama a getprocadress de esta forma: GetProcAddress(LoadLibrary("kernel32.dll"),"ExitProcess")
y me devuelve la dirección de ExitProcess y lo mismo con sleep. Lo pongo en la shellcode y todo parece funcionar, pero el problema es que al reiniciar el ordenador GetProcAdress para la misma función me dá un valor distinto. De manera que tengo que obtener dicha dirección cada vez que apago o reinicio la máquina.
Por lo que vengo leyendo no parece muy normal. He visto que el programa sólo funcionaría en mi máquina pero no había visto en ningún sitio que tuviese que actualicar la dirección de las funciones cada vez que reinicio el sistema.
¿es eso normal? El sistema operativo que utilizo es windos7.
un saludo.
|
|
|
14
|
Seguridad Informática / Bugs y Exploits / shellcode básica para windows.
|
en: 29 Enero 2011, 15:43 pm
|
hola, no se si es aquí donde debería ir el post, lo que quiero es hacer una shellcode muy muy básica: tengo el programa asm que lo que hace es ejecutarse,dormir,y descargarse (poca cosa):
.386 .model flat, stdcall option casemap:none
.data .code start: push 9999 mov eax,77b6ef66h ;sleep call eax mov eax,77b72aefh ;exit process call eax end start
para ello utilizo direcciones absolutas o harcodeades (me parece que ese es el término) de manera que cada vez que arranco el sitema cambian, pero eso no es problema.
el problema es que quiero, primero pasarla a opcodes y luego ejecutarla con cualquier apllicación lo más sencilla posible.
Para pasarla a opcodes no sé como hacerlo por eso me gustaría saber si hay algún programa que lo pueda hacer por mí. El programa está ensamblado con masm.
Y para ejecutarla no sé muy bien sin esto sería correcto: He leído algo de que hay que hacer buffer overflow para ejecutarla, pero por otro lado también he visto que se ejecutaba de forma "manual" con este programita:
#include <stdio.h> #include <string.h>
char shellcode[] = "aquí deberían ir los opcodes"; void main() { int *ret; ret=(int *)&ret+2; (*ret) = (int)shellcode; }
Un saludo.
|
|
|
15
|
Seguridad Informática / Análisis y Diseño de Malware / una duda, intentando comunicar mu con mk.
|
en: 8 Diciembre 2010, 12:59 pm
|
hola, estaba siguiendo el pdf de hendrix para comunicar el modo usuario con el modo kernell y tengo algunas dudas basicas. Yo lo estoy haciendo en windows 7 y utilizo para compilar el x86 free build environment, del windows 7, del ddk. El código del driver es este (faltan las rutinas de unload, y de control que no las pongo porque no importan en esta duda): #include <ntddk.h> const WCHAR Device[]=L"\\Device\\bananas"; //modo kernell const WCHAR sLink[]=L"\\DosDevices"; //modo usuario UNICODE_STRING Dev,lnk; NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath) { NTSTATUS s; unsigned int i; //DriverObject->DriverUnload=Salir; for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++) { // DriverObject->MajorFunction[i]=Control; } RtlInitUnicodeString(&Dev,Device); RtlInitUnicodeString(&lnk,sLink); s=IoCreateDevice(DriverObject,0,&Dev,FILE_DEVICE_UNKNOWN,0,0,&DriverObject->DeviceObject); if (NT_SUCCESS(s)) { s=IoCreateSymbolicLink(&lnk,&Dev); if(!NT_SUCCESS(s)) { IoDeleteDevice(DriverObject->DeviceObject); DbgPrint("Linking Error"); } else { DbgPrint("Cargado"); } } else { DbgPrint("Error IoCreate"); } return STATUS_SUCCESS; }
Con este codigo me da "Linking Error", con lo cual el DeviceObject debería estar creado y llamarse "bananas", pero he buscado con el WinObject dentro del directorio "Device" y no he visto el objeto creado. ¿No debería de haberse creado el objeto "bananas" dentro del directorio "Device"? Además tampoco he visto por ningún sitio el directorio DosDevices. Un saludo.
|
|
|
|
|
|
|