前言
看pwn的writeup ,發現都看不懂= =
那些大佬的wp看起來跟參考答案是略沒什麼區別啊(霧)!!
然後決定從最基本的學起來,每天補一點知識,一邊閉關一邊刷題。
聽說棧溢出挺簡單的(當我沒說----by三小時以後的我),那就先從學棧開始吧。
———————————————————————————————————
瞭解棧
上百度
注:按順序食用效果更佳
1.生動形象說明了棧
超生動,超級形象
2.簡單的介紹棧
這裏面有個地方設棧的最大長度爲size,棧滿不可入棧(上溢)[top=size-1]
我理解是top是從[0]開始的,所以裝滿了頂部指針會是top=size-1
而後面的出棧操作也驗證了這個理解
只有棧頂元素纔可出棧,棧空不可出棧
棧空條件:top=-1;
所以top確實是從0開始的
3.棧的三種含義
在pwn裏用到的棧溢出應該是第三種(霧)
4.百度百科棧
這裏大致看一下概念就好了
然後百度百科裏有一句話沒怎麼看懂
在i386機器中,棧頂由稱爲esp的寄存器進行定位。壓棧的操作使得棧頂的地址減小,彈出的操作使得棧頂的地址增大
爲什麼壓棧的操作會使棧頂地址減小啊,壓棧不是往上放東西嗎,那地址不就多了嗎…
然後各種百度,這個問題見5
5.操作系統中棧與堆的理解
對剛纔提出的問題解釋很透徹了,因爲它是向下生長的,是倒過來的,所以壓棧地址會減小,彈出地址會增大。這篇文章裏提到的ESP和EBP寄存器不懂,阻礙了理解,繼續百度
6.ESP寄存器與EBP寄存器
看完了以後再回頭看5,現在就很好理解了,ebp爲基指針,然後要調用函數的時候把esp往下放,用完了再來個(move esp,ebp)也就是把ebp的值賦給esp,這樣下方的空間就又都收回來了,好玩。
7.關於棧的理解
最後再看看別人的理解鞏固一下。說實話這篇看起來講的詳細,但還是很燒腦……
———————————————————————————————————
棧溢出
開始學棧溢出,資料如下
手把手教你棧溢出從入門到放棄(上)
手把手教你棧溢出從入門到放棄(下)
一.判斷棧溢出條件
1.程序要有向棧內寫入數據的行爲。
2.程序並不限制寫入數據的長度。
二.攻擊方法
在溢出數據內包含攻擊指令的內容或地址。
三.知識補充
對不懂的地方進行百度知識補充
EIP & EBP & ESP
這裏有一句話說的非常棒:
其實我們對這個只需要知道三個指針是什麼就可以,可能對我們以後學習棧溢出的問題以及看棧這方面的書籍有些幫助。當有人再給你說EIP,ESP,EBP的時候,你不能一頭霧水,那你水平就顯得窪了許多。其實不知道我們照樣可以編程,因爲我們是C級別的程序員,而不是ASM級別的程序員
而這裏面也介紹了棧溢出,可以先看這裏面的棧溢出再去看“手把手教你棧溢出從入門到放棄(上)”
四.開始學習
這裏先從棧溢出的上篇開始學習,因爲上篇介紹了棧溢出的原理和兩種覆蓋地址的方法。這兩種方法都需要操作系統關閉內存佈局隨機化(ASLR)並且shellcode 需要程序調用棧有可執行權限。下篇講的就是剋制ASLR的方法,今天是pwn第一天,先學上篇好咯,明天看下篇。
———————————————————————————————————
坐等南郵的nctf出pwn中關於棧溢出的題目來練練手[手動滑稽]
———————————————————————————————————
總結
萬事開頭難,但總得開個頭吧
希望能有閉關學pwn第二天
說起開頭難emmm…(最近很危險,似乎有人想開我頭)
絲毫不慌。
因爲……
漂亮啊,網球乾的漂亮!網球兄弟,nice!