缓冲区溢出更改返回地址C - 没有主

时间:2017-06-30 07:11:20

标签: c gcc embedded-linux buffer-overflow shellcode

如何使用缓冲区溢出将eip寄存器指向内存地址以执行以下程序中的shellcode?

static int __init onload(void) 
{
    void function1(char *arg1)
    {
        char buffer[10];
        strcpy(buffer, arg1);
    }

    char *kernel_version = kmalloc(MAX_VERSION_LEN, GFP_KERNEL);
    printk(KERN_WARNING "Hello world!\n");
    // printk(KERN_EMERG "Version: %s\n",     acquire_kernel_version(kernel_version));

    find_sys_call_table(acquire_kernel_version(kernel_version));

    printk(KERN_EMERG "Syscall table address: %p\n", syscall_table);
    printk(KERN_EMERG "sizeof(unsigned long *): %zx\n", sizeof(unsigned long*));
    printk(KERN_EMERG "sizeof(sys_call_table) : %zx\n", sizeof(syscall_table));

    if (syscall_table != NULL) {
        //function1("AAAAAAAAAAAAAAAAAAAAAAAAAAAB7F41B63");

        original_write = (void *)syscall_table[__NR_write];
        syscall_table[__NR_write] = &new_write;
        write_cr0 (read_cr0 () | 0x10000);
.
.
so on...
}

这是代码(https://gitlab.tnichols.org/tyler/syscall_table_hooks/blob/master/src/hooks.c)的链接以上我已经显示了我需要创建缓冲区溢出并指向我的返回地址的位置。

我尝试上面的代码用26 A来溢出缓冲区,然后将我的返回地址指向" 0xB7F41B63",但它不会替换我的返回地址。另外我的代码无法在gdb中调试,所以有人建议调试器一步一步地分析代码吗?

PS:我的代码没有主要的,我尝试了一个不同的代码,主要有缓冲区溢出并且它工作,但是当我插入main #include <stdio.h>时,它给了我错误,它可以&找到stdio.h。我安装了g ++,但我无法升级/更新我的操作系统,因为我无法更改gcc版本。

1 个答案:

答案 0 :(得分:0)

您无法在此替换返回地址。 kmalloc不直接在堆栈上分配空间,因此您无法覆盖返回地址。这里有一篇文章展示了如何利用类似的情况: Phrack

Also you CAN debug a kernel module