1

仮想環境(debian x86)で実行されているelfファイルのエントリポイントを見つける必要があります。ホストマシンでは、現在の命令ポインタと他のすべてのCPUレジスタを判別できます。したがって、カーネル関数呼び出しを決定することが可能です。

関数load_elf_binaryは、次のパラメーターを使用して関数start_threadを呼び出します。

start_thread(regs、elf_entry、bprm-> p);

したがって、CPUレジスタからelf_entryを受信できるはずですが、レジスタをダンプすると、次の出力が得られます。

EAX=0xc61bffb4
EBX=0xc61bffb4
ECX=0xbff29430
EDX=0xb78ae850
ESI=0xc78f9500
EDI=0xbff29fec
EBP=0xbff29488
ESP=0xc61bfeb4
EIP=0xc1001f82
CR2=0xb78ca840

0x8xxxxxxxで始まる値を持つレジスタがないため、間違えたのか、elf_entryが探しているエントリポイントではないのかわかりません。

本質的な質問:カーネル関数load_elf_binaryの変数elf_entryは、readelf -hで取得するエントリポイントですか?

4

2 に答える 2

2

elf_entryその関数では、静的バイナリの場合のみELFエントリポイントに対応します。動的バイナリの場合は、動的リンカーのエントリポイント(最終的にバイナリのエントリポイントを呼び出す必要があります)に対応します。http://lxr.free-electrons.comを参照してください。 /source/fs/binfmt_elf.c?v=2.6.32#L888

于 2012-01-09T19:04:04.483 に答える
0

printkを使用して新しいカーネルをコンパイルした後、new_ipは常に0xb78xxxxxxで始まるため、elf_entryとelfファイルのエントリポイントは同じではないことがわかりました。

于 2012-01-09T14:35:55.953 に答える