Shellcode: Zugriffsverletzung

Hallo,
ich möchte mich etwas mit Shellcodes beschäftigen, allerdings erhalte ich immer eine Fehlermeldung wenn ich versuche, folgendes Auszuführen.


Also ich habe folgendes Assembler Programm:
Code:
segment code
start:
 	mov dl, 'A'
	mov ah, 02h
	int 21h
	jmp start;
Dies gibt in einer Endlosschleife ein A aus (verwende WinXP). Per nasm-Win32 habe ich das Programm kompiliert. Läuft soweit ohne Probleme.
Dann per disassembler, welcher mitgeliefert wurde, lese ich die Bytes aus:

Code:
[...]
B241              mov dl,0x41
B402              mov ah,0x2
CD21              int 0x21
EBF8              jmp short 0x40

So diese Subroutine würde ich jetzt gerne unter C verwenden und habe folgendes Prog erstellt:
Code:
#include <stdio.h>

//Mein Shellcode
char code[]= "\xB2\x41\xB4\x02\xCD\x21\xEB\xF8";

int main() {
    int (*shell)();
    *(int*)&shell = (int)code;
    shell();
}

Wenn ich das nun per Dev-C++ kompiliere, erhalte ich immer folgende Meldung:

Code:
Unbehandelte Ausnahme bei 0x00402004 in c_prog.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0xffffffff.

00402000  mov         dl,41h 
00402002  mov         ah,2 
00402004  int         21h          ;Hier der Fehler


Muss ich evt. irgendwelche Register im Assembler-Code auf 0, bzw. auf einen bestimmten Wert setzen, damit es funktioniert?
 
Per nasm-Win32 habe ich das Programm kompiliert. Läuft soweit ohne Probleme.
aber wohl in der NTVDM (NT Virtual DOS Machine ) ;)
Denn "int 21" sieht mir stark nach DOSe aus.
Wenn Dein C-Programm aber als win32 Programm läuft und dann versucht INT 21 auszuführen (was es dabei genau unter Windows bewirkt - k.A,), kommt es zu Fehlern.

Da muss schon ein wenig getrickst werden - falls z.B das Zielprogramm solche Ausgaberoutinen enthält, könnten diese genutzt werden (Stichworte wären: Imports, Import Adress Table usw. je nach dem wie tief Du da einsteigen willst).

Was noch nützlich sein könnte: kleinere Shellcodes kann man auch in OllyDbg schreiben. Diese können direkt kopiert und eingefügt werden (Rechtklick, "binary->binary copy").
Falls es Bugs gibt (bzw das Programm, in welches Code injeziert wurde, nicht das macht, was man möchte) kann man seinen Shellcode mit EBFE (Endlosschleife) beginnen. Wenn das Programm mit der Ausführung des Shellcodes beginnt bleibt es hängen (eine Hyperthreading CPU könnte hier von Vorteil sein :P ) und kann in Ruhe mit einem Debugger attached werden wobei der Debugger dann auf dem EBFE stehn bleibt und man dann in Ruhe den ganzen Ablauf verfolgen kann.
 
Zurück
Oben