加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

用于堆栈的“缺失”空间是什么?

发布时间:2020-12-16 07:07:04 所属栏目:百科 来源:网络整理
导读:我有这个功能: int vulnerableFunc(char *input){ char buffer[256]; memcpy(buffer,input,1024); return 1;} 当我用2000“A”调用它并用32位Windows XP机器上的ollydbg解组时,我在堆栈上得到以下地址: 22FB6C Ret Addr |22FB68 Old EBP | | | 268 | | | 2
我有这个功能:

int vulnerableFunc(char *input)
{
    char buffer[256];

    memcpy(buffer,input,1024);
    return 1;
}

当我用2000“A”调用它并用32位Windows XP机器上的ollydbg解组时,我在堆栈上得到以下地址:

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个字节的局部变量,但是从“写入A的缓冲区”到“旧的EBP”我得到了264个字节,为什么会这样?

Q2)地址22FA5C的“从ntdll.7c92755D返回到ntdll.7C927553”是什么?不应该只有12个字节的memcpy参数?

解决方法

想象一下,你应该意识到,与执行时间相比,内存目前很便宜,至少对于非嵌入式环境而言.因此,如果错误地注意填充它们,就会导致堆栈使用上的差距.特别是对于这种情况,我不熟悉MSVC的习惯,但显然可以看到以下间隙开始与16字节边界对齐.这样的边界对于高速缓存访??问优化是有用的,并且是许多ABI所需的(例如AMD x86-64 ABI;并且GCC现在甚至对于32位环境也这样做).我想这是跳过几个字节但达到更高执行速度的第一个原因.

第二个因素是,如果被调用的函数遵循C样式约定(如__cdecl)并且不清除它之后的堆栈,则在函数调用之后通过其参数大小移动堆栈指针.如果它比呼叫者重要,应立即将SP移回;但它似乎再次不如额外的CPU指令重要.在没有SP返回的情况下调用函数链时,我一直在GCC之后看到目标代码示例,因此它被移动超过100个字节到其初始位置.这也是一个权衡问题,可能非常依赖于优化级别,目标CPU调优等.

所以我的建议只是停止担心,除非你正在开发一个相当有限的资源案例(嵌入式,系统启动等)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读