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