关于IA32下函数调用栈的简单理解与利用以及对于Linux64位函数调用栈的变化的疑问

关于IA32下函数调用栈的理解与利用以及对于Linux64bit函数调用栈的变化的疑问

CSAPP下的函数调用栈图片
通过图和阅读CSAPP可知调用函数时会先开辟一定空间的栈帧来为函数调用
每个函数调用开头的会有

push %ebp
movl %esp,%ebp
sub %xx,%esp  ;这里是为新函数开辟xx字节的空间

可知进入新函数后,区间[esp,ebp]之间的范围就是新函数的空间
而新函数传入的参数则是保存到[ebp+4h] [ebp+8h]…等
比如,存在函数func

void func(int a);

通过调用func函数后,ebp和esp的指向的是func的栈帧空间,此时[ebp+8h]就是a的空间。而调用func的函数的返回地址则保存在[ebp+4h],通过修改
返回地址我们可以使得func返回后不回到main函数,而是去到我们修改后的函数的地址,比如这段程序

#include <stdio.h>

void call(void){
    printf("call me\n");
}

int func(int a,int b){
    int *p = &a;
    p[-1] = &call;
    return 0;
}

int main(void){
    func(5,5);
    return 0;
}

运行结果,调用结果

当然,这是在啊哈C这款轻量级的IDE上面调试出来的结果
可是,这段代码在gcc version 8.3.0 (Debian 8.3.0-6)环境下面是无法调用出来的,而且此时传入的参数地址不再是当前函数栈帧的ebp + 08h.这是比较纳闷的,

1148:   55                      push   %rbp
1149:   48 89 e5                mov    %rsp,%rbp
 114c:   89 7d ec                mov    %edi,-0x14(%rbp)
116 114f:   48 8d 45 ec          lea    -0x14(%rbp),%rax      ;此时a 的地址为(rbp-0x14)

且本地变量仍然保存在当前[ebp-08h],传进去的参数的地址却变了.这是比较纳闷的,可能我看的CSAPP第二版比较老,在一些比较新的gcc和Linux下面出现了变化。。。。。

这里先挖个坑,等哪天搞懂了再来补充.。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值