Static 替换内核模块中的静态函数
各位 我试图通过修改内核模块的符号来破解它。其基本思想是通过覆盖symtab中的地址,将原始函数替换为新函数。然而,我发现当声明函数为静态时,黑客攻击失败了。但它与非静态函数一起工作。我的示例代码如下: 文件名:orig.cStatic 替换内核模块中的静态函数,static,kernel,static-methods,static-linking,Static,Kernel,Static Methods,Static Linking,各位 我试图通过修改内核模块的符号来破解它。其基本思想是通过覆盖symtab中的地址,将原始函数替换为新函数。然而,我发现当声明函数为静态时,黑客攻击失败了。但它与非静态函数一起工作。我的示例代码如下: 文件名:orig.c int fun(void) { printk(KERN_ALERT "calling fun!\n"); return 0; } int evil(void) { printk(KERN_ALERT "===== EVIL ====\n");
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”
通过执行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)”并按照上面提到的相同步骤操作时,我发现恶魔没有被调用。谁能给我一些建议吗
谢谢,
William简短版本:将函数声明为“static”会使其成为本地函数,并阻止导出符号。因此,调用是静态链接的,动态链接器在加载时不会以任何方式影响调用
长版本 将符号声明为“静态”可防止编译器导出符号,使其成为本地符号而不是全局符号。您可以通过在objdump输出中查找(缺少的)“g”,或者在“nm”输出中查找小写的“t”(而不是“t”)来验证这一点。编译器还可以内联本地函数,在这种情况下,符号表根本不包含它 局部符号必须仅对定义它们的翻译单元是唯一的。如果您的模块由多个翻译单元组成,那么每个单元中都可以有一个static fun()。finished.ko的nm或objdump可能包含多个称为fun的本地符号 这也意味着本地符号仅在其各自的翻译单元中有效,并且只能从该单元内部引用(在您的情况下:调用)。否则,链接器现在就不会了,你指的是哪一个。因此,在加载模块之前,对static fun()的调用已在编译时链接 加载时,动态链接器不会篡改本地符号或对其的引用(特别是:调用),因为:
谢谢你的解释!这对我帮助很大!
000000000000001b g F .text 000000000000001b evil
...
000000000000001b g F .text 000000000000001b fun
> insmod ./orig.ko
> dmesg
[ 7687.797211] Init Original!
[ 7687.797215] ===== EVIL ====