iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0

接著就是最重要的Stack部分,兩邊都是做一樣的事情。
https://ithelp.ithome.com.tw/upload/images/20240920/20169016JGYS90CMTh.png
https://ithelp.ithome.com.tw/upload/images/20240920/20169016tikhqgRRha.png
IDA顯示的30h等同於0x30,同樣的Ubuntu的0x10等同10h。

這邊開始就是程式在做Stack分配。
可以把Stack想像成一個櫃子,由下往上放物品,正常的程式櫃子的最下面會是RBP最上面會是RSP,程式在一開始的時候會放RBP,然後定義出程式的空間,現在要做PUSH RBP,但這個RBP是從哪來的呢?
之後在講Function call 的時候會仔細說明,這邊只需要知道這個RBP是上一個程式的RBP紀錄,由於程式在轉跳到我們現在這個main Function時會做轉跳前的準備,其中放入OLD RBP就是準備的一種。
https://ithelp.ithome.com.tw/upload/images/20240920/20169016qjx878o0Kr.png

接下來是MOV RBP,RSP,就是把RSP的值放到RBP,這邊或許會有個疑問,那Stack裡的RBP會跟著變成RSP的值嗎。
其實不會,Stack當中的值和Code是分開的,Code會慢慢往下跑,但不會每個運算都要放入Stack,而MOV RBP,RSP改變的值是暫存器當中的值,並不會影響到Stack,所以做完MOV RBP,RSP後,RBP的值就被改變了,現在,RBP和RSP的值是相同的。
https://ithelp.ithome.com.tw/upload/images/20240920/20169016UfWX0dV9qn.png

最後一個是SUB RSP,0x10,這邊拿Ubuntu為例,要注意的是這張圖我是畫顛倒的,這樣會比較好理解Stack先進後出的堆疊概念,所以越上面越小的值,假設現在的Address是0x20的話,拉出0x10的空間RSP的Address就在0x10處。
https://ithelp.ithome.com.tw/upload/images/20240920/20169016sio6AFq2UY.png
這樣就完成程式的前三行,目的是為了拉出使用空間。


上一篇
第一個 Reverse
下一篇
程式的開頭
系列文
從0開始的打Pwn教學14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言