2013-01-19 21 views
10

この命令が実行される直前にfsには0x0が含まれます。「mov rax、QWORD PTR fs:0x28」アセンブリ命令は何をしますか?

また、私はGDBのこのメモリ領域からどのように読み込むことができるのか知りたいと思います。

+5

http://stackoverflow.com/questions/10325713/why-does-this-memory-address-have-a-random-value – Abhineet

+0

参照http://stackoverflow.com/questions/10325713/why-does-最初の部分のこのメモリのアドレスを持つランダム値 –

+0

ありがとう、同様の手順から、私はそれが[fs + 0x28]からraxに読み込まれるように見えています。 fsは0x0なのでこれは単純に0x28に変換されるはずですが、GDBの0x28から読み込もうとすると、これは許可されませんが、プログラム自体がこの命令を実行できます。したがって、おそらくこの命令が何をするのかを正しく理解していないでしょうか? – ioctlvoid

答えて

8

LinuxおよびWindowsのような最近のOSのレジスタfsgsは、スレッド固有のOSやその他のOS定義の構造を指しています。セグメントレジスタを変更するのは保護された命令なので、OSだけがこれを設定することができます。

この質問は、正確に何を指しているかを説明するのに役立ちます:amd64 fs/gs registers in linux

fsレジスタの実際の値はアドレスではありません。 セレクタ - GDTへのオフセットで、セグメントが使用できる/使用できないことを示します。隠されたfsベースレジスタとリミットレジスタの値が何であるかはわかりません。これらはfsに新しい "セレクタ"を書き込むことによって更新される内部CPUレジスタです(ベース/リミットレジスタはGDTから更新されます)。

+0

ありがとう、しかし、私はこのメモリをGDB内からどうやって読むことができますか? – ioctlvoid

+0

FSGSBASE機能を搭載したCPUでは、64ビットコードで['rdfsbase'](https://hjlebbink.github.io/x86doc/html/RDFSBASE_RDGSBASE.html)と' wrfsbase'を使用できます。彼らは特権がない。 (その拡張子がどれほど古いか分かりません) –

+0

また、セグメント・レジスタ自体を変更することは特権ではありません。 FSGSBASEがなければ、カーネルはLDT内のそのセグメント記述のベースアドレスを更新する必要があるため、カーネルの助けが必要です。もちろん、ユーザスペースからアクセスすることはできません。あなたが望むベースアドレスを持つ2番目のセグメント記述があったなら、私は*ユーザ空間で 'mov fs、eax'を使用し、カーネルを起動せずに複数のFSベース間を行き来できると思っています。 –

関連する問題