Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5760625
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: LINUX

2009-02-16 13:54:46

这是以前做rootkit讲座的时候,写的一个demo。最近,一个师弟要用simple rootkit的架构来做一个应用,发现在加载模块的时候出现了:
BUG: unable to handle kernel paging request at xxxxxx
的问题,看oops,问题出在:
    sys_call_table[__NR_kill] = (void *)hacked_kill;

后来,师弟提醒我,说搜到了一篇文章,说设置cr0就可以了。

偶也看了一下这个问题:
原来在代码中entry.s中:
.section .rodata,"a"
#include "syscall_table_32.S"

设置了sys_call_table为只读的,应该是最近几个版本的内核引入的,之前的测试都没有出问题。

解决方法:
1、修改内核代码,将rodata修改为data属性
2、修改cr0来实现修改页WP属性
3、直接调用change_page_attr来修改属性

参考资料1里面是调用change_page_attr的方法:
#include
#ifdef KERN_2_6_24
#include
int set_page_rw(long unsigned int _addr)
{
struct page *pg;
pgprot_t prot;
pg = virt_to_page(_addr);
prot.pgprot = VM_READ | VM_WRITE;
return change_page_attr(pg, 1, prot);
}

int set_page_ro(long unsigned int _addr)
{
struct page *pg;
pgprot_t prot;
pg = virt_to_page(_addr);
prot.pgprot = VM_READ;
return change_page_attr(pg, 1, prot);
}

#else
#include
int set_page_rw(long unsigned int _addr)
{
return set_memory_rw(_addr, 1);
}

int set_page_ro(long unsigned int _addr)
{
return set_memory_ro(_addr, 1);
}

#endif // KERN_2_6_24

参考资料2里面是修改cr0的方法:
/**
* clear WP bit of CR0, and return the original value
*/
unsigned int clear_and_return_cr0(void)
{
    unsigned int cr0 = 0;
    unsigned int ret;

    asm volatile ("movl %%cr0, %%eax"
              : "=a"(cr0)
              );
    ret = cr0;

    /* clear the 20 bit of CR0, a.k.a WP bit */
    cr0 &= 0xfffeffff;

    asm volatile ("movl %%eax, %%cr0"
              :
              : "a"(cr0)
              );
    return ret;
}

/** set CR0 with new value
*
* @val : new value to set in cr0
*/
void setback_cr0(unsigned int val)
{
    asm volatile ("movl %%eax, %%cr0"
              :
              : "a"(val)
              );
}

参考资料3里面是修改内核代码的方法:
---.section .rodata,"a"
+++.section .data,"a"
#include "syscall_table_32.S"


参考:



阅读(3712) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~