buffer_overflow 第2章 筆記2 組合語言
來,馬上淺談組合語言之不給你喘息。
首先,組合語言就2件事。
1.CPU。 //做運算
2.暫存器。 //用來存放數據
把CPU看成是你的大腦在做思考,暫存器則是每個手跟腳或器官,可以放不同東西。
例如:
左手現在有一隻掃把,右手則有一隻笨斗,光拿著是沒用的,想要掃地,就必須結合使用,靠我們的大腦思考要如何掃地。
上面的例子:
左手是一個暫存器 存放的數據是掃把
右手也是個暫存器 存放的數據是笨斗
左腳 暫存器 一隻白鞋
右腳 暫存器 一隻白鞋
CPU才是老大可以控制所有手跟腳,讓左手的掃把打人,也可以掃地,也可以穿白色鞋子邊走邊掃。
常見暫存器有哪些:
AX,BX, CX, DX 這四個暫存器基本上隨便用,可以存放任何數據。
接下來非常重要的指針暫存器,IP,BP,SP 。
指針熟悉C語言的都知道吧? 不知道別怕。。。
範例
宣告 int *ptr // ptr 是指針變數
int a=123 // a變數的值是123
ptr=&a // ptr變數指向a變數
只要是變數 都會有記憶體地址空間 ,該空間可以存放數據
假如 ptr變數的地址是0x4410 數據還未知(因為還沒指向)
a變數的地址則是0x8761 數據為 123
當 ptr=&a時:
ptr變數的地址是0x4410 數據為0x8761(a的地址)
a變數的地址則是0x8761 數據為 123
所以指針存放的數據會是一個記憶體位置
這三個指針暫存器 非常重要
IP // IP暫存器內的值 是一個地址
BP // BP暫存器內的值 是一個地址
SP // BP暫存器內的值 是一個地址
1. IP暫存器內的值是一個地址,此地址裡面的指令CPU接下 來會執行
2. BP暫存器內的值是一個地址,此地址代表堆疊基底
3. SP暫存器內的值是一個地址,此地址代表堆疊頂
BP到SP之間就是堆疊目前的高度
目前到這裡先望文生義即可!!!
我們要用現在所學的暫存器套用在上一節的 故事中
BP 就是 書籤
SP 就是 筆記本用過的最後一頁
假如書籤在筆記本第1頁,筆記本用到第11頁,這中間夾起來的頁數可以說是堆疊的高度。
前面講的故事有兩個主角 孔子 就是main 函數 白居易 則是 func自訂函數,接下來請看影片講解: main函數執行到func函數,再從func函數回到main函數的堆疊過程。
漏洞程式:
void func(char *str)
留言
張貼留言