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 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函数:
- #开发stack新空间push rbp #切一个新的localvaribalmov rbp,rspsub 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 #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
- #我们现在跳出了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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |