Chinaunix首页 | 论坛 | 博客
  • 博客访问: 593603
  • 博文数量: 353
  • 博客积分: 1104
  • 博客等级: 少尉
  • 技术积分: 1457
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-23 23:02
个人简介

1、刚工作时做Linux 流控;后来做安全操作系统;再后来做操作系统加固;现在做TCP 加速。唉!没离开过类Unix!!!但是水平有限。。

文章存档

2015年(80)

2013年(4)

2012年(90)

2011年(177)

2010年(1)

2009年(1)

分类:

2011-12-08 11:03:56

原文地址:去除内核代码段只读属性 作者:CUDev

这是以前做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"


参考:



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