C/C++ Shellcode per Parameter übergeben

Heyho,

ich schreibe gerade ein Mini-Funktion, die die Aufgabe hat Shellcode auszuführen. Der Code soll einfach als Parameter übergeben werden.

Hier ist der Code:
Code:
int main(int argc, char *argv[] ) {
        void (*code)() = (void(*)())argv[1];
        code();
    return 0;
}
Wenn ich das Programm aufrufe:
Code:
programm /x00/x00/x00/x00(Mein Shellcode)
Kommt leider die Meldung, dass das Programm nicht mehr funktioniert. Beim kompilieren kriege ich kein Fehler. Hat vll. jemand eine Idee?

PS: Achja ich hab' nicht den geringsten Schimmer von C/C++. Ich hab' mir den Code nur zusammengereimt.
 
Kommt leider die Meldung, dass das Programm nicht mehr funktioniert. Beim kompilieren kriege ich kein Fehler.
Ich nehme mal an, du meinst damit eine Windows 7 Fehlermeldung? Unter Win7 sollte eigentlich DEP (Data Execution Prevention) dafür verantwortlich sein, die den Shellcode erkennt und die Ausführung unterbindet. Afaik kann man die selektiv deaktivieren, wie genau weiß ich aber nicht mehr.
 
Mmh

Das witzige ist, dass alles glatt geht, wenn ich den Shellcode direkt imProgramm behalte. Vll. klappt es ja, wenn ich den Code von einer Txt einlesen lasse.

Danke schonmal :)
 
Ooh

Ok das klärt einiges! :D
Mmh und wie kann ich die Leerzeichen wieder in Backslashes umwandeln?

Code:
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;

int main() {
    ifstream fin;
    string buffer;
    buffer.clear();
    fin.open("datei.txt"); 
    getline(fin,buffer,'\n');
    
    std::replace(buffer, buffer + ::strlen(buffer), ' ', '\');
    
    void (*code)() = (void(*)())buffer.c_str();
    code();
    
    fin.close();
    return 0;
}
Leider kriege ich beim kompilieren folgenden Fehler:
15:47: error: cannot convert 'std::string' to 'const char*' for argument '1' to 'size_t strlen<const char*>'

Das Problem ist also hier:
Code:
std::replace(buffer, buffer + ::strlen(buffer), ' ', '\');
Soweit ich weiß ist Buffer aber doch schon ein String und müsste eigentlich gar nicht umgewandelt werden.

?
 
strlen ist für alte C-Strings ausgelegt. Du kannst strlen(buffer.c_str()) nutzen. Besser ist es aber das von std::string bereitgestellte buffer.size() zu benutzen. Generell sollte man alte C-Funktionen vermeiden, wenn man C++ Code schreiben will.
 
strlen ist für alte C-Strings ausgelegt. Du kannst strlen(buffer.c_str()) nutzen. Besser ist es aber das von std::string bereitgestellte buffer.size() zu benutzen. Generell sollte man alte C-Funktionen vermeiden, wenn man C++ Code schreiben will.

... und außerdem sollte sich /x00 im Shellcode nicht mit strlen() vereinbaren lassen, da Interpretation als Null-Terminierung.
 
Zurück
Oben