最後我們來看一整支程式結束時的樣子,GDB是寫leave ret,意思其實與IDA的ADD RSP,xxh
POP RBP
Return
一樣,
只是並非使用ADD,而是MOV RSP,RBP
我們先來看GDB,由於GDB是把兩個指令寫在leave中,所以會有兩個變化,當執行完leave後,RSP和RBP應該會是一樣的值,然後Stack當中的會有一個Address消失跑去暫存器中的RBP。
可以看到原本是SUB RSP,0x10,因此Leave的第一個指令是ADD RSP,0x10,所以會與目前的RBP一樣位址,然後Stack當中的Old RBP會放到現在的RBP當中。
這邊發現RSP的Address是de88,也就是原本的de70加上0x10後再加上POP RBP後總共0x18。
那為什麼RBP顯示0x0呢,這其實是Linux 下GDB的一個設定,在我們執行的程式還沒進入前RBP的設定是0x0,因此就算程式結束了,RBP跳轉的位址也會是0x0。
最後做ret後,會發現跳去了一個叫libc-start.c的地方,這就是Call我們這支程式前的程式了。
下次我們來說IDA的程式結束會長怎樣。