4

皆さん、

シンボルを変更してカーネル モジュールをハッキングしようとしています。基本的な考え方は、symtab 内のアドレスを上書きすることにより、元の関数を新しい関数に置き換えることです。ただし、関数を静的として宣言すると、ハッキングが失敗することがわかりました。しかし、それは非静的関数で動作します。私のコード例は次のとおりです。

ファイル名: orig.c

int fun(void) {
    printk(KERN_ALERT "calling fun!\n");
    return 0;
}
int evil(void) {
    printk(KERN_ALERT "===== EVIL ====\n");
    return 0;
}
static int init(void) {
    printk(KERN_ALERT "Init Original!");
    fun();
    return 0;
}
void clean(void) {
    printk(KERN_ALERT "Exit Original!");
    return;
}
module_init(init);
module_exit(clean);

次に、styx の記事に従って、symtab の元の関数「fun」を置き換えて関数「evil」を呼び出します ( http://www.phrack.org/issues.html?issue=68&id=11 )。

>objdump -t orig.ko
...
000000000000001b g     F .text  000000000000001b evil
0000000000000056 g     F .text  0000000000000019 cleanup_module
0000000000000036 g     F .text  0000000000000020 init_module
0000000000000000 g     F .text  000000000000001b fun
...

elfchger を実行することによって

>./elfchger -s fun -v 1b orig.ko
[+] Opening orig.ko file...
[+] Reading Elf header...
    >> Done!
[+] Finding ".symtab" section...
    >> Found at 0xc630
[+] Finding ".strtab" section...
    >> Found at 0xc670
[+] Getting symbol' infos:
>> Symbol found at 0x159f8
>> Index in symbol table: 0x1d
[+] Replacing 0x00000000 with 0x0000001b... done!

Fun のシンボル テーブルを Evil に等しくなるように変更し、モジュールを挿入して効果を確認できます。

000000000000001b g     F .text  000000000000001b evil
...
000000000000001b g     F .text  000000000000001b fun
> insmod ./orig.ko
> dmesg
[ 7687.797211] Init Original!
[ 7687.797215] ===== EVIL ====

これはうまくいきますが。fun の宣言を「static int fun(void)」に変更し、上記と同じ手順に従うと、悪が呼び出されないことがわかりました。誰か私に提案をしてもらえますか?

ありがとう、ウィリアム

4

1 に答える 1

4

短いバージョン: 関数を「静的」として宣言すると、関数がローカルになり、シンボルがエクスポートされなくなります。したがって、呼び出しは静的にリンクされ、動的リンカーは読み込み時に呼び出しに影響を与えません。


ロングバージョン

シンボルを「静的」として宣言すると、コンパイラはシンボルをエクスポートできなくなり、グローバルではなくローカルになります。これを確認するには、objdump の出力で (欠落している) 'g' を探すか、'nm' の出力で小文字の 't' ('T' ではなく) を探します。コンパイラはローカル関数をインライン化することもできます。その場合、シンボル テーブルにはローカル関数がまったく含まれません。

ローカル シンボルは、それらが定義されている翻訳単位に対してのみ一意である必要があります。モジュールが複数の翻訳単位で構成されている場合、それぞれに static fun() を含めることができます。完成した .ko の nm または objdump には、fun と呼ばれる複数のローカル シンボルが含まれる場合があります。

これは、ローカルシンボルがそれぞれの翻訳単位でのみ有効であり、この単位内からのみ参照 (この場合は呼び出し) できることも意味します。それ以外の場合、リンカーは今、あなたが意味するものではありません。したがって、 static fun() への呼び出しは、モジュールがロードされる前のコンパイル時にすでにリンクされています。

読み込み時に、ダイナミック リンカはローカル シンボル fun またはそれへの参照 (特に呼び出し) を改ざんしません。

  1. そのローカルリンクはすでに行われています
  2. 全体に「fun」という名前のシンボルがさらに存在する可能性があり、動的リンカーはどれを意味するかを判断できません
于 2013-06-12T19:04:00.113 に答える