我有这样的功能:堆栈中“缺失”的空间是什么?
int vulnerableFunc(char *input)
{
char buffer[256];
memcpy(buffer, input, 1024);
return 1;
}
当我把它与2000年 “A”,并与OllyDbg的dissassemble它一个32位的Windows XP计算机上,我得到堆栈上的以下地址:
22FB6C Ret Addr |
22FB68 Old EBP | |
| 268 |
| | 264
22FA60 Buffer for Writing A | |
22FA5C ?? RETURN from ntdll.7c92755D to ntdll.7C927553 |
22FA58 1024 |
22FA54 SRC - Ptr to 22FBB0 (22FBB0 = A * 2000 (Original Arg to Func)) | 16
22FA50 DEST - Ptr to 22FA60 (Copy is Inc From 22FA60) |
22FA4C local var end (last local var 22FA50)
Q1)我只分配256个字节的局部变量,但我从“缓冲区写入时的” 264个字节,直到“老EBP”,这是为什么?
Q2)什么是 “从ntdll.7c92755D到ntdll.7C927553 RETURN”,在地址22FA5C?不应该只有12个字节的参数memcpy?
的/ GS编译选项创建检测栈帧的腐败,你在这里锻炼的那种栈金丝雀。/RTC还创建额外的空间来检测错误。 –
我认为Q1的答案可能是因为的char []相同的char *,这本身是一个64位系统上的8个字节+您所分配的256个字节。再说,我不知道.. – Brandon
@ CantChooseUsernames的操作系统是32位的,对不起,早不说明 – user962460