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

關注:Hunter網路安全 獲取更多資訊
網站:bbs.kylzrv.com
CTF團隊:Hunter網路安全
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/243538.html
標籤:其他
