皆さん、
シンボルを変更してカーネル モジュールをハッキングしようとしています。基本的な考え方は、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)」に変更し、上記と同じ手順に従うと、悪が呼び出されないことがわかりました。誰か私に提案をしてもらえますか?
ありがとう、ウィリアム