GASMで次の構文は何ですか?アセンブラで*%gs:0x10は何をしますか?
*%gs:0x10
私はcall *%gs:0x10
呼び出しが__kernel_vsyscall
ますが、私は*%register:value
か分からないことを知っています。 call DWORD PTR gs:0x10
GASMで次の構文は何ですか?アセンブラで*%gs:0x10は何をしますか?
*%gs:0x10
私はcall *%gs:0x10
呼び出しが__kernel_vsyscall
ますが、私は*%register:value
か分からないことを知っています。 call DWORD PTR gs:0x10
それはgs:0x10
内のポインタのターゲットにnear absolute indirect (FF /2)呼び出します:
それはNASMと同等だが、このようになります。
gs
はセレクタ・レジスタであり、汎用レジスタではありません(Protected mode参照)。
命令はオフセット0x10(セグメントgs
からの相対値)でDWORDを読み取り、その値を呼び出します。
ダイレクトコールには、コールゲートを含む可能性がある別の影響があります。
gs:0x10
ここlibc copies the address of __kernel_vsyscall
during its initialization.
AT&T syntax for the control transfer instructionsあるレジスタまたはメモリのオペランドを使用してアドレッシング
ブランチが '*' を前置しなければならないです。 「遠い」コントロールtranfersを指定するために、「L」は
ljmp
のように、前置されなければならない、lcall
、等たとえば、GAS syntax NASM syntax ========== =========== jmp *100 jmp near [100] call *100 call near [100] jmp *%eax jmp near eax jmp *%ecx call near ecx jmp *(%eax) jmp near [eax] call *(%ebx) call near [ebx] ljmp *100 jmp far [100] lcall *100 call far [100] ljmp *(%eax) jmp far [eax] lcal *(%ebx) call far [ebx] ret retn lret retf lret $0x100 retf 0x100
セグメントオフセットポインタは、次の形式で指定します:
をjmp $segment, $offset
ありがとう、私はそれが分かっていることを理解しています。 x64システムで '' '__kernel_vsyscall'''を呼び出す方法を知っていますか? x64の '' '' call *%gs:0x10'''に相当するものは何ですか? – user7428910
@ user7428910 x64では簡単ですが、 'syscall'命令を使用してください。より有益なガイドは[こちら](https://filippo.io/linux-syscall-table/) –
ええ、私はそれを知っています。 syscallはx64では普通の方法ですが、__kernel_vsyscall、純粋な好奇心を使用することに興味があります – user7428910
は 'call gs:0x10'、' gs:0x10'はメモリオペランドです。 'gs:0x10'はジャンプするアドレスが格納されているアドレスです。これは絶対アドレスへのメモリ間接呼び出しです。 _GS_は、メモリ参照を行うセグメントセレクタです。 –