【问题标题】:Buffer overflow change return address C - without main缓冲区溢出更改返回地址 C - 没有 main
【发布时间】:2017-06-30 07:11:19
【问题描述】:

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

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:我的代码没有主代码,我尝试了一个带有缓冲区溢出的主代码,但它工作了,但是当我用#include <stdio.h> 插入主代码时,它给了我找不到 stdio 的错误。H。我安装了 g++,但我无法升级/更新我的操作系统,因为我无法更改 gcc 版本。

【问题讨论】:

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


【解决方案1】:

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

Also you CAN debug a kernel module

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2015-08-26
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多