linux 如何给应用设计堆栈缓冲区,监控缓冲区,当缓冲区数据被改写时 认为发生了设计堆栈溢出,(实际对linux 来讲正常)

为了给应用程序设计堆栈缓冲区并监控它,可以使用以下步骤:

  1. 为应用程序分配一个新的信号处理函数,以响应堆栈溢出事件。
  2. 将 stack_protect 变量设置为 true,这将启用 GCC 编译器的堆栈保护功能。
  3. 在编译和链接时,使用 -fstack-protector-all 选项启用堆栈保护。此选项会在所有函数中插入堆栈检查代码。
  4. 使用 mmap() 系统调用为应用程序分配一段内存,并将其设置为不可写。
  5. 将这段内存映射到应用程序的堆栈上方。
  6. 设置信号处理函数,当发生堆栈溢出时触发。
  7. 监控内存映射区域是否被改动,如果被改动则认为发生了堆栈溢出。

相关实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <sys/mman.h>

#define STACK_SIZE 1024*1024 // 堆栈大小

void handle_stack_overflow(int sig) {
    printf("Stack overflow detected!\n");
    exit(1);
}

int main(int argc, char** argv) {
    void *stack_top;
    char *stack_guard;

    // 分配内存作为堆栈保护区域
    stack_guard = mmap(NULL, STACK_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
    if (stack_guard == MAP_FAILED) {
        perror("mmap failed");
        exit(1);
    }

    // 将保护区域设置为不可写
    if (mprotect(stack_guard, STACK_SIZE, PROT_NONE) == -1) {
        perror("mprotect failed");
        exit(1);
    }

    // 获取当前堆栈指针
    asm volatile ("mov %%rsp, %0;" : "=r" (stack_top));

    // 将保护区域映射到堆栈上方
    stack_top -= STACK_SIZE;
    if (mmap(stack_top, STACK_SIZE, PROT_READ|PROT_WRITE, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) == MAP_FAILED) {
        perror("mmap failed");
        exit(1);
    }

    // 设置信号处理函数
    struct sigaction sa;
    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = handle_stack_overflow;
    if (sigaction(SIGSEGV, &sa, NULL) == -1) {
        perror("sigaction failed");
        exit(1);
    }

    // 运行应用程序
    while (1) {
        // 监控保护区域是否被改动
        if (*stack_guard != 0) {
            handle_stack_overflow(SIGSEGV);
        }
        *stack_guard = 1;

        // 应用程序代码
        // ...
    }

    return 0;
}

以上代码演示了如何使用 mmap() 系统调用为应用程序分配堆栈保护区域,并使用信号处理函数来检测堆栈溢出事件。在每个循环迭代中,程序会监控保护区域是否被改动,如果被改动则触发信号处理函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值