Nicht Shellcode ausführen --> (Speicherzugriffsfehler (Speicherabzug geschrieben))
habe ich diese Funktion:
char code[] = "\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x05\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x68\x65\x6c\x6c\x6f";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
(dieser code ist aus: shellcode-tutorial)
also ich kompiliert und ausgeführt, aber erhalte ich nur diese Meldung: Speicherzugriffsfehler (Speicherabzug geschrieben).
Warum ich nicht bekommen Sie etwas zurück, nur diese Fehlermeldung?
p.s.: mein system ist ein ubuntu x86-pc. der shellcode sollte mit ihm zu arbeiten. ich habe es kompiliert mit gcc und gcc-4.5, beide gleiche Fehler...
- Laut Google Übersetzen, dass die Meldung besagt, dass ein Kern abgelagert wurde. Wenn Sie es finden können, können Sie verwenden Sie GDB, um zu sehen, was falsch gelaufen ist. (
gdb yourprogram some.core
) - Sind Sie ein Deutsches system? Es wäre unerwartet, zu bekommen, ein deutscher Fehler sonst, aber vermutlich sollten Sie es verstanden haben... wie auch immer, das scheint zu sein, nicht eine echte Frage.
- Haben Sie die FAQs Lesen #7 und #10 aus der tutorial-Startseite, und machte sicher, dass Sie nicht die Ursache Ihres Problems.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standardmäßig wird gcc kompilieren von Anwendungen als nicht ausführbare stacks. Was Sie sehen, ist ein Speicherzugriffsfehler, weil dein stack ist gekennzeichnet nicht ausführbare, aber Sie versuchen zum ausführen von code auf dem stack. Sie können überprüfen, indem Sie Ihre Anwendung in gdb und prüfen, wo es stirbt, zum Beispiel:
=> 0x601060 : jmp 0x60107b
Dies ist der Ausgangspunkt für Ihren shellcode. Zu machen, so dass es nicht segfault, können Sie Sie deaktivieren exectstack, indem Sie Folgendes tun:
gcc -z execstack-Quelle.c
Ihre
code
variable ist ein array, das ist ein Teil Ihres Programms initialisierte Daten (.data
) segment. Wenn Ihr Programm geladen wird, indem der OS, der loader liest und führt die load-Befehle von Ihrem ausführbaren Datei. Einer dieser Befehle lautet "laden Sie die folgenden Daten (ein segment namens.data
) in den Speicher".Normalerweise
.data
segment geladen wird, als nicht-ausführbare segment, was bedeutet, dass der Speicher dort nicht ausgeführt werden kann. Deshalb, wenn Sie versuchen, um code auszuführen, von dort nach springen, wie Sie es Tat, dann wird es Abstürzen mit "segmentation fault".Gibt es ein paar Möglichkeiten, dies zu umgehen. Man kann sagen, das der linker machen, der
.data
segment ausführbare Datei (keine gute Idee). Man kann sagen, der compiler, diecode
variable in der.text
segment statt (das segment, das für alle von Ihrem Programm den normalen code). Man kann sagen, der compiler und linker, um eine neue ausführbare Datei segment und setzencode
in dass. Alle diese sind sehr heikel.Die beste Lösung ist, die speziell weisen Sie Ihre eigenen ausführbaren Speicher zur Laufzeit, und kopieren Sie den shellcode in das. Völlig vermeidet jede mögliche compiler - /linker-Probleme, obwohl es fügen Sie eine kleine runtime-penalty. Aber manche Betriebssysteme erlauben nicht, dass Speicher, der sowohl beschreibbar und ausführbar zur gleichen Zeit; so würden Sie zuerst machen es beschreibbar, kopieren Sie den shellcode, und dann machen Sie es ausführbar.
Die Art und Weise, die du kontrollierst Speicher Berechtigungen zur Laufzeit ist mit dem
mprotect(2)
- Aufruf. So, hier ist ein guter Weg, es zu tun: