前言:
菜鸡总结如有不对,望各位大佬及时指点,以免误人子弟。
下面是以一个具体的程序调用的函数的过程为例进行讲解的,主要涉及到的是为了做 pwn 题准备的。
0x1 :进入函数之前:
首先查看一下程序的伪代码:就是调用一个fun函数来比较三个数值的大小。
查看一下一下main函数的汇编代码:
可以发现在调用fun函数之前先进行了传参,注意32位程序和64位程序的传参方式不一样,32位程序是栈传参,而64位优先寄存器传参,寄存器总共有六个:rdi、rsi、rdx、rcx、r8、r9,当参数多于七个时才轮到栈传参。
传参以后就是执行call指令。call指令实际上包含两个指令
就这里而言应该push的是 0x00000590,然后跳到fun函数里。此时的栈布局应该是这样的:
0x2 :进入函数时:
跳到fun函数里面,查看一下汇编代码:
重点讲一下前的三行,基本上每一个程序都有这三个指令,那么它们有什么作用呢?
push ebp: 将主调函数(main函数)的ebp保存下来,为了就是调用完这个函数以后以后跟调用之前的一样。
mov ebp, esp: 将ebp栈底抬上去,什么意思呢?就是之前的ebp的地址不是main函数的吗,而esp是栈顶,随着你的输入输出而改变的,mov指令就是将你的ebp放到最上面。
sub esp,10h: 为新栈开辟一段内存空间,其大小为0x10.
最终的结果:
0x3 :退出函数时:
主要就是两个命令leave和ret命令
其最终结果为: