请选择 进入手机版 | 继续访问电脑版

硬核二进制安全学习: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
编译成汇编:

汇编代码部分分析:
  1. #Function Prologue部分:push rbpmov rbp,rspsub rsp,0x10#分配新的local varibal,即Stack中开发新空间mov edi,0x2 #val=add(2);在stack中分配空间call 4004e7  #stack pointer point to address 4004e7
复制代码
Main函数在不一定是第一个被执行的函数,编译器会首先执行library等初始化函数。
Stack中首先放入Address: _libc_start_main+231,比及Main函数执行完后, Return: _libc_start_main+231.
call 完函数后,进入函数:

现在进入add函数:
  1. #开发stack新空间push rbp #切一个新的localvaribalmov rbp,rspsub rsp,0x10
复制代码
  1. 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 #jne是一个条件转移指令。当ZF=0,转至标号处执行。mov eax,0x1 #跳转到leave语句jmp 4005313 #把2放到localvaribal #然后跳到地点4005213mov eax,DWORD PTR [rbp-0x4]sub eax,0x1 mov edi,eaxcall 400e47 #重新执行初始化Function Prologue/Epilogue#把eax的值放入edx ,又把值[rbp-0x4]放入eax ,重新将edx的值#放入eax覆盖掉mov edx,eaxmov eax,DWORD PTR [rbp-0x4]#eax =eax+edx add eax,edxleave #4005313 把stack中rbp的数值pop掉ret
复制代码
执行完Function后回到原来的Function Main

  1. #我们现在跳出了Function ,从400527开始执行#400527-400540 汇编代码完成输出功能call 4003f0 #这是一个library中的function,完成printf函数return 0 #mov eax,ox0
复制代码

关注:Hunter网络安全 获取更多资讯
网站:bbs.kylzrv.com
CTF团队:Hunter网络安全

来源:https://blog.csdn.net/qq_43332010/article/details/111812335
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )