Hexadezimale Zahl als Übergabeparamter für main()



  • Hallo,

    ist es irgendwie möglich meiner Mainfunktion eine hexadezimale Zahl als Paramter zu übergeben? Da ich als Übergabeparamter ja ein char-Array habe kann ich ja nur Zeichen übergeben, welche durch ASCII Kodierung in Hex bzw. Bytecode dargestellt werden, ich möchte aber als Parameter eine Adresse als Hex übergeben und es gibt auch keine passende ASCII Kodierung mit der ich meine Adresse kodieren könnte da ich z.B. 00 in meiner Adresse habe aber dafür keinen gültigen ASCII-Code gibt.

    mfG



  • strtol?



  • Das Problem ist, dass ich nicht in den Sourcecode eingreifen kann sondern muss die Adresse irgendwie über die Shell als Paramter übergeben.

    mfG



  • Dann mußt du schon wissen, in welchem Format dieses Programm die Adresse erwartet. Ansonsten bleibt noch die Frage, was das für eine Adresse sein soll und was das Programm damit machen soll.

    PS: hier hat jemand mit perl-Unterstützung etwas gebaut, um den Speicher seines Programms auseinanderzunehmen.



  • Von wo kommt der hexadezimale Parameter. Aus einem anderen Prozess?



  • Ich hab hier ein Programm bei dem ich zeigen soll, dass es nicht gegen Buffer-Overflows gesichert ist, um das zu erreichen soll ich die Rücksprungadresse auf dem Stack manipulieren. Ich habe aber nur die Möglichkeit als Parameter in der Konsole den Overflow zu erzeugen und dadurch die Adresse zu überschreiben. Ich kenne die Hexadezimale Adresse die als neue Rücksprungadresse eingesetzt werden soll, weiss aber nicht wie ich die übergeben kann.



  • Führende Nullen kannst du bei einem Little Endian System ja einfach da lassen, wo sie sind. Ansonsten wirst du ohne entsprechende Funktionen aus deinem Betriebssystem keine Chance haben.

    Du könntest versuchen dir ein anderes Programm zu schreiben, das deins mit system() aufruft. Aber wenn der Overflow via strcpy() oder so geschrieben werden soll, sieht's schlecht aus was Nullbytes angeht.



  • phraid schrieb:

    Ich hab hier ein Programm bei dem ich zeigen soll, dass es nicht gegen Buffer-Overflows gesichert ist, um das zu erreichen soll ich die Rücksprungadresse auf dem Stack manipulieren. Ich habe aber nur die Möglichkeit als Parameter in der Konsole den Overflow zu erzeugen und dadurch die Adresse zu überschreiben. Ich kenne die Hexadezimale Adresse die als neue Rücksprungadresse eingesetzt werden soll, weiss aber nicht wie ich die übergeben kann.

    Ich verweise nochmal auf den Thread, den ich dort oben verlinkt habe - dort lag zwar der Quelltext vor, aber die Zielstellung des Users war prinzipiell die selbe wie bei dir.
    Aber wenn du "Glück" hast, wirst du am Ende feststellen, daß das getestete Programm für dieses Problem nicht anfällig ist, weil es z.B. strncpy() verwendet oder die argv-Parameter nicht intern kopiert 😉



  • Danke für die Antworten, das Programm benutzt strcpy(buff, argv) , ich soll gezielt mit dem richtigen Parameter den Bufferoverflow erzwingen und damit die Rücksprungadresse überschreiben, damit eine Methode mit einer printf() Anweisung aufgerufen wird. Bei der ganzen Sache handelt es sich um eine Aufgabe bzgl. Security.
    Ich bin soweit, dass ich die Adresse kenne, zu der ich springen möchte und ich weiss auch wie mein Stack aufgebaut ist bzw. wieviele Bytes ich übergeben muss damit der Überlauf mich zu der Rücksprungadresse führt.
    Das ganze würde ich ja per ./prog AAAAAAAAAAAAAAAAAA135631235 aufrufen. '135631235' wäre dann meine Adresse die auf den Stack geschrieben werden soll aber durch die ASCII Kodierung liegen ja dann umkodierte Werte auf dem Stack also eine ungültige Adresse. Im Moment weiss ich auch nicht mehr weiter, ich hab mir den anderen Thread durchgelesen und versucht mit perl -e print "\x83\x12 ..." eine hexadezimale Übergabe zu erzeugen aber durch den Signed Char wird z.B. 0x83 nicht als 0x83 übertragen sondern als 0xffff83 usw... . Falls jemand noch eine Idee hätte wäre ich sehr dankbar.

    mfG



  • phraid schrieb:

    Im Moment weiss ich auch nicht mehr weiter, ich hab mir den anderen Thread durchgelesen und versucht mit perl -e print "\x83\x12 ..." eine hexadezimale Übergabe zu erzeugen aber durch den Signed Char wird z.B. 0x83 nicht als 0x83 übertragen sondern als 0xffff83 usw... .

    Wo siehst du dort ein 0xffff83? Abgesehen davon, daß ich keine 3 Byte großen Ganzzahltypen kenne, passt auch in einen signed char nur 1 Byte - und da ist es letztlich egal, ob das höchstwertige Bit von '\x83' jetzt als Vorzeichen oder als Teil des Wertes betrachtet wird.

    Ansonsten: Was spricht dagegen, das geprüfte Programm durch einen system()-Aufruf aus C heraus zu starten? Da kannst du dir die Programm-Parameter so zusammenbauen, wie du es für richtig hältst.



  • Wenn Du Dein Prog mit: prog AAAA aufrufst, dann kommt als Parameter 0x41414141 an. Wenn Deine Adresse (und das wird sie sicher) anders aussieht, dann musst Du vorher ermitteln, welche ASCII - Zeichen Du an der Eingabeaufforderung - oder als Parameter bei einem Aufruf via system - losschicken musst.



  • Und bei 135631235 komme ich auf 0x8159183. Das gibt dann auf Little Endian Systemen "\x83\x91\x15\x08"
    Davor kommt dann noch der Text für argv. Die Umwandlung und Übergabe von \x83.. macht dann Perl oder C, je nachdem wo du system() aufrufst.
    Von der Kommandozeile geht das schlecht.



  • Ah, danke für eure Hilfe es hat jetzt doch endlich funktioniert!

    mfG


Anmelden zum Antworten