C + shellcode: warum segfault?
-
nachdem ich bei wikipedia über den SIGILL-artikel gestolpert war, probierte ich das dortige beispiel aus. das funktionierte auch, aber wenn ich nun versuche eine korrekte funktion zu schreiben schmiert das programm immer ab.
hier ersteinmal der code für linux mit gcc und nasm:
#include <stdlib.h> int main() { // der dazugehörige asm-code kommt unten char shellcode[] = "\x31\xc0\xfe\xc0\x31\xdb\xb0\x64\xcd\x80"; char code[10]; strncpy(code, shellcode, 10); void (*function)() = (void (*)()) code; function(); }
BITS 32 xor eax, eax inc al ; eax == 1 d.h. sys_exit xor ebx, ebx mov bl, 100 ; der rückgabewert int 80h ; system interrupt
laut gdb stürzte die erste version beim terminierungszeichen ab, woraufhin ich das strncpy einfügte, allerdings crasht es dann später. kurz gesagt: egal was ich mache, es crasht.
meine frage jetzt : wieso klappt der interrupt aufruf nicht?
-
Bedenke, dass du den üblichen Funktions-Code auch benutzen solltest, wenn der Code für den GCC eine Funktion darstellen soll. Zumindest ein Rücksprung fehlt. (Okay, Rücksprung ist unwichtig in dem Fall :))
Folgender Text sollte dir dabei ein wenig hilfreich sein http://www.nondot.org/sabre/os/files/Booting/CompilingBinaryFilesUsingACompiler.pdf
-
kingruedi schrieb:
Bedenke, dass du den üblichen Funktions-Code auch benutzen solltest, wenn der Code für den GCC eine Funktion darstellen soll. Zumindest ein Rücksprung fehlt. (Okay, Rücksprung ist unwichtig in dem Fall :))
BITS 32 push ebp mov ebp, esp xor eax, eax inc al xor ebx, ebx mov bl, 99 int 80h leave ret
Danke für den Tipp!
-
Ist eine spaßige Sache. Ich habe so mal einen Jitter für einen pseudo Assembler geschrieben, für einen WPC Wettbewerb.