如何在全局变量中获得缓冲区溢出?

时间:2014-01-25 07:51:46

标签: c global-variables buffer buffer-overflow

我正在研究检测和预防BOF攻击,我想知道,我怎样才能溢出全局结构?

我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct{
        char name[20];
        char description[10];
} test;


int main(int argc, char **argv){
        if(argc != 2)
                exit(-1);
        *(*(argv+1)+20) = '\x00'; //terminate string after 20 characters

        strcpy(test.name, argv[1]); //no BOF here... stopped at 20
        printf("%s\n", test.name);

        char *desc;
        desc = malloc(10);
        if(!desc){
                printf("Error allocating memory\n");
                exit(-1);
        }
        scanf("%s", desc); //no bounds checking - this is where I BOF
        strcpy(test.description, desc); //copy over 10 characters into 10 char buffer
        printf("%s\n", test.description); //this prints out whatever I type in
        //even thousands of characters, despite it having a buffer of 10 chars
}

2 个答案:

答案 0 :(得分:5)

以与执行任何其他缓冲区类型相同的方式溢出全局缓冲区;在其中存储的数据多于为其分配的字节数。也许问题是“这会造成什么损害?”,答案是通常的:它取决于

基本上,当你溢出一个特定的全局缓冲区时,你会写一些其他全局变量,接下来会发生什么取决于是否再次引用另一个变量,以及它应该保留什么。它通常不具有函数返回地址等,因此可能更难以利用。

答案 1 :(得分:1)

char *desc = malloc(10);
scanf("%s", desc); //no bounds checking - this is where I BOF
strcpy(test.description, desc); //copy over 10 characters into 10 char buffer

在现代Linux系统上测试期间需要解决的一件事是调用scanfstrcpy。现代系统使用FORTIFY_SOURCE,它试图修复某些类的缓冲区溢出。

FORTIFY_SOURCE使用高风险函数的“更安全”变体,例如memcpystrcpy。当编译器可以推导出目标缓冲区大小时,编译器会使用更安全的变体。如果副本超过目标缓冲区大小,则程序将调用abort()

要禁用FORTIFY_SOURCE进行测试,您应该使用-U_FORTIFY_SOURCE-D_FORTIFY_SOURCE=0编译该程序。