2016-04-10 9 views
0

Ich treffe Program received signal SIGSEGV Fehler beim Versuch, Adresse der Aufrufanweisung zu überschreiben.
Ich speichere Adresse des Anrufarguments (Adresse 0x8048579) in eax und neuen Wert in edx (0xb7fb773a). Pro mein Verständnis Anweisung mov %edx,(%eax) sollte das tun, aber es schlägt fehl.
Was mache ich falsch?
Dies ist Teil meiner Universität Aufgabe, also kein echtes System schaden :-)Programm empfangen Signal SIGSEGV beim Schreiben in Code-Abschnitt

-Code wird:

0x08048566 <+35>: mov -0x8(%ebp),%edx 
    0x08048569 <+38>: mov -0x4(%ebp),%eax 
=> 0x0804856c <+41>: mov %edx,(%eax) // Fails here. 
    0x0804856e <+43>: movl $0x0,(%esp) 
    0x08048575 <+50>: call 0x8048370 <[email protected]> 

Register:

eax   0x8048579 134514041 
edx   0xb7fb773a -1208256710 

Fehler:

Program received signal SIGSEGV, Segmentation fault. 
0x0804856c in foo (argv=0x58575655) at my_code.c:34 

// Update 1: CPU-Info:

Architecture:   i686 
CPU op-mode(s):  32-bit, 64-bit 
Byte Order:   Little Endian 
CPU(s):    1 
On-line CPU(s) list: 0 
Thread(s) per core: 1 
Core(s) per socket: 1 
Socket(s):    1 
Vendor ID:    GenuineIntel 
CPU family:   6 
Model:     69 
Stepping:    1 
CPU MHz:    2306.609 
BogoMIPS:    4613.21 
L1d cache:    32K 
L1d cache:    32K 
L2d cache:    6144K 

Antwort

5

Instruction mov %edx,(%eax) wird in der Tat von EAX wies EDX Registerwert-Speicheradresse speichern.

Dieser Code schlägt fehl, weil der Codeabschnitt (.text) der ausführbaren ELF-Datei unter Linux nicht beschreibbar ist. Daher verursacht das Schreiben in diesen Abschnitt das SIGSEGV-Signal von OS.

können Sie für diese Frage in Antworten interessieren: How can I make GCC compile the .text section as writable in an ELF binary?

+0

Gibt es eine Möglichkeit, das überprüfen? – Tigran

Verwandte Themen