Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - black_flowers

#51
Cita de: Sagrini en 31 Enero 2011, 20:19 PM
Y... de donde sacas esos bytes nulos?
Código (asm) [Seleccionar]

.386
.model flat, stdcall
option casemap:none

.code
start:
push word 0x9999
mov eax,  0x77b6ef66   ;sleep
call eax
mov eax, 0x77b72aef   ;exit process
call eax
end start


Ehh, asi deberia ir...

pues los bytes nulos me aparecen en el olydbg si en lugar de empujar el valor en en decimal 99999999 pongo 9999, y en los opcodes ese número aparece como 0f270000.

Al principio no le encontraba mucho sentido, pero me di cuenta de que 9999 en hexadecimal es 270f en lugar de 0f27, con lo cual los ceros que pone a la derecha en realidad serían ceros a la izquierda, resultado de pasar los argumentos en la forma little endian.

Y no sé cómo deshacerme de los dichosos ceros, he visto algo sobre utilizar xor, pero en este caso no se me ocurre el cómo utilizarlo.
#52
Cita de: Sagrini en  4 Febrero 2011, 00:37 AM
Que yo sepa Windows no aletoriza la memoria...
Vamos a ver, y si llamas a GetProcAdress en tu shellcode? Se llaman shellcodes universales.

La direccion solo cambia entre versiones y actualizaciones SP1-SPx. Por eso son shellcodes universales.
Una para Win7 32 Bits Home SP1 ira para todos los Win7 32 Bits Home SP1.

Suerte!

no, es que no me he explicado bien, en realidad no llamo a getprocadress desde la shellcode. si así fuera está bien lo que tú dices y sería una shellcode universal, pero lo que yo hago es mucho más simple (ya he puesto en el título que es una shellcode básica). Lo que yo hago es obtener la dirección de la función con getprocadress, pero no desde la shellcode, sino que la obtengo con un programa en c, y luego pongo la dirección (tal cual) en mi shellcode con lo cual es harcodeada a más no poder  ;D

ahora sí que toca lo difícil que sería llamar a getprocadress desde la shellcode que eso ya va a ser más complicado.

un saludo.
#53
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.
#54

Cita de: Sagrini en 29 Enero 2011, 20:56 PM
Que yo sepa en Windows las llamadas al sistema no cambian, solo lo hacen entre versiones. Esa shellcode solo ira en tu PC, pero seguira llendo al reiniciar.
pero en realidad he comprobado que cambia cada vez que arranco y la razón podría ser que yo obtengo la dirección, mediante un programa en vc++ que carga el kernel32.dll y obtiene la dirección de las funciones mediante getprocadress. He visto otros métodos que lo sacaban buscando en las dependencias del propio ejecutable, de todas formas como ya he dicho no tiene mayor importancia para lo que yo estoy haciendo.
Cita de: Sagrini en 29 Enero 2011, 20:56 PM
Pues lo que tienes que hacer es sencillamente meterla en un programa y abrirlo con Olly o GDB... Lo que puedes hacer es meterle unos cuantos NOPS que resalten antes y despues de tu shellcode, encuentras los nops y copias... En linux uso "hexdump -C" pero en Windows haria eso...
perfecto es la solución adecuada, pero todavía tengo problemas cuando aparece una cadena nula (no sé cómo elimminarla). He visto que se pueden utilizar xor para evitar cadenas nulas, pero en mi caso es el argumento que le paso a la función sleep, que es de 270f0000, con lo cual esos cuatro ceros del final no se cómo deshacerme de ellos, a no ser cambiando el valor que le paso a sleep y en lugar de 9999, le paso 99999999 (es una opción).
Cita de: Sagrini en 29 Enero 2011, 20:56 PM
Para ejecutarla se suele hacer algo asi:

#include <stdio.h>
#include <string.h>

char code[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80";

int main(int argc, char **argv)
{
   printf ("TinShell V1.0 : By Sagrini : %d bytes\n", strlen (code));
   (*(void(*)()) code)();
   return 0;
}


y esto me da un error(c2440):
type_cast, cannot conver from char[20] to void (__cdecl*)(void)

y con respecto al que puse yo...

   int *ret;
   ret=(int *)&ret+2;
   printf("%d bytes\n", sizeof(code));
   (*ret) = (int)code;

compila pero dudo mucho que sea el correcto para ejecutar la shellcode, es el único de los que encontré en internet que me compilaba y por eso decidí usarlo, no obstante el que más se utiliza es el que tú pones, el problema es que me da ese error al compilar. Yo uso el microsoft visual c++ 2008, no se si será por el compilador...


un saludo!
#55
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.
#56
estaba escribiendo aquí una parrafada que te cagas porque no me aparecía el objeto y acabo de entender tu respuesta. Es cierto que me dá ese error, y no me había fijado en que al dar ese error se destruye el DeviceObject con lo cual es lógico que no este cargado.

Bueno ahora habrá que intentar crear el simbolic link de manera satisfactoria,

sigo intentandolo, un saludo. ;D
#57
vale, gracias.
Pero sigo sin entender por qué no encuenctro mi device creado con el nombre "bananas" en la carpeta "Device", con el WinObj. ¿no debería estar creado el dispositivo en dicha carpeta?

un saludo.
#58
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.