亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2708 | 回復(fù): 6
打印 上一主題 下一主題

[內(nèi)核模塊] 探索Linux內(nèi)核NULL指針引發(fā)的BUG遇到的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-11-24 11:13 |只看該作者 |倒序瀏覽
    看到Godbach大神在博客上的《 Linux內(nèi)核NULL指針引發(fā)的BUG》文章,由于剛學(xué)了一點內(nèi)核皮毛,便想嘗試一下,結(jié)果出了一點問題,希望能夠得到大家的幫助。下面是我的嘗試與出現(xiàn)的問題:

1、先編寫一個簡單的字符設(shè)備驅(qū)動chr_dev.c,如下所示
static struct cdev chr_dev;
static dev_t ndev;

static int chr_open(struct inode *nd, struct file *filp)
{
    int major = MAJOR(nd->i_rdev);
    int minor = MINOR(nd->i_rdev);

    printk("chr_open, major=%d, minor=%d\n", major, minor);

    return 0;
}

static ssize_t chr_read(struct file *f, char __user *u, size_t sz, loff_t *off)
{
    printk("kernel NULL pointer:%x", *(unsigned char *)0);
    printk("kernel NULL pointer:%x", *(unsigned char *)1);
    printk("kernel NULL pointer:%x", *(unsigned long *)2);   

    void (*p)();              
    p = NULL;
    (*p)();                       //在這里解引用空指針

    return 0;
}

struct file_operations chr_ops=
{
    .owner = THIS_MODULE,
    .open = chr_open,
    .read = chr_read,
};

static int demo_init(void)
{
    int ret;

    cdev_init(&chr_dev, &chr_ops);
    ret = alloc_chrdev_region(&ndev, 0, 1, "chr_dev");
    if(ret < 0)
        return ret;

    printk("demo_init():major=%d, minor=%d\n", MAJOR(ndev), MINOR(ndev));

    ret = cdev_add(&chr_dev, ndev, 1);
    if(ret < 0)
        return ret;
  
    return 0;
}

static void demo_exit(void)
{
    printk("Removing chr_dev module...\n");
    cdev_del(&chr_dev);
    unregister_chrdev_region(ndev, 1);
}

module_init(demo_init);
module_exit(demo_exit);

2、然后仿照寫了一個testhole.c文件,用于映射0地址并指向null_func函數(shù),另外觸發(fā)調(diào)用字符驅(qū)動,如下所示:
#define BUFFSIZE 1024

void null_func(void)
{
    printf("aaaaaaaaaaaaaaaaaaaaaaa\n");
}

void test_chrdev()
{
    int fd;
    int n;
    char buf[BUFFSIZE];

    fd = open("/dev/chr_dev", O_RDONLY);
    if(fd == -1)
    {
         perror("open error");
         exit(-1);
    }

    while((n = read(fd, buf, BUFFSIZE)) < 0)
    {
         perror("read error");
         exit(-1);
    }

    close(fd);
}

void map_and_call_null()
{
    char *addr;
   
    if((personality(MMAP_PAGE_ZERO)) != -1)
    {
        if((addr = mmap(NULL, 0x1000, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE, 0, 0)) == MAP_FAILED)
        {
            perror("mmap");
            return;
        }
    }
    else
    {
        perror("personality error");
        return;
    }
   
    *(unsigned char *)0 = '\x90';
    *(unsigned char *)1 = '\xe9';
    *(unsigned long *)2 = (unsigned long)&null_func - 6;
    printf("%x", *(unsigned long *)2);
   
    //void (*aaa)();
    //aaa = NULL;
    //(*aaa)();

    test_chrdev();
}

int main()
{
    map_and_call_null();

    return 0;
}


3、出現(xiàn)的問題
    運行testhole程序后,驅(qū)動程序并沒有調(diào)用到null_func函數(shù),而是產(chǎn)生了BUG: unable to handle kernel NULL pointer dereference at   (null)問題,我在驅(qū)動程序的chr_read中打印出地址0,1,2中的值,發(fā)現(xiàn)與map_and_call_null函數(shù)中賦予的值是一樣的,為什么會出現(xiàn)這樣的問題呢?我自己的猜想是不是內(nèi)核態(tài)不能直接執(zhí)行用戶態(tài)的函數(shù)?希望大家不吝賜教。。

論壇徽章:
36
IT運維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
2 [報告]
發(fā)表于 2015-11-24 14:25 |只看該作者
回復(fù) 1# 星閃夜空

我當(dāng)時也是根據(jù)已知的 NULL pointer 漏洞做的驗證。 我印象中新的內(nèi)核可能不讓再對低地址段的內(nèi)存 map 之類的操作。


   

論壇徽章:
0
3 [報告]
發(fā)表于 2015-11-24 14:39 |只看該作者
回復(fù) 2# Godbach

    首先感謝Godbach大神的回復(fù),我用的是Ubuntu12.04 內(nèi)核版本是3.2.0的,默認(rèn)情況下,系統(tǒng)是不能將0地址映射的,我是通過echo "0" > /proc/sys/vm/mmap_min_addr使系統(tǒng)能夠?qū)?地址映射。有下面兩個問題請教:
1、你當(dāng)時使用的內(nèi)核版本是多少?
2、我對下面的三行代碼還是搞不懂
     *(char *)0 = '\x90';
    *(char *)1 = '\xe9';
    *(unsigned long *)2 = (unsigned long)&kernel_code - 6;
    我只知道它們是將0地址指向kernel_code函數(shù),但是不清楚為什么要這樣做?我想自己這方面的知識有所欠缺,還望指明,謝謝了!!


   

論壇徽章:
36
IT運維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
4 [報告]
發(fā)表于 2015-11-24 15:00 |只看該作者
回復(fù) 3# 星閃夜空

我當(dāng)時應(yīng)該用的版本是 2.6.18 的內(nèi)核吧。

還有相關(guān)的解釋,應(yīng)該帖子中也是有的。關(guān)于 NULL pointer 的exploit,九賤兄也有好文,你直接本版塊搜一下。


   

論壇徽章:
0
5 [報告]
發(fā)表于 2015-11-24 15:16 |只看該作者
回復(fù) 4# Godbach

    恩恩,找到了,謝謝提醒


   

論壇徽章:
20
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-17 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-16 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-18 06:20:00每日論壇發(fā)貼之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16賽季CBA聯(lián)賽之江蘇
日期:2017-06-26 11:05:5615-16賽季CBA聯(lián)賽之上海
日期:2017-07-21 18:12:5015-16賽季CBA聯(lián)賽之青島
日期:2017-09-04 17:32:0515-16賽季CBA聯(lián)賽之吉林
日期:2018-03-26 10:02:16程序設(shè)計版塊每日發(fā)帖之星
日期:2016-07-15 06:20:0015-16賽季CBA聯(lián)賽之江蘇
日期:2016-07-07 18:37:512015亞冠之薩濟(jì)拖拉機(jī)
日期:2015-08-17 12:21:08
6 [報告]
發(fā)表于 2015-11-25 14:56 |只看該作者
本帖最后由 nswcfd 于 2015-11-25 14:56 編輯

x86下, 0x90是nop,0xe9 xx xx xx xx是jmp

論壇徽章:
0
7 [報告]
發(fā)表于 2015-11-25 19:55 |只看該作者
回復(fù) 6# nswcfd
    感謝nswcfd的解答,我也是看完godbach大神的博客然后才明白的

   
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP