2016-07-01 3 views
1

なぜ次のコードでセグメンテーションフォルトが発生しませんか?セクション.dataから実行するとコードが動作しますが、セクション.textのセグメンテーションフォールト

global _start 
section .data 

_start: 
    mov ecx, 3 
    xor byte[_start+1], 0x02 
    mov eax, 1 
    mov ebx, 2 
    int 80h 

が、私はそれは同じコードが.textセクションで実行したときと同じ場所(コメントでマークされた行)でセグメンテーションフォールトと予想:今すぐ

global _start 
section .text ; changed from data to text 

_start: 
    mov ecx, 3 
    xor byte[_start+1], 0x02 ; ******get segmentation fault here 
    mov eax, 1 
    mov ebx, 2 
    int 80h   

、私はセクション.dataがあることを知っています読み取り/書き込み用で、セクション.textは読み取り専用です。
違法メモリアドレスにアクセスしようとするとどうして問題になるのですか?

この例では、セクション.dataのセグメンテーションフォルトも、セクション.textで取得したのと同じ場所に取得すると予想していました。

+2

Um、 'xor'命令は' _start + 1'のバイトを修正しています。 'text'セクションでは、そのバイトは読み取り専用ですが、' data'セクションでは書き込み可能です。あなた自身の質問に答えるのに十分な情報をすでに知っているようですので、私は混乱しています。 –

答えて

3

[_start+1]は明らかに違法なアドレスではありません。それはmov ecx, 3をコード化する5バイトの一部です。 (六角形の機械コードで逆アセンブリを見るにはobjdump -Mintel -drw a.outを見てください)。

IDKなぜ内容が定義されている.dataのアドレスに書き込む際に問題があると思われるのですか? dbのような擬似命令を使用してデータセクションにバイトをアセンブルするのが一般的ですが、アセンブラは喜んで命令をアセンブルします。または、dbをどこに置いてもバイトに入れます。


あなたは.dataバージョンからを期待クラッシュが_startをせずに実行権限をマッピングされているからであるが、Linuxには、EXECを適用していないため、厳密なデフォルトを持っていません。

_startのバージョンが.dataの場合、そのページを読み込み、書き込み、および実行の権限でマップしたカーネルで実行したため、動作します。


それが読み取り専用にマッピングされているため、コースセグメンテーション違反の.textセクションに書き込もうとしたバージョン。

+0

だから、セクション.dataにseg-faultがない理由を理解しています。しかし、今私は混乱してしまった - なぜセクション.textでsegfaultを取得するのですか?なぜこのセクションの[_start + 1]の最初のバイトにアクセスするのが問題ですか? – Rodrigo

+1

@Rodrigo:(前回のコメントを改訂):あなたの質問によれば、 '.text'は読み取り専用にマップされています。命令が読み込み専用にマップされたページに書き込もうとするとどうなりますか? –

関連する問題