硬核二进制安全学习:Example:Function Prologue and Function Epilogue(基础函数调用机制)

NTUSTISC Pwn basic 台湾科技大学
实例程序:
在这里插入图片描述
分析:
程序解释:
定义val,val = function add(2)
add(2):
2=num-1 ==> num=3
return num =num+add(2)=3+2=5
val=num=5
编译成汇编:
在这里插入图片描述
汇编代码部分分析:

#Function Prologue部分:
push rbp
mov rbp,rsp
sub rsp,0x10
#分配新的local varibal,即Stack中开辟新空间
mov edi,0x2
 #val=add(2);在stack中分配空间
call 4004e7 <add> 
#stack pointer point to address 4004e7

Main函数在不一定是第一个被执行的函数,编译器会首先执行library等初始化函数。
Stack中首先放入Address: _libc_start_main+231,等到Main函数执行完后, Return: _libc_start_main+231.

call 完函数后,进入函数:
在这里插入图片描述
现在进入add函数:

#开辟stack新空间
push rbp 
#切一个新的localvaribal
mov rbp,rsp
sub rsp,0x10 
mov DWORD PTR [rbp-0x4],edi 
#edi寄存器放到localvaribal[rbp-0x4]地址
cmp DWORD PTR [rbp-0x4],0x1
#判断是否等于1
#CMP指令用法
#cmp(compare)
#CMP OPR1,OPR2
#CMP (OPR1)-(OPR2)
jne DWORD 4004ff <add+0x18>
#jne是一个条件转移指令。当ZF=0,转至标号处执行。
mov eax,0x1 
#跳转到leave语句
jmp 4005313 <add+0x2c>
#把2放到localvaribal 
#然后跳到地址4005213
mov eax,DWORD PTR [rbp-0x4]
sub eax,0x1 
mov edi,eax
call 400e47 <add>
#重新执行初始化Function Prologue/Epilogue
#把eax的值放入edx ,又把值[rbp-0x4]放入eax ,重新将edx的值
#放入eax覆盖掉
mov edx,eax
mov eax,DWORD PTR [rbp-0x4]
#eax =eax+edx 
add eax,edx
leave #4005313 把stack中rbp的数值pop掉
ret

执行完Function后回到原来的Function Main
在这里插入图片描述

#我们现在跳出了Function ,从400527开始执行
#400527-400540 汇编代码完成输出功能
call 4003f0<printf@plt> 
#这是一个library中的function,完成printf函数
return 0 #mov eax,ox0
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT鹅

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值