c - C 中缓冲区的运算符地址

标签 c buffer-overflow

我正在阅读《黑客:剥削的艺术》一书,我正在努力理解以下代码:

    int main(int argc, char *argv[]) { 
        int value = 5; 
        char buffer_one[8],buffer_two[8]; 
        strcpy(buffer_one, "one"); /* Put "one" into buffer_one. */ 
        strcpy(buffer_two, "two"); /* Put "two" intobuffer_two. */ 
        printf("[BEFORE] buffer_two is at %p and contains\'%s\'\n", buffer_two, buffer_two); 
        printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one); 
        printf("[BEFORE] value is at %p and is %d (0x%08x)\n", &value, value, value);

我无法理解的是,在前 2 个 printf 语句中,我们没有使用运算符地址,但输出给出了内存地址,对于整数,我们向 (&) 运算符提供了地址。我已经检查过 gdb,如果我使用 &buffer_two 和 &buffer_one,我会得到相同的结果,但是当我在最后一个 printf 语句中删除值之前的运算符地址时,我得到的输出是 0x5。

最佳答案

好了,你即将从新手迈入老手境界了。 :-)

当您定义一个数组时,例如 char buffer_one[8],名称 buffer_one 是代表数组地址的标签。该标签没有与之关联的地址,编译器选择实现 &buffer_one 以提供与没有 & 相同的结果。

对于非数组的值则不然,例如 valuevalue 保存一个值,&value 为您提供变量 value 的地址。

希望这能澄清问题。

顺便说一句,函数指针也是如此。我们都知道函数指针的使用方式如下:(*func_ptr)() 来调用它指向的函数,但它的工作方式也如下:func_ptr() .

关于c - C 中缓冲区的运算符地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41793203/

相关文章:

c - Fedora 32 位上的缓冲区溢出测试不更改 $eip 寄存器值

c - 定时器回调中的长过程

C双链表根据位置插入

c - IA32 寄存器地址

c - 查找k轮后的数组状态

c - gdb 显示与代码中不同的地址

C++缓冲区溢出在3台机器上不同

c - 相当简单的 C 代码中的安全漏洞

c - 按位计算负数

c - 为什么应该使用 strncpy 而不是 strcpy?