2016-04-10 19 views
0

コール命令のアドレスを無効にしようとすると、Program received signal SIGSEGVエラーが発生します。
eax に呼び出し引数(アドレス0x8048579)のアドレスを格納し、edx(0xb7fb773a)に新しい値を格納します。 私の理解の指示に従ってmov %edx,(%eax)はそうするべきですが、失敗します。
私は間違っていますか?
これには、本当のシステムはコードセクションへの書き込み時に受信信号SIGSEGVをプログラムします。

コード:-)傷つけるされていない、私の大学の作業の一部です:

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]> 

レジスタ:

eax   0x8048579 134514041 
edx   0xb7fb773a -1208256710 

失敗:

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

//アップデート1:CPU情報:

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 

答えて

5

命令mov %edx,(%eax)は確かにEAXが指すメモリアドレスにEDXレジスタの値を保存します。

Linux上で実行可能なELFのコードセクション(.text)が書き込み不可能なため、このコードは失敗します。したがって、このセクションに書き込むと、OSからSIGSEGV信号が出力されます。 How can I make GCC compile the .text section as writable in an ELF binary?

+0

はそれをチェックする方法はあります:あなたはこの質問に対する答えに興味がある可能性があり

? – Tigran

関連する問題