【发布时间】: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 版本。
【问题讨论】:
-
请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
标签: c gcc embedded-linux buffer-overflow shellcode