2017-02-03 3 views
0

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

+3

Sind Sie auf einem 64-Bit-Plattform, die SYSENTER unterstützt? –

+0

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 * –

+0

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). –

Antwort

0

Das Problem wurde dank der Kommentare gelöst.

Zunächst einmal unterstützt meine Architektur nicht syner. Und die syscall machen musste ich den Code mit ersetzen:

mov $1, %rax 
mov $1, %rdi 
mov $String1, %rsi 
mov $16, %rdx 
syscall 

und es funktionierte gut