私の友人は、x86 で動作する小さな概念実証アセンブラーを作成しました。x86_64 にも移植することにしましたが、すぐに問題が発生しました。
私は C で小さなプログラムを書き、そのコードをコンパイルして objdump しました。その後、それを Python スクリプトに挿入したため、x86_64 コードは正しいです。
from ctypes import cast, CFUNCTYPE, c_char_p, c_long
buffer = ''.join(map(chr, [ #0000000000000000 <add>:
0x55, # push %rbp
0x48, 0x89, 0xe5, # mov %rsp,%rbp
0x48, 0x89, 0x7d, 0xf8, # mov %rdi,-0x8(%rbp)
0x48, 0x8b, 0x45, 0xf8, # mov -0x8(%rbp),%rax
0x48, 0x83, 0xc0, 0x0a, # add $0xa,%rax
0xc9, # leaveq
0xc3, # retq
]))
fptr = cast(c_char_p(buffer), CFUNCTYPE(c_long, c_long))
print fptr(1234)
では、このスクリプトを実行するたびにセグメンテーション違反が発生し続けるのはなぜですか?
mprotect と実行フラグがないことについてまだ質問があります。バッファ オーバーランなどのほとんどの基本的なセキュリティ エクスプロイトから保護すると言われています。しかし、それが使用されている本当の理由は何ですか? .text に到達するまで書き続けてから、素敵な PROT_EXEC エリアに命令を挿入することができます。もちろん、.text で書き込み保護を使用しない限り
しかし、なぜその PROT_EXEC がいたるところにあるのでしょうか。.text セクションが書き込み保護されていると、非常に役立ちませんか?