#1 14. Dezember 2009 Null-Byte Setzen Code: global _main section .text _main: xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx jmp short function function2: pop eax ;mov [eax+0Ah], dl ; <---------- XXXXX mov ebx, 0x7c801d7b push eax call ebx mov ecx, eax xor eax,eax jmp short function3 function4: pop eax ;mov byte [eax+12], dl ; <---------- XXXXX mov ebx, 0x7c80ae40 push eax push ecx call ebx push byte 1 push byte 1 call eax mov ebx, 0x7c81cb12 push byte 1 call ebx function: call function2 db 'user32.dllN' jmp short function2 function3: call function4 db 'SetCursorPosN' An den stellen die ich mit XXXXX bleibt mein Programm immer hängen ... kA waurm normaler weiße müsste er doch ganz normal setzten bzw Null Terminiern + Multi-Zitat Zitieren
#2 14. Dezember 2009 AW: Null-Byte Setzen hab zwar die AT&T syntax gelernt aber... Code: ;mov byte [eax+12], dl ; eax = 32 bit aber du kopierst byte... quasi 8 bit und beim ersten sagst du nicht mal was für eine größe du kopieren willst außerdem: was ist dl? wie gesagt.. komme aus ner anderen syntax und hab assembler grad mal fast 1 semester + Multi-Zitat Zitieren
#3 14. Dezember 2009 AW: Null-Byte Setzen Was genau hast du vor? Bei mir ists auch schonwieder laenger her. Also DL ist das lower byte vom DX Register. Du willst den Inhalt von DL ab der 18. Position ins EAX Register kopieren. Ich glaub aber du musst die [] weglassen. Die Klammern sagen eignetlich dass du den Inhalt willst. Du nimmst also Den Inhalt ab der 13. Position als Adresse. + Multi-Zitat Zitieren
#4 14. Dezember 2009 AW: Null-Byte Setzen Der sinn dabei ist das ich ein Shellcode brauche aber imoment, echt nit fit bin in ASM ^^ Der sinn durch das Code: pop eax ; hol ich ja die adresse vom String -- db 'SetCursorPosN' -- ; Weil bei einem Shellcode keine NullBytes vorkommen dürfen muss ich alles ohne machen ; deshalb überschreib ich jetzt mov byte [eax+12], dl ;die 12 stelle im Speicher(Adresse liegt ja in eax) ; Sprich aus SetCursorPosN soll SetCursor(Hier kommen die 0x00) werden + Multi-Zitat Zitieren
#5 15. Dezember 2009 AW: Null-Byte Setzen also ich verstehe ebensowenig wie meine vorgänger... was genau hast du vor? was hier allerdings schon komisch aussieht (ohne zu wissen welchen asm du programmierst): du versucht mittels "mov" - Befehl etwas in den Speicher zu schreiben... das klappt wahrscheinlich nicht... der "mov" - Befehl ist normalerweise nur für verschiebung von Werten in den Registern der ALU. du müsstest mal nach nem 'store' - Befehl schauen... also z.B. statt "mov byte [eax+12], dl" eher "str byte [eax+12], dl" + Multi-Zitat Zitieren
#6 15. Dezember 2009 AW: Null-Byte Setzen Hab dein Programm mal Compiliert und mim Debuger drüber geschaut: Zugriffsverletzung beim Schrieben, du hast wahrscheinlich keine Schreibrechte in der Section .text. Warum fügst du nicht direkt im Code ein Terminierungszeichen ein: Code: db 'user32.dll', 0 Falls du dennoch manuel ein NullByte einfügen willst musst du wohl ne Section wählen in der du Schreibrechte hast z.B .data. Mfg Rushh0ur + Multi-Zitat Zitieren
#7 15. Dezember 2009 AW: Null-Byte Setzen Der Code ist vom Aussehen her richtig, aber du schreibst wohl in einen schreibgeschützten Bereich. ---------------------------------------------------------------- Fail. mov ist 100% richtig. [] zeigt eine Speicheradresse an. [eax+18] <- Adresse in eax plus 18. Beispiel: eax = 55 -> [eax+10] = [65] + Multi-Zitat Zitieren
#8 15. Dezember 2009 AW: Null-Byte Setzen Das könnte allerdings sein, hab ich bis jetzt nicht bedachnt ach übringens ich code mit nasm. Aber warum sollte der Bereich geschützt sein ? Ich hab ja den String voher auch an die Stelle geschrieben ? + Multi-Zitat Zitieren
#9 15. Dezember 2009 AW: Null-Byte Setzen Auf was zeigt denn eax? Das wird im Code nicht ersichtlich... also was pop't der vom Stack? Und was für Adressen rufst du da auf?! Hardcoding von Funktionsadressen ist nicht die feine Art... + Multi-Zitat Zitieren
#10 15. Dezember 2009 AW: Null-Byte Setzen Der will nen Shellcode erstellen und wahrscheinlich in einem Bufferoverflow verwenden, deswegen sind die Addressen Hardcoded und er darf keine Nulltermienierungszeichen haben um den Code richtig zu laden. Hab mir auch zuerst gedacht was da am Anfang gepoppt wird, die Antwort ist, dass er die Funktionen mit call Aufruft und hinter diesen einen String definiert, sodass beim Auruf mittels call im Stack dann die Addresse des Strings enthalten ist, diese entnimmt er dann wieder und will am "Ende" des Strings ne Nullterminierung schreiben, was zur Zugriffsverletzung führt, da er keine Schreibrechte in dieser Memorymap hat. @Topic: Unter anderen umständen wie zum Beispiel beim Bufferoverflow sollte der Code richtig funktionieren, da dieser nur Auftretten kann wenn man auch Schreibrechte hat. Mfg Rushh0ur + Multi-Zitat Zitieren