临时数æ®å¦‚何存储在堆栈帧上

时间:2018-03-03 09:09:47

标签: c gcc stack-overflow buffer-overflow

Int test(){
    char buff[10]

    printf("Enter text: ");

    gets(buff);

    puts(buff);
}

我ä¸çŸ¥é“如何说出这个问题,但我试图ç†è§£å¦‚何将值存储在堆栈帧上为局部å˜é‡åˆ†é…的缓冲区中。

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

æ¯ä¸ªå—是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 
------------------

1 个答案:

答案 0 :(得分:2)

从严格的C角度æ¥çœ‹ï¼Œæˆ‘们ä¸çŸ¥é“。

标准没有具体说明。该标准甚至没有æ到堆栈的概念。从标准的角度æ¥çœ‹ï¼Œä»£ç æ˜¯åœ¨æŠ½è±¡æœºå™¨ä¸Šæ‰§è¡Œçš„(å³æ²¡æœ‰æ述机器是如何åšåˆ°çš„。åªæœ‰æœºå™¨å¿…é¡»åšçš„事情。)

所以它是如何完æˆå–决于具体的实现,它(å¯èƒ½ï¼‰å› ç³»ç»Ÿè€Œå¼‚。

您需è¦æ‰¾åˆ°æ‚¨æ­£åœ¨ä½¿ç”¨çš„系统的ABI文档。 ABI文档将æ述如何在您的系统上完æˆå®ƒã€‚

请å‚阅en.wikipedia.org/wiki/Application_binary_interface

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

相关问题