使用#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/