Parametrübergabe, Stack Overflow erzeugen



  • Hallo alle zusammen!

    Zugegebenermaßen bin ich etwas unzufreiden mit der Themenüberschrift, da die wohl zu kurz ist um das eigentliche Problem zu erläutern.
    Auch, wenn ich befürchte jetzt nicht alle nötigen Informationen zu liefern, fange ich einfach mal an.
    Ich höre eine VL System und Netzwerksicherheit. Ich arbeite in diesem Zuge das erste Mal wirklich mit C.

    Eine aktuelle Aufgabe ist folgende:

    Schreiben Sie ein C-Programm, welches eine Zeichenkette s erzeugt. Der Aufruf von
    ./sof-exploit-1-target s
    soll eine Shell öffnen. Benutzen Sie code/sof-exploit-1-exploit.c als Vorlage für Ihren Exploit.

    Das Zielprogramm ist folgendes:

    #include <stdio.h>
    #include <string.h>
    void foo (char *str) {
      int i;
      char str1[256];
      char str2[512];
      strcpy(str2,str);
      for (i = 0; i < 256; i++)
        str1[i] = str2[2*i];
      str1[255] = '\0';
      printf("%s\n", str1);
    }
    main(int argc, char *argv[]) {
      if (argc > 1) foo(argv[1]);
    }
    

    und wir sollen dieses als Grundlage für unseren exploit nutzen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include "shellcode.h"
    
    #define TARGET "./sof-exploit-1-target"
    #define SIZE 16 // modify this to change size of input
    
    int main(void)
    {
      char *args[3];
      char *env[1];
    
      char input[SIZE];
    
      /* write your code here */
    
      args[0] = TARGET; args[1] = input; args[2] = NULL;
      env[0] = NULL;
    
      if (0 > execve(TARGET, args, env))
        fprintf(stderr, "execve failed.\n");
    
      return 0;
    }
    

    Ich habe leider keinen wirklichen Plan, wie ich da anfangen soll. Ok der overflow soll wohl am Ende im Zielprogramm durch strcpy(str2,str); entstehen. Aber ich bin noch meilenweit entfernt darüber konkret nachzudenken. Ich verstehe z.B. diese Parameterübergabe in der main des Zielprogramms nicht.
    Habe dazu z.B. das hier gefunden: http://www2.informatik.uni-halle.de/lehre/c/c22.html was mir aber nicht wirklcih weiterhilft. Da steht argc gibt die aktuelle Anzhal der Aufrufparameter an, wo ich schon nciht weiß, was damit gemeint ist, denn ich würde da mal spontan sagen, dass die ANzahl der Aufrufparameter 2 ist, sprich argc und argv -.-
    Ähnlich schleierhaft sind mir die Zeilen 12, 13, 15, 19, 20 des exploit-templates.

    Mir ist bewusst, dass das eine ziemlcih umfassende Fragestellung ist und ich sie nicht besonders formulieren konnte, aber ich hoffe dennoch, dass jemand heir in der Lage ist mich da wissenstechnisch etwas weiter zu bringen.

    vG Wolf



  • Wolfone schrieb:

    Hallo alle zusammen!

    Zugegebenermaßen bin ich etwas unzufreiden mit der Themenüberschrift, da die wohl zu kurz ist um das eigentliche Problem zu erläutern.
    Auch, wenn ich befürchte jetzt nicht alle nötigen Informationen zu liefern, fange ich einfach mal an.
    Ich höre eine VL System und Netzwerksicherheit. Ich arbeite in diesem Zuge das erste Mal wirklich mit C.

    Eine aktuelle Aufgabe ist folgende:

    Schreiben Sie ein C-Programm, welches eine Zeichenkette s erzeugt. Der Aufruf von
    ./sof-exploit-1-target s
    soll eine Shell öffnen. Benutzen Sie code/sof-exploit-1-exploit.c als Vorlage für Ihren Exploit.

    Das Zielprogramm ist folgendes:

    #include <stdio.h>
    #include <string.h>
    void foo (char *str) {
      int i;
      char str1[256];
      char str2[512];
      strcpy(str2,str);
      for (i = 0; i < 256; i++)
        str1[i] = str2[2*i];
      str1[255] = '\0';
      printf("%s\n", str1);
    }
    main(int argc, char *argv[]) {
      if (argc > 1) foo(argv[1]);
    }
    

    und wir sollen dieses als Grundlage für unseren exploit nutzen:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include "shellcode.h"
    
    #define TARGET "./sof-exploit-1-target"
    #define SIZE 16 // modify this to change size of input
    
    int main(void)
    {
      char *args[3];
      char *env[1];
    
      char input[SIZE];
    
      /* write your code here */
    
      args[0] = TARGET; args[1] = input; args[2] = NULL;
      env[0] = NULL;
    
      if (0 > execve(TARGET, args, env))
        fprintf(stderr, "execve failed.\n");
    
      return 0;
    }
    

    Ich habe leider keinen wirklichen Plan, wie ich da anfangen soll. Ok der overflow soll wohl am Ende im Zielprogramm durch strcpy(str2,str); entstehen.

    Ja.

    Wolfone schrieb:

    Aber ich bin noch meilenweit entfernt darüber konkret nachzudenken. Ich verstehe z.B. diese Parameterübergabe in der main des Zielprogramms nicht. [...]

    Wenn du ein Programm in z.B. der Konsole aufrufst kannst du ja Parameter übergeben: ./programm parameter1 parameter2
    Hier wäre:
    argc==3
    und argv[0] ist ein Zeiger auf den ersten char von "programm"
    argv[1] ist ein Zeiger auf den ersten char von "parameter1"
    argv[2] ist ein Zeiger auf den ersten char von "parameter2"

    Der Programmname ist also auch ein Parameter.

    Zu dem Exploit-template: Das soll das andere Programm ausführen.

    Zeile 12: Array von char pointern, die dann beim opferprogramm argv werden (mehr oder weniger)

    Zeile 13: Wahrscheinlich für dich nicht so wichtig

    Zeile 15: Vorbereitung des char-arrays, auf das argv[1] des opferprogramms zeigen wird

    Zeile 19+20: Zusammenbauen der Aufrufparameter für den Funktionsaufruf execve - was dann auch teilweise die aufrufparameter des opferprogramms sind.

    PS: strcpy(str2,str); <- da ist ein Tippfehler drinnen - muss str1 heißen.



  • Die Aufrufparameter vom Programm sind die Angaben nach dem Programmnamen.
    In deinem Beispiel ./sof-exploit-1-target s ist ./sof-exploit-1-target der Programmname (mit Pfad) und s das erste Argument.

    Über argc kannst du feststellen wieviel Parameter übergeben wurden.
    Diese stehen dann in argv als C-Strings.
    In argv[0] steht der Programmname (so wie angegeben).
    In argv[1] steht dann das erste Argument. Hier s


Anmelden zum Antworten