當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導讀]逆向,是安全領域必備的技能之一。但凡有編程經驗的人都應該熟知高級語言源代碼從編譯鏈接到執(zhí)行的過程,逆向就是把這個過程反了過來,反病毒人員捕獲到樣本,需要對其逆向才能分析出該樣本的行為,才能開發(fā)出有效的專殺工具。

逆向,是安全領域必備的技能之一。但凡有編程經驗的人都應該熟知高級語言源代碼從編譯鏈接到執(zhí)行的過程,逆向就是把這個過程反了過來,反病毒人員捕獲到樣本,需要對其逆向才能分析出該樣本的行為,才能開發(fā)出有效的專殺工具。

在開始真正接觸逆向之前,首先要具備一些匯編的基礎知識,之所以說匯編的基礎知識,是說搞逆向沒有必要精通匯編,因為并不是要求我們成為匯編程序員;學習匯編的道路晦澀難懂,最好的方式是在學習逆向破解的過程中去根據(jù)實際需要去學習,那么本文主要介紹的是逆向基礎的寄存器和內存方面的信息,首先介紹的是逆向主要是做什么的,其次對編程和機器架構做了個簡介,最后詳細的闡述了逆向基礎的寄存器和內存。

逆向主要是做什么的

1、逆向分析已經編譯好的軟件,然后使用高級語言重現(xiàn),可以模仿已有的比較好的軟件,供自己創(chuàng)業(yè)使用。

2、用于分析病毒,提取出特征碼,便于開發(fā)殺毒程序。

3、高級代碼審計,在匯編層面調試程序,寫出來的代碼更加安全。

4、外掛,游戲的外掛就是這樣產生的,具體就不詳細介紹的,畢竟不是光彩的事。

5、分析嵌入式設備中的漏洞。

6、開發(fā)嵌入式設備的軟件。

匯編語言的位置

為什么要學習匯編語言呢?就像學習美國文化要先懂英語一樣,如果不了解計算機的語言,又何談懂計算機呢?我們知道,計算機執(zhí)行的語言,或者稱之為命令序列或數(shù)據(jù),都是以“1和0”的二進制語言,物理上則表現(xiàn)為電信號的高低電平。雖然我們現(xiàn)在有C/C++、Java、Python等一系列強大的高級語言,但是其真正落實到計算機的執(zhí)行時還是需要編譯或解釋成計算機懂的機器語言。最早的時候計算機編程就是在紙帶上打孔表示1或0,以此作為編程指令,不僅難于操作,而且很難查錯,記憶也很困難。于是人們發(fā)明了機器語言的“人性化”表示:匯編語言(Assembly language),每條匯編指令都對應著一條機器二進制串,但是卻更加容易理解和記憶:

雖然我們現(xiàn)在有許多的高級語言可以用來編程,但是如果想真的理解代碼執(zhí)行的實際過程,還是需要我們去懂些匯編語言,從本質上理解機器的行為。因此當今IT的各位童鞋們學習匯編語言還是十分重要的,逆向就更不用說了。

機器架構

計算機的核心是CPU,負責各種運算,其中又包括運算器和寄存器,寄存器中也用來存儲數(shù)據(jù),但是一般較小,讀寫速度快,是運算器直接操作的對象;CPU之外有存儲器,存儲器一般指內存,分為可讀寫的RAM和只可讀的ROM;其余各種外設比如顯卡、網卡等都通過主板上的總線與CPU相連,CPU通過總線同存儲器以及各種外設中的芯片(進而同外設中的存儲器)進行數(shù)據(jù)通信。

存儲器按字節(jié)大小分為存儲單元,例如一個字節(jié)是一個存儲單元。CPU訪問存儲器時必須完成三件任務:1. 存儲單元的地址(地址信息);2. 器件的選擇,讀或寫的命令(控制信息);3. 讀或寫的數(shù)據(jù)(數(shù)據(jù)信息);因此,CPU同各種存儲器之間自然而然存在三種總線:地址總線、控制總線與數(shù)據(jù)總線。

控制總線決定了命令的種類,數(shù)據(jù)總線決定了一次處理的數(shù)據(jù)最大位數(shù),8位數(shù)據(jù)總線處理16位數(shù)據(jù)時要分兩次進行,而16位數(shù)據(jù)總線一次就能解決問題。地址總線則決定了CPU的尋址能力,即內存的大小,比如8位的地址總線最大只有256個單元,即256字節(jié),而32位的地址總線最多有2的32次冪bit,即4GB,這也是x86最多支持4G內存的原因。

既然說到了4G內存的由來,那么就可以趁熱打鐵說說內存地址空間了,CPU認識的每個存儲單元默認為1字節(jié),因此可以定位的所有內存單元最大就是2的N次冪,N為地址總線長度,因此這個內存地址也就構成了計算機的內存地址空間,即所有可讀寫的存儲器單元必須在這其中,否則就無法為CPU所定位檢索。一般的架構是這樣的:

