學習計時:共14小時html 讀書:3編程 代碼:3windows 做業:2數組 博客:4安全 |
1、學習目標數據結構 |
1. 理解逆向的概念以及
2. 掌握X86彙編基礎,可以閱讀(反)彙編代碼
3. 瞭解ISA(指令集體系結構)
4. 理解函數調用棧幀的概念,並能用GDB進行調試
|
2、學習資源less |
1. 教材:第三章《程序的機器級表示》,詳細學習指導見這:重點是3.7,3.11函數 2. 課程資料:https://www.shiyanlou.com/courses/413 實驗四,課程邀請碼:W7FQKW4Y學習 3. 教材中代碼運行、思考一下,讀代碼的學習方法見這。測試 |
3、學習方法 |
1. 進度很重要:必須跟上每週的進度,閱讀,練習,問答,項目。我會認真對待每一位同窗,請你不要由於困難半途而廢。
2. 問答很重要:遇到知識難點請多多提問,這是你的權利更是您對本身負責的義務。問答到博客園討論小組:
http://group.cnblogs.com/103791/
3. 實踐很重要:解決書中習題,實踐書中實例,完成每週項目,纔算真的消化了這本好書。經過實驗樓環境或本身安裝的虛擬機在實踐中進行學習
4. 實驗報告很重要:詳細記錄你完成項目任務的思路,得到老師點評和幫助本身複習。學習完成後在博客園中(
http://www.cnblogs.com/)把學習過程經過博客發表,博客標題「學號-信息安全系統設計基礎第五週學習總結」
|
4、學習任務 |
1. 閱讀教材,完成課後練習(書中有參考答案) 3.1-3.7中練習,重點:3.1,3.3,3.5,3.6,3.9,3.14,3.15,3.16,3.22,3.23,3.27,3.29,3.30,3.33,3.34 2. 考覈:練習題把數據變換一下 3. 實驗:須要動手的到實驗樓中練習一下 4. 深化、實踐題目,額外加分
|
五、後續學習預告(可選): |
第四章《處理器體系結構》 |
六、學習過程 |
(提示:此處由學生填寫,學習過程,學習筆記,代碼編譯,運行結果,思考等)
3.2程序編碼
1、機器級代碼
對於機器級編程來講,兩種抽象尤其重要。
2、代碼示例
書第107頁的代碼以下: int accum = 0; int sum(int x, int y) { int t = x + y; accum += t; return t; }
反彙編器查看目標代碼文件的內容。 objdump -d xxx.xx
二進制文件能夠用od 命令查看,也能夠用gdb的x命令查看。 有些輸出內容過多,咱們可使用 more或less命令結合管道查看,也可使用輸出重定向來查看。 od code.o | more
od code.o > code.txt
在讀取地址時要注意是否是小端法,小端法的正確讀法是與天然方向相反,好比109頁第六行中後四個字節18 a0 04 08的正確順序實際上是08 04 a0 18,去掉最高位的0後即爲0x804a018
3、關於格式的註解
全部以「.」開頭的行都是指導彙編器和連接器的命令。咱們一般能夠忽略這行。 爲了更清楚地說明彙編代碼,有一種格式來表示彙編代碼。 忽略了大部分指令,但包括行號和解釋性說明。 如下是帶解釋的彙編代碼:
Linux和windows的彙編格式的區別:
在帶有多個操做數的指令狀況下,列出操做數的順序相反 (當帶選項-S和-O1運行gcc時,會產生xxx.s文件,其中帶有'.'開頭的行是指導彙編器和連接器的命令)
3.3 數據格式 C語言數據類型在IA32中的大小:
大多數經常使用數據類型都是以雙字形式存儲的。
如圖,大多數GCC生成的彙編代碼指令都有一個字符後綴,代表操做數的大小。 浮點數使用的是一組徹底不一樣的指令和寄存器。
3.4 訪問信息
1、操做數指示符
操做數的三種類型:
有效地址的計算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
尋址方式和操做數格式:
2、數據傳送指令 將數據從一個位置複製到另外一個位置的指令。
不能從內存地址直接MOV到另外一個內存地址,要用寄存器中轉一下,所以須要兩個指令。
3.5 算術和邏輯操做
按目的操做數分類:
1.加載有效地址 實際是將有效地址寫入目的操做數,目的操做數必須是寄存器。
2.一元操做 操做數既是源又是目的。能夠是寄存器也能夠是存儲器。
3.二元操做 第二個操做數既是源又是目的。但兩個操做數不能同時是存儲器。
4.移位操做 位移量是一個當即數或放在單字節寄存器%cl中。移位操做的目的操做數能夠是一個寄存器或是一個存儲器位置。
SAL 算術左移 SHL 邏輯左移 SAR 算術右移(補符號位) SHR 邏輯右移(補0
控制中最核心的是跳轉語句: 有條件跳轉(實現if,switch,while,for) 無條件跳轉jmp(實現goto)
特殊的算術操做
3.6 控制
1、條件碼寄存器
leal不改變任何條件碼(CMP指令根據他們的兩個操做數之差來設置條件碼。除了至設置條件碼而不更新目標寄存器以外。CMP與SUB相同)
2、訪問條件碼 1.根據條件碼的某個組合,將一個字節設置爲0或1。SET指令根據t=a-b的結果設置條件碼 2.能夠條件跳轉到程序的某個其餘部分 3.能夠有條件的傳送數據
3、跳轉指令(致使執行切換到程序中一個全新的位置,跳轉的目的地一般用一個標號指明) 無條件跳轉:JMP 能夠是直接跳轉也能夠是間接跳轉(寫法是*後面加操做數指示符) 有條件跳轉:根據條件碼的某個組合,或者跳轉或者繼續執行下一條指令
3.7 過程 包括將數據和控制從代碼的一部分傳遞到另外一部分,須要在進入時爲過程的局部變量分配空間並在退出時釋放空間,這經過程序棧實現。 IA32經過程序棧來實現過程調用。
棧的做用:傳遞過程參數、存儲返回信息、保存寄存器、本地存儲 棧幀:爲單個過程分配的那部分棧 結構:最頂端的棧幀以兩個指針界定,寄存器%ebp爲幀指針,寄存器%esp爲棧指針。程序執行時,棧指針能夠移動,大多數信息的訪問都是相對於幀指針的。
棧向低地址方向增加
2、轉移控制
有一個目標,即指明被調用過程起始的指令地址,效果是將返回地址入棧,並跳轉到被調用過程的起始處。
從棧中彈出地址,並跳轉到這個位置,使用這個指令棧指針要指向call指令存儲返回地址的位置。
|
7、遇到的問題及解決 |
(提示:此處由學生填寫,是重要的得分點,要寫出遇到的問題和解決方案以及對出現問題的思考) 不能由於困難而半途而廢呀……上週的學習出現了問題,所以測驗成績很低。學習的內容一旦多了,就會想要得過且過。 通過測驗,從新反思了本身的學習習慣問題。之後會繼續腳踏實地。 不過老師此次的書本閱讀量好大,寫博客就寫了四個小時……前六節的基礎很重要所以不能不看,第七節最重要,所以重點理解。 課後習題由於有參考答案因此並無大問題,有在學習過程當中遇到一些瑣碎的問題,詢問了同窗和百度知道,都有不一樣程度地解決。
最後,仍是但願老師能夠減輕做業量……今天個人生日也全埋在教室裏寫做業了……
PS 閆佳鑫同窗很強大,有少量內容借鑑她的博客。
|
8、其餘 |
(提示:此處由學生填寫,靈感,領悟等) |