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

NTUS
实例程序:
二进制安全学习:Example:Function Prologue and Function Epilogue(基础函数调用机制)_第1张图片
分析:
程序解释:
定义val,val = function add(2)
add(2):
2=num-1 ==> num=3
return num =num+add(2)=3+2=5
val=num=5
编译成汇编:
二进制安全学习:Example:Function Prologue and Function Epilogue(基础函数调用机制)_第2张图片
汇编代码部分分析:

#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 完函数后,进入函数:
二进制安全学习:Example:Function Prologue and Function Epilogue(基础函数调用机制)_第3张图片
现在进入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 
jmp 4005313 <add+0x2c>
#把2放到localvaribal 
#然后跳到地址4005213
mov eax,DWORD PTR [ebp-0x4]

待更,敬请期待。

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

你可能感兴趣的:(笔记)