linux64位系统下程序调用顺序

本文详细介绍了在Linux64位系统中,程序从启动到执行过程中函数调用的顺序,包括逻辑地址、线性地址和物理地址的区别,以及栈帧的初始化、执行和返回过程。通过分析汇编代码和调试过程,揭示了函数调用时参数传递、返回地址存储以及栈帧管理的细节。
摘要由CSDN通过智能技术生成

0x00
最近在学习缓冲区溢出,在开始阶段,一直没有弄懂相关资料中的溢出大小是怎么计算出来的,在自己摸索下,终于找到了一些线索。为了实现缓冲区攻击,我们得先知道程序在内存中的调用顺序,这样才能清楚缓冲区溢出的空间大小。

0X01:基本知识

1、在操作系统中,地址有三种:逻辑地址、线性地址、物理地址。
逻辑地址:是指是包含在机器语言中用来指定 一个操作数或一条指令的地址;在采用分段机制的内存中,逻辑地址分为段地址和偏移地址。
线性地址:也称虚拟地址,它是逻辑地址经过分段系统进行运算得到的地址。
物理地址:是与内存单元相对应的地址,是线性地址经过分页系统进行运算得到的地址。
三种地址之间的转换
2、页与页框:页对应的地址就是线性地址块,页框是指物理地址块,页的大小和页框一样,但是他们之间对应关系不是一一对应的,他们的对应方式采用页表进行映射。
3、程序在运行之前在内存中是二进制文件,直到运行它,才从磁盘中调入内存中,创建进程。例如,我们编写简单的hello程序。
#include <stdio.h>
int main()
{
printf ("hello world!\n");
return 0;
}

使用gcc编译,使用gcc -o hello hello.c编译命令,将c程序文件编译成为可执行文件,使用ls hello -l命令可以查看可执行文件,file hello可以查看此文件是在linux-X86-64位系统下编译的。Size hello命令是显示文件的分区,在没有调入内存运行之前,程序中分为text(代码区)、data(数据区)、bss(未初始化数据区);text区中的数据主要是代码指令和局部变量,data区中的数据是存放全局变量、静态变量和常量,bss区中存放的是全局但未初始化的变量。这三个区是在程序未运行时,经编译生成的,大小不会改变。
hello文件静态分区
在程序运行是,程序在内存中的分区会增加堆区、栈区和环境/参数节。
程序运行时
0x2:转入正题
现在我们开始调试程序,一步步揭开程序在内存中的秘密。
现在的内存管理机制中,有了许多安全机制,其中的地址随机我们得关掉,不然我们无法继续学习。
我们先编写程序。
#include <stdio.h>
int fun1(int a,int b)
{
int c = fun2(a, b);
return c;

}
int fun2(int a,int b)
{
int c = a+b;
return c;
}

int main ()
{
int a = 1;
int b = 3;
int c = fun1(a,b);
printf(“%d\n”,c);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值