2

カーネル 3.16 を使用しており、LZ4 を使用してメモリ内のデータを圧縮しようとしています。カーネル ソース ツリーを調べたところ、圧縮ソース ファイル /lib/lz4.c が見つかり、次の関数を使用しました。

int lz4_compress(const unsigned char *src, size_t src_len,
            unsigned char *dst, size_t *dst_len, void *wrkmem)

しかし、次のエラーが発生しました。

 31.652635] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: ffffffffc010d13a
[   31.652635] 
[   31.653595] CPU: 0 PID: 1856 Comm: insmod Tainted: P           OE 3.16.0-30-generic #40~14.04.1-Ubuntu
[   31.654408] Hardware name: Parallels Software International Inc. Parallels Virtual Platform/Parallels Virtual Platform, BIOS 11.1.3 (32521) 02/16/2016
[   31.655579]  ffff8800aa33e080 ffff8801483d1c90 ffffffff81762590 ffffffff81a75d20
[   31.656295]  ffff8801483d1d08 ffffffff8175aa62 ffff880000000010 ffff8801483d1d18
[   31.657011]  ffff8801483d1cb8 ffffffffc01230ae ffffffffc010d13a 00000000fb25afb4
[   31.657730] Call Trace:
[   31.657966]  [<ffffffff81762590>] dump_stack+0x45/0x56
[   31.658424]  [<ffffffff8175aa62>] panic+0xc8/0x1fc
[   31.658850]  [<ffffffffc01230ae>] ? lz4_compress+0xae/0x1000 [lz4_compress]
[   31.659463]  [<ffffffffc010d13a>] ? hello_init+0x13a/0x140 [test]
[   31.660008]  [<ffffffffc010d000>] ? 0xffffffffc010cfff
[   31.660468]  [<ffffffff8106db2b>] __stack_chk_fail+0x1b/0x20
[   31.660970]  [<ffffffffc010d13a>] hello_init+0x13a/0x140 [test]
[   31.661626] Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
[   31.662512] ---[ end Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: ffffffffc010d13a
[   31.662512] 

私のソースコード:

#include<linux/module.h>
#include<linux/slab.h>
#include<linux/kernel.h>
#include<linux/lz4.h>

static int hello_init(void){
    unsigned char buf[PAGE_SIZE];
    unsigned char data[PAGE_SIZE];
    int i;
    size_t comp_size;
    unsigned char *dst;
    dst=(unsigned char*)kmalloc(PAGE_SIZE, GFP_KERNEL);
    memset(dst,0,PAGE_SIZE);
    for(i=0;i<PAGE_SIZE;i++)
        data[i]=i;
    lz4_compress(data, PAGE_SIZE, dst, &comp_size, buf);
    return 0;
}

static void hello_exit(void){
    printk("clean up\n");
}

module_init(hello_init);
module_exit(hello_exit);

LZ4 がカーネル モジュールでどのように機能するかについての例をいくつか見つけようとしましたが、何も見つかりませんでした。カーネルモジュールで圧縮を行った経験がある人がいるかどうかはわかりません。

ありがとう!

4

1 に答える 1

1

デフォルトでは、カーネル スタック サイズは 2 ページです。それで、スタックオーバーフローを開始しました。lz4 の使用例が必要な場合は、zram を調べてください。lz4 圧縮バックエンドがあります。スタック カナリアは、バッファ オーバーフロー攻撃から保護するための特別なメカニズムです (興味がある場合)。

于 2016-03-17T05:28:52.670 に答える