shellcode básica para windows.

Iniciado por black_flowers, 29 Enero 2011, 15:43 PM

0 Miembros y 2 Visitantes están viendo este tema.

black_flowers

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.

Garfield07

Bueno, el post va en Bugs y Exploits. Luego le digo a un mod que te lo mueva...

Cita de: black_flowers en 29 Enero 2011, 15:43 PM
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.
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.

Cita de: black_flowers en 29 Enero 2011, 15:43 PM
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.
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...
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;
}

Este code es mio, de una shellcode. En char code [] le metes tu shellcode...

Y... pones void main (): No estamos en el subforo de C, pero eso no es recomendable. Leete esto, anda
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

black_flowers


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!

Garfield07

Pues el programa yo lo compilo con gcc (MinGW). Pues deberia de ir... Cambia tu compilador :P
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...


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

black_flowers

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.

Garfield07

Código (asm) [Seleccionar]

.386
.model flat, stdcall
option casemap:none

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


Mmm, y asi?
push dword 0x9999


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

black_flowers

Cita de: Sagrini en  5 Febrero 2011, 00:47 AM
Mmm, y asi?
push dword 0x9999

en masm no me ensambla, me dá error de sintaxis, tengo que ponerlo así 9999h. De todos modos yo lo estoy poniendo en decimal: 9999. Pero aún así el problema es que al ser un número de 32 bits, me rellena con ceros lo que queda. No importa demasiado ya que lo que hago es poner 99999999 y de este modo ya no rellena nada, pero era simplemente para saber cómo podía solventar lo de los ceros en este caso.

Un saludo, y muchas gracias x vuestra ayuda.

black_flowers

#7
mensaje editado.. :silbar: :silbar: :silbar: