c - 全局常量与#define。从安全角度来看哪个更好?

标签 c macros constants buffer-overflow

使用#define:

#include <stdio.h>

#define CONSTANT "Constant"

int main(void)
{
    char buf[32];
    strcpy(buf, CONSTANT);

    return 0;
}

使用全局const:

#include <stdio.h>

const char *constant = "Constant";

int main(void)
{
    char buf[32];
    strcpy(buf, constant);

    return 0;
}

现在假设有人设法对生成的二进制文件进行十六进制编辑。他/她可以编辑全局常量导致缓冲区溢出,从而执行任意代码。

我的问题是,使用 #define 是否可以进行这种十六进制编辑?

我自己还没有尝试过十六进制编辑,因为我对如何破译这些十六进制值一无所知!我也找不到任何可靠的教程。

最佳答案

两者都不安全。在某一时刻,两个字符串无论如何都必须存储在可执行文件中。

此外,如果用户要编辑二进制文件,我认为他们根本不会费心溢出您的字符串 - 他们只会直接编辑二进制代码。

$ cat test.c
#include <stdio.h>

#if TEST == 0

#define str "Hello World\n"

int main() {
    puts(str);
    return 0;
}

#else

const char *str = "Hello World\n";

int main() {
    puts(str);
    return 0;
}

#endif
$ gcc test.c -Wall -DTEST=0 -o test0
$ gcc test.c -Wall -DTEST=1 -o test1
$ grep "Hello World" test0
Binary file test0 matches
$ grep "Hello World" test1
Binary file test1 matches

关于c - 全局常量与#define。从安全角度来看哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17441224/

相关文章:

c - 删除链表的唯一节点

用于创建查找表的 C 预处理器宏

c++ - 宏没有用直接调用展开,而是用间接调用展开

c 宏,不带引号的标记粘贴

c++ - const int 指针错误

c - 这个奇怪的函数定义是什么意思?

c - 决定必须由 super 用户调用 setgroups() 和 initgroups() 的机制是什么?

c - 如何将 getline() 的每个字符串存储在(动态)字符串数组中?

c++ - QSize 与使用 2 Int 有常量

c++ - 干掉只有 const 不同的代码