c - 临时数据如何存储在堆栈帧中

标签 c gcc stack-overflow buffer-overflow

Int test(){
    char buff[10]

    printf("Enter text: ");

    gets(buff);

    puts(buff);
}

我不知道如何表达这个问题,但我想了解如何将值存储在为堆栈帧上的局部变量分配的缓冲区中。

---------------
Return Address
---------------
old ebp
---------------
local variables
--------------- 

是不是每 block 4字节,分成4个1字节?

------------------
 00 | 40 | 06 | 06
------------------
 ff | ff | de | 70 
------------------

通过 gdb 我看到分配给测试的缓冲区是 0x10

我输入了sssssssss:

x/x $rbp = 0xffffde70
x/x $rbp + 8 = 0x00400606
x/s $rbp - 16 = "sssssssss"
x/s $rbp - 8 = "\ns"
x/s $rbp - 4 = ""

那么我输入的字符(十六进制)是如何存储的?比如每个街区有多少人。这是一个 64 位系统。

 -----------------
 00 | 40 | 06 | 06
------------------
 ff | ff | de | 70 
------------------
    |    |    | 
------------------
    |    |    | s
------------------
 s  | s  | s  | s
------------------
 s  | s  | s  | s 
------------------

最佳答案

从严格的 C 角度来看,我们不知道。

标准没有指定这些东西。该标准甚至没有提到堆栈的概念。从标准的角度来看,代码是在抽象机器上执行的(即没有描述机器如何执行它。只有机器必须做什么)。

所以它是如何完成的取决于具体的实现,并且它(可能)因系统而异。

您需要找到您正在使用的系统的 ABI 文档。 ABI 文档将描述它是如何在您的系统上完成的。

参见 en.wikipedia.org/wiki/Application_binary_interface

也许读Where is the x86-64 System V ABI documented?

关于c - 临时数据如何存储在堆栈帧中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49082544/

相关文章:

c - 为什么这个小程序输出True? GCC有溢出保护吗?

c++ - 如何在 C 中为二维数组动态分配内存以避免堆栈溢出问题?

c++ - 调用栈溢出时如何打印调用栈?

c - 来自 makefile 的多个可执行文件

c - 为什么要用这个宏?

c - Sqlite3 结构未在 Eclipse 中解析

海湾合作委员会 11 : "options enabled" disappeared

c - gcc 简单算术循环性能

macos - 指定编译器 Homebrew 安装

c++ - 堆栈溢出与段错误