<em id="pzl9c"></em>
      <dl id="pzl9c"><ins id="pzl9c"></ins></dl>
      <dfn id="pzl9c"></dfn>

        <progress id="pzl9c"></progress>
        <div id="pzl9c"><ol id="pzl9c"></ol></div>
          <div id="pzl9c"><tr id="pzl9c"></tr></div>

          <em id="pzl9c"></em>

            <em id="pzl9c"><ins id="pzl9c"><mark id="pzl9c"></mark></ins></em>
            <dl id="pzl9c"></dl>

            <dl id="pzl9c"></dl>

              <div id="pzl9c"></div>
              <dl id="pzl9c"><ins id="pzl9c"></ins></dl>

              <dfn id="pzl9c"></dfn>
              <sup id="pzl9c"><ins id="pzl9c"></ins></sup>

                <dl id="pzl9c"></dl>

                飄云閣(PYG官方論壇)

                 找回密碼
                 加入論壇

                QQ登錄

                只需一步,快速開始

                掃一掃,訪問微社區

                查看: 222|回復: 2
                打印 上一主題 下一主題

                [Android] 【轉載】ARM匯編基礎教程:1.ARM匯編簡介

                [復制鏈接]
              1. TA的每日心情
                奮斗
                3 天前
              2. 簽到天數: 24 天

                [LV.4]偶爾看看III

                跳轉到指定樓層
                樓主
                發表于 2018-9-14 14:10:34 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
                本帖最后由 vvizz 于 2018-9-14 14:15 編輯

                vvizz:最近在學習Android逆向,看書的到了ARM匯編,一頭霧水。。。和X86不太一樣,是自己的思維固化了,導致理解不了,所以來看看ARM匯編的基本語法。百度一搜就找到了看雪大神的一篇翻譯,津津有味~~(填鴨式學習,哈哈)  美中不足,后邊的幾篇沒有翻譯,可能是大神后邊比較忙。沒辦法,我只好去Azeria Labs官網看了后續的幾章,為了節省大家時間,后續我會用笨拙的直譯對后邊的幾篇進行翻譯,錯誤之處還希望大家指正諒解。

                vvizz:在此,感謝Nisy校長的邀請注冊,非常感謝!


                ;=========================================================================


                看雪翻譯鏈接:https://bbs.pediy.com/thread-220461.htm
                原文鏈接:https://azeria-labs.com/writing-arm-assembly-part-1/
                翻譯:ljcnaix



                歡迎來到系列文章《ARM匯編基礎教程》。這個系列是為后續的《ARM漏洞利用教程》(連載中)打基礎而編寫的。在我們深入用ARM匯編編寫shellcode和構造ROP鏈之前,我們需要先掌握一些ARM匯編的基礎知識。
                我們會一步一步覆蓋如下主題:


                第一篇: ARM匯編簡介
                第二篇: 數據類型和寄存器
                第三篇: ARM指令集
                第四篇: 內存讀寫
                第五篇: 高級內存讀寫
                第六篇: 條件分支
                第七篇: 棧和函數

                    為了執行本文后續的示例,你需要搭建一個學習ARM匯編的實驗環境。如果你沒有一臺ARM設備(比如樹莓派),你可以根據這個教程(https://azeria-labs.com/emulate-raspberry-pi-with-qemu/)使用QEMU模擬器創建一臺虛擬設備來配置你的實驗環境。如果你缺乏使用GDB調試程序的基礎知識,你可以在這片教程中學習(https://azeria-labs.com/debugging-with-gdb-introduction/)。在本系列教程中,我們將關注ARM 32-bit,所有的例子將按照ARMv6指令集編譯。

                為什么介紹ARM?
                    這篇教程是為有興趣學習基礎的ARM匯編知識的人而寫的。尤其是那些想在ARM平臺編寫漏洞利用的人。你可能已經發現ARM處理器在你的生活中無處不在。當我環顧我的身邊,我發現我身邊的大多數設備使用著ARM處理器而不是intel。這些設備包括我的手機、路由器以及最近銷售火爆的IoT設備。可以說,ARM處理器已經成為了當世最廣泛使用的CPU核心。隨之而來的是和PC時代類似的問題,ARM設備也易于受到緩沖區溢出之類的攻擊。由于被廣泛的使用和潛在的脆弱性,針對這些設備的攻擊將變得越來越常見。
                    目前在二進制安全領域,比起ARM平臺,我們對x86/x64平臺有深入的多的研究,即使ARM匯編可能是主流CPU指令集中最易學的。那么,為什么沒有更多的人來關注ARM,研究ARM呢?可能因為漏洞利用的學習資料,大多數是針對Intel平臺的,而很少針對ARM平臺的。比如著名的由Corelan Team編寫的Intel x86漏洞利用教程(https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-1-stack-based-overflows/),幫助了很多對二進制漏洞利用感興趣的人,通過學習和實踐這個教程包含的知識,進入這個領域。如果你對x86平臺的漏洞利用感興趣,Corelan Team的教程是非常好的起點。在這篇教程中,我們將關注ARM匯編的基礎知識以及如何在ARM平臺下編寫漏洞利用。

                ARM處理器和Intel處理器
                    ARM處理器和Intel處理器之間有很多的差異,其中最大的不同點就是它們的指令集。Intel是一個CISC(Complex Instruction Set Computing,復雜指令集)處理器。因此它具有更龐大,功能更豐富的指令集,并且允許指令進行一些復雜的訪存操作。它也因此具有支持更多的復雜操作和尋址方式,并且寄存器的數量比ARM要少的多。CISC處理器一般用在通用PC,工作站和服務器中。
                    ARM是一個RISC(Reduced Instruction Set Computing,精簡指令集)處理器。因此它擁有一套精簡的指令集(100個左右,甚至更少的指令)以及比CISC處理器更多的通用寄存器。與Intel處理器不同,ARM指令只處理寄存器中的數據,并使用了load/store結構訪問存儲器,也就是說只有load/store指令可以訪問存儲器。所以如果我們要增加某個內存地址中保存的值,至少需要三種類型的指令(load指令、加法指令和store指令),首先我們需要使用load指令將指定地址內存中的值加載到寄存器中,然后使用加法指令增加寄存器中的值,然后用store指令將寄存器中的值寫回內存。
                    硬幣有兩面,精簡指令集也有它的優勢和劣勢。其中一個重要的優勢是指令可以被更快的執行(RISC處理器通過引入流水線機制,減少每個指令的占用的CPU的時鐘周期來縮短執行時間)。它的劣勢也很明顯,較少的指令增加了軟件(事實上是編譯器)的復雜性。另一個重要的事實是,ARM具有兩種運行模式(可以類比x86的實模式和保護模式),ARM模式和Thumb模式。Thumb指令可以是2或4個字節的(更多的細節將在第三篇:ARM指令集中介紹)。
                ARM和x86/x64之間更多的區別還包括:
                        ·          ARM中大多數指令可以用于分支跳轉的條件判斷。
                        ·          Intelx86/x64系列CPU是小端序的。
                        ·          ARM架構在ARMv3之前是小端序的,在那之后,ARM處理器提供一個配置項,可以通過配置在大端和小端之間切換。
                    事實上,不僅ARM平臺和Intel平臺之間存在差異,ARM平臺內部的不同版本之間也存在很多差別。我們努力讓本系列教程盡可能通用,讓你能對ARM平臺有一個全面的了解。當你掌握了ARM基礎之后,再去針對某個特定版本學習就輕松了。本教程的示例是在32 bit ARMv6(樹莓派1代)上創建的,因此示例相關的講解是針對這個版本的。
                    我們剛才談到了ARM指令集有不同的版本,這可能使你感到困惑,我們用下表簡單的表示ARM指令集版本和處理器版本之間的映射關系:
                ARM 處理器家族
                ARM指令集架構
                ARM7
                ARM v4
                ARM9
                ARM v5
                ARM11
                ARM v6
                Cortex-A
                ARM v7-A
                Cortex-R
                ARM v7-R
                Cortex-M
                ARM v7-M



                編寫ARM匯編
                    在我們深入學習編寫ARM平臺漏洞利用之前,我們需要理解使用ARM匯編編寫程序的基本方法。為什么我們要使用ARM匯編來編程呢,我們不是有很多高級語言和腳本語言嗎?如果你想對ARM程序進行逆向工程從而了解程序的執行流程,或者構建ROP鏈來實現你自己的ARM shellcode,亦或者調試ARM程序,你都需要ARM匯編的知識作為基礎。
                    為了從事ARM平臺的逆向工程和漏洞利用開發,你不需要知道ARM匯編語言的所有細節,但你要對相關的主干知識有一個把握。本系列教程將介紹必要的基礎知識,如果你想了解更多,你可以訪問本章末尾列出的鏈接。
                    說了那么多,那么匯編語言到底是什么呢?匯編語言只是機器代碼之上的一個簡單語法層,它由映射了二進制機器碼的助記符組成。二進制機器碼是CPU所能理解的指令。那么為什么我們不直接寫機器碼呢?我只能說,那會很蛋疼(原文為that would be a pain in the ass,終于知道蛋疼怎么說了,新技能get)。因此我們會使用匯編語言,這對于人類來說更易于理解。當然,我們的計算機本身不能運行匯編代碼,它需要機器碼。我們將使用GNU Binutils工具集中的匯編器as將匯編代碼轉換為對應的機器碼,as會讀取后綴為“.s”的匯編源代碼文件,然后輸出匯編后的二進制目標文件。
                    最終的過程是這樣的,當你編寫了后綴為“.s”的匯編文件,你可以使用as將它匯編,最后使用ld鏈接,如下所示:
                   
                [Bash shell] 純文本查看 復制代碼
                $ as program.s –o program.o
                    $ ld program.o –o program


                深入匯編語言
                    這一節,讓我們從最底層開始,自底向上,看看匯編語言是如何工作的。在計算機系統的最底層,是密布的傳輸著電信號的電路。信號是通過控制電壓,在兩個電平之間切換形成的,例如0伏(低電平代表關信號)和5伏(高電平代表開信號)。對于硬件系統,電路中電壓的具體數值是沒有意義的,所以我們用抽象的數字0和1來表示電路的開/關電平。有意思的是,0和1不僅代表了電信號,也構成了一個二進制系統。在這個基礎上,我們將電信號序列(01序列)分組,每一組序列就是一個機器碼指令。下面是機組機器碼指令的示意(并非實際的機器碼):
                [AppleScript] 純文本查看 復制代碼
                1110 0001 1010 0000 0010 0000 0000 0001
                    到目前為止一切都很順利,但是我們馬上就會迎來第一個困難,機器碼序列難以記憶。為了解決這個問題,我們引入了助記符,它是我們賦予機器碼指令的一個簡短名稱,一般由2~4個字符組成(這不是強制性的,有少數助記符可能有更長的長度)。我們可以使用這些助記符帶上符合該助記符語法規則的操作數構成匯編指令來編寫程序代碼。這種程序代碼稱為匯編程序代碼。用于表示機器代碼的助記符及其附帶操作數的規則構成的集合(也就是匯編指令的集合)被稱為計算機的匯編語言。因此,匯編語言是人類編寫程序所使用的最低級別語言。下面是一個例子:
                [AppleScript] 純文本查看 復制代碼
                MOV R2, R1
                    我們現在已經知道了匯編程序代碼是由許多匯編指令組成的文本信息,所以我們需要把它轉化為對應的機器代碼。根據上文,對于ARM匯編,GNU Binutils項目為我們提供了一個名為as的工具來完成這個轉換。使用匯編器如as將ARM匯編程序代碼轉換成ARM機器碼的過程稱為匯編。總結一下就是我們知道計算機可以讀取并理解電信號序列,而我們可以用0和1來表示這種序列并告知計算機(這就是機器碼)。我們可以使用機器碼,令計算機以一些確定的方式做出響應,所以我們可以對計算機進行編程。但這些機器碼序列難以記憶,所以我們給它們命名從而引入了助記符,并用它來表示指令。這些助記符和對應的操作數語法就構成了匯編語言,我們使用一個匯編器將匯編程序代碼轉換為機器碼。這個過程和編譯器將高級語言轉換為匯編代碼是類似的。

                拓展閱讀
                1.      Whirlwind Tour of ARM Assembly. https://www.coranac.com/tonc/text/asm.htm
                2.      ARM assembler in Rasberry Pi. http://thinkingeek.com/arm-assembler-raspberry-pi/
                3.      Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation by Bruce Dang, Alexandre Gazet, Elias Bachaalany and Sebastien Josse.
                4.      ARM Reference Manual. http://infocenter.arm.com/help/topic/com.arm.doc.dui0068b/index.html
                5.      Assember User Guide. http://www.keil.com/support/man/docs/armasm/default.htm



                ;=========================================================================


                vvizz:補充了幾個鏈接,如果有什么問題,可以留言交流。



                評分

                參與人數 1威望 +4 飄云幣 +6 收起 理由
                tree_fly + 4 + 6 PYG有你更精彩!

                查看全部評分

                分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友 微信微信
                收藏收藏6 轉播轉播 分享分享 分享淘帖 頂 踩 友情贊助 微信分享
              3. TA的每日心情
                奮斗
                2018-9-16 12:19
              4. 簽到天數: 3 天

                [LV.2]偶爾看看I

                藤椅
                發表于 2018-9-15 11:49:16 | 只看該作者
                        PYG有你更精彩!
                回復 支持 反對

                使用道具 舉報

                您需要登錄后才可以回帖 登錄 | 加入論壇

                本版積分規則

                關閉

                站長推薦上一條 /1 下一條

                快速回復 返回頂部 返回列表
                11选5中奖报道