Wenn ich den Systemaufruf ändern int $0x80
-syscall
oder sysenter
in den folgenden Code:Segmentation fault, wenn ich int ändern SYSCALL/SYSENTER in der Montage x86 (Linux)
mov $4, %rax
mov $1, %rbx
mov $String1, %rcx
mov $16, %rdx
int $0x80
#where String1 is defined sooner as String1: .asciz "String numero 1\n"
Es gibt mir einen Segmentation Fault. In GDB bekam ich die Nachricht
Programm empfangenes Signal SIGSEGV, Segmentierungsfehler. 0x00000000f7ffdbe9 in ??()
Da ich kein Experte bin überhaupt in der Montage, weiß ich nicht, was geschieht
bearbeiten: Das Programm wird mit der integrierten as
und ld
ohne spezielle param
EDIT2: ich verwende x86_64-System, gemäß der Ausgabe von lshw | grep syscall
es zurückgegeben:
capacidades: x86-64 FPU fpu_exception wp vme de pse tsc msr PAE mce CX8 APIC sep mtrr PGE mca cmov pat PSE36 CLFLUSH dts acpi MMX fxsr sse sse2 ss ht tm pbe syscall nx rdtscp CONSTANT_TSC arch_perfmon PEBS bts rep_good NOPlat xtopology NONSTOP_TSC aperfmperf pni dtes64 ds_cpl VMX est tm2 SSSE3 CX16 überwachen xtpr pdcm PCID sse4_1 sse4_2 popcnt lahf_lm tpr_shadow vnmi Flexpriority ept VPID dtherm ARAT cpufreq
Aber es hat für sysenter
nicht zurückgekehrt ...
Auf den Kommentaren @ Jester sagte, dass diese unterschiedlichen Systemaufrufe implizieren, dass verschiedene Register für die Parameter geladen werden. Welche Register sind das dann? Vielen Dank im Voraus
Sind Sie auf einem 64-Bit-Plattform, die SYSENTER unterstützt? –
Wurde 'sysenter' nicht nur im Vsdo des 32-Bit-Systems verwendet? Es wird immer noch auf 64-Bit verwendet? Beachten Sie auch, dass der Syscall n. 4 auf 64-Bit-System ist nicht * sys_write * aber * sys_newstat * –
Ja, 'SYSTENER' wurde mit dem Pentium II-Prozessor eingeführt, so dass es auf * den meisten * 32-Bit-Systemen verfügbar sein sollte. Das SEP-Flag kann verwendet werden, um nach dem Aufrufen von 'CPUID' darauf zu prüfen. (Obwohl der Pentium Pro Sie anlehnt und SEP setzt, obwohl "SYSTENTER" * nicht * verfügbar ist.) Windows XP hat es als eine "schnelle" Möglichkeit eingeführt, einen Systemanruf zu tätigen, und verwendet es, wenn es verfügbar ist. Ansonsten fällt es auf "int 2Eh" zurück. Unter Linux sind die Dinge zweifellos anders; siehe [hier] (http://reverseengineering.stackexchange.com/a/2894/8378). –