這里0x9ffff是655539,0xbffff是786431,0xfffff是1048575,這樣認識的會更清楚些(感謝Python的計算機功能,果然方便)。主存儲器地址空間即內存,如果直接操作這個地址空間內的數(shù)據(jù),效果就是直接讀寫內存數(shù)據(jù);顯存地址空間指的的是顯存中的RAM部分。

逆向基礎之寄存器和內存

CPU中的主要結構是運算器、控制器與寄存器,這些器件通過CPU的內部總線相連,其中運算器負責信息處理,寄存器負責信息存儲,控制器控制各種器件進行工作,內部總線連接各種器件,在它們之間進行數(shù)據(jù)的傳送。對于匯編程序員來說,主要部件是寄存器,因為只有寄存器是我們可以編程直接操作的。不同的CPU架構不同,8086CPU共有14個寄存器,分別是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW,今天我們先來學習基礎的通用寄存器,其余的寄存器在用到時會給予說明。

一、通用寄存器

AX、BX、CX和DX是四個通用寄存器,通常用來存放一般性的數(shù)據(jù),后面的分析都在8086CPU中進行。每個通用寄存器是16位,即一次可以處理一個字(2個字節(jié))的數(shù)據(jù),但是為了與8086CPU之前的CPU相容,也支持一個字節(jié)的寄存器,即AH與AL,類似的還有BH和BL等,CPU操作時會降AH和AL當作獨立的寄存器,運算進位時會直接丟棄,因為CPU認為只有一個8位的寄存器而已:

二、物理地址

CPU訪問內存需要知曉存儲單元的地址,由于8086CPU地址總線為20位,但是寄存器卻只有16位,即一次處理的地址最多只有2的16次冪,遠小于2的20次冪。為了彌補這個問題,8086CPU采用了一種特殊的方式通過16位的寄存器來構造20位的訪問地址,簡單來說,即:段地址*16+偏移地址。從計算的位數(shù)上來說,段地址和偏移地址存儲在CPU寄存器中,都是16位的;段地址*16,即整體在右邊添加4個二進制位,成為了20位;20位與16位相加,得到了20位的實際內存地址。這里雖然是8086CPU中的方法,但是其實確實現(xiàn)在所有CPU中的實際尋址算法,即一個基地址加上一個偏移量得到一個實際地址。由此我們可以得到段的概念,內存本身不分段,但是由于CPU的特殊尋址方式,我們可以將內存看作最大64KB的一個個段(16位的最大值正好是64KB),因此我們可以在匯編中人為的指定段的起始和結束。當然,這里的段地址和偏移量實際上存儲在CPU的寄存器中,比如獲取指令的CS:IP,其中CS為代碼段寄存器,其中存儲代碼段的基地址,IP寄存器則存儲著當前要執(zhí)行的指令的指針,即一個偏移量,因此CS:IP指定了接下來CPU要執(zhí)行的指令的位置。這里需要說明的是,內存中的數(shù)據(jù)對于CPU來說都是二進制位,能夠區(qū)分數(shù)據(jù)和指令的唯一標準就是指令曾經或者正在被CS:IP指定;每執(zhí)行完一條指令,IP會累加上條指令的長度,從而指向下調指令。

我們是否可以修改控制CS:IP的值呢?答案是肯定的,只不過我們不能使用mov等傳送指令,而應當使用jmp這類轉移指令,基本的用法是:

-1. 修改CS:IP: jmp 2AE3:3 執(zhí)行后:CS=2AE3H, IP=0003H;

-2. 僅修改IP:jmp ax(ie. move ip, ax)即用寄存器中的值修改IP;

三、內存訪問

CPU訪問內存除了獲取指令,還要獲取數(shù)據(jù),那么數(shù)據(jù)部分如何定位的呢?同指令的CS:IP一樣,8086CPU使用DS:[。。。]來獲取內存數(shù)據(jù)地址,其中段寄存器存儲內存數(shù)據(jù)段的基地址,而[。。。]表示一個內存偏移量指向的內存單元,如[0]表示偏移量為0的內存單元,這里使用時要注意,8086CPU不支持直接對DS傳送值,因此mov ds, 1000H是非法的,正確地是通過寄存器來實現(xiàn),即:mov ax, 1000H; mov ds, ax;

這部分我們要學習基本的匯編指令,如mov、sub、add等,都可以操作寄存器,操作完之后將數(shù)據(jù)放入第一個參數(shù)表示的寄存器中。CPU中的內存數(shù)據(jù)一種特殊的結果就是棧,即只能從一端讀寫數(shù)據(jù)的結構,其基本指令是push ax;將寄存器ax的值入棧;和pop ax;從棧中取出棧頂元素放入寄存器ax中;下面是movaddsub命令的一個簡單示例:

然后我們來看看PUSH命令的執(zhí)行過程:

然后是POP命令:

可以看出,棧的操作關鍵是棧頂位置的確定,因此CPU專門使用SS:SP來獲取當前內存中棧頂?shù)奈恢谩V档靡惶岬氖?,CPU本身并沒有對棧的大小進行檢查,因此實際中會出現(xiàn)棧頂越界的問題(上限超出-PUSH;下限超出-POP),這也就要求我們必須人為進行檢查,否則就會出現(xiàn)程序的漏洞。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