Autor
|
Tema: shellcode básica para windows. (Leído 6,130 veces)
|
black_flowers
Desconectado
Mensajes: 65
|
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.
|
|
« Última modificación: 29 Enero 2011, 15:47 pm por black_flowers »
|
En línea
|
|
|
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
Bueno, el post va en Bugs y Exploits. Luego le digo a un mod que te lo mueva... 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. 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
|
|
|
En línea
|
* 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
Desconectado
Mensajes: 65
|
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. 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). 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!
|
|
|
En línea
|
|
|
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
Pues el programa yo lo compilo con gcc (MinGW). Pues deberia de ir... Cambia tu compilador Y... de donde sacas esos bytes nulos? .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...
|
|
|
En línea
|
* 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
Desconectado
Mensajes: 65
|
Y... de donde sacas esos bytes nulos? .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.
|
|
|
En línea
|
|
|
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
.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
|
|
|
En línea
|
* 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
Desconectado
Mensajes: 65
|
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.
|
|
|
En línea
|
|
|
|
black_flowers
Desconectado
Mensajes: 65
|
|
|
« Última modificación: 6 Febrero 2011, 19:38 pm por black_flowers »
|
En línea
|
|
|
|
|
|