您好,登錄后才能下訂單哦!
我們在Windows 10上開始python逆向之旅,首先開始搭建開發環境,python解釋器使用最新的3.6.1,IDE使用PyCharm社區版2017.1.3,下載地址如下所示,下載完成后直接雙擊安裝包安裝即可,隨后設置PyCharm的Project Interpreter為剛才安裝的Python解釋器就可以了。
【Python】https://www.python.org/downloads/
【PyCharm】http://www.jetbrains.com/pycharm/download/#section=windows
首先介紹一下ctypes,它是一個用于Python的外部函數庫,提供了與C語言兼容的數據類型,允許調用動態鏈接庫或共享庫中的函數,還可以包裝這些庫。下面是ctypes中的數據類型與C語言、Python中的數據類型的對應關系。
ctypes中的數據類型全部通過class來實現,在Python中加載C庫涉及如下幾個類。
加載C庫更簡單的方法是使用如下幾個預先創建的類實例。
ctypes.cdll ctypes.oledll ctypes.windll ctypes.pydll ctypes.pythonapi
上面提到了函數調用慣例cdecl和stdcall,cdecl的意思是函數的參數從右往左依次壓入棧內,函數的調用者在函數執行完成之后負責函數的平衡,常用于X86架構的C語言里,返回值存儲在EAX寄存器中,從匯編代碼的角度來看,函數參數從右往左依次壓棧,然后調用函數,最后修改棧指針ESP為原來的位置。stdcall,參數傳遞的順序也是從右到左,不過棧的平衡處理由函數自己完成,而不是調用者,返回值同樣存儲在EAX中,也就是說,函數參數壓棧、函數調用之后沒有像cdecl一樣的棧指針ESP移動。
下面的例子在Python中調用C的printf函數,printf屬于“C:\Windows\System32\msvcrt.dll”,也就是Linux上的“libc.so”。
from ctypes import * msvcrt = cdll.msvcrt message = b"Hello World\n" msvcrt.printf(b"Message is %s", message)
上面的代碼輸出“Message is Hello World”。另外,ctypes還允許在Python中定義結構和聯合等其它高級功能,詳細介紹請參考https://docs.python.org/3.6/library/ctypes.html?highlight=ctypes#。
使用調試器,能夠對程序進行動態跟蹤和分析,特別是涉及到exploit、fuzzer和病毒分析的時候,動態分析程序的能力就顯得非常重要了。調試程序時,如果可以獲得源代碼,調試起來就容易一些,也就是透明的白盒測試,如果沒有源代碼,也就是黑盒測試,想要得到理想的結果,那就必須擁有高超的逆向技術和逆向工具的幫助。黑盒測試包括用戶模式與內核模式兩種情況,兩者有不同的權限。
CPU的寄存器能夠對少量的數據進行快速的存取訪問,在X86指令集里,一個CPU有八個通用寄存器:EAX、EDX、ECX、ESI、EDI、EBP、ESP和EBX,以及其它的寄存器,下面逐個介紹。
EAX:累加寄存器,除了用于存儲函數的返回值外也用于執行計算的操作,許多優化的X86指令集都專門設計了針對EAX寄存器的讀寫和計算指令。
EDX:數據寄存器,本質上是EAX寄存器的延伸,輔助EAX寄存器完成更多復雜的計算操作。
ECX:計數寄存器,用于循環操作,計算是向下而不是向上的,由大減到小。
ESI:Source Index,源操作數指針,存儲著輸入的數據流的位置,用于讀,高效地處理循環操作的數據。
EDI:Destination Index,目的操作數指針,存儲了計算結果存儲的位置,用于寫,高效地處理循環操作的數據。
ESP:Stack Pointer,棧指針,負責函數的調用和棧的操作,函數調用時壓棧參數和返回地址,指向棧頂即返回地址。
EBP:Base Pointer,基指針,負責函數的調用和棧的操作,函數調用時壓棧參數和返回地址,指向棧底。
EBX:唯一一個沒有特殊用途的寄存器,作為額外的數據存儲器。
EIP:Instruction Pointer,指令指針,總是指向馬上要執行的指令。
熟悉調試器的朋友們都知道斷點,斷點其實就是一個調試事件,其它事件如經典的段錯誤(Segment Fault)等。斷點包括軟件斷點、硬件斷點和內存斷點,用于暫停被執行程序。
軟件斷點:一個單字節的指令,將控制權轉移給調試器的斷點處理函數。匯編指令是CPU執行的指令的高級表示方法,如下面的匯編指令MOV EAX, EBX,告訴CPU把存儲在EBX寄存器里的東西放到EAX寄存器,然而CPU并不明白這個匯編指令,必須轉化為能夠讓CPU識別的操作碼8BC3,假設這一操作發生在地址0x44332211,為了在這個地址設置斷點,暫停CPU,需要從2個字節的操作碼8BC3中換出一個單字節的操作碼,這個單字節的操作碼也就是3號中斷指令,INT3,一條能讓CPU暫停的指令,對應的操作碼為0xCC,具體如下面的代碼片段所示。當調試器被告知在目標地址設置一個斷點時,它首先讀取目標地址的第一個字節的操作碼然后保存起來,同時把地址存儲在內部的中斷列表中,接著,調試器把3號中斷指令對應的操作碼0xCC寫到剛才的地址,當CPU執行到替換后的操作碼的時候,CPU暫停,并觸發一個INT3事件,此時調試器就能捕捉到這個事件,然后調試器通過EIP判斷這個中斷地址是否是我們設置的斷點,如果是,就把對應的操作碼寫回以恢復程序的正常運行。軟件斷點包括一次性斷點和持續性斷點,前者生效一次,后者一直生效,不生效后將其從中斷列表移除。需要注意的是,當我們改變了被調試程序的內存數據時,同時改變了運行時軟件的CRC即循環冗余代碼校驗和,CRC是一種校驗數據是否被改變的機制,廣泛應用于文件、內存、文本、網絡數據包等任何想監視數據的地方,它將一定范圍內的數據進行hash計算,然后將hash值同此前的hash值進行比較,判斷數據是否改變,為了在這種特殊的情況下也能調試程序,就要使用下面介紹的硬件斷點了。
地址: 操作碼 匯編指令 0x44332211: 8BC3 MOV EAX, EBX 0x44332211: CCC3 MOV EAX, EBX
硬件斷點:在小塊區域內設置斷點,屬于CPU級別,使用了DR0到DR7共八個特殊的調試寄存器,這些寄存器專門用于管理硬件斷點。DR0到DR3存儲硬件斷點地址,意味著同一時間內最多只能有4個硬件斷點,DR4和DR5保留,DR6是狀態寄存器,說明被斷點觸發的調試事件的類型,DR7是開關寄存器,同時也存儲了斷點的不同類型,包括指令執行時中斷、數據可以寫入時中斷、有數據讀或者寫但不執行時中斷。硬件斷點使用1號中斷指令INT1,負責硬件中斷和步進事件。硬件斷點的特點是同一時間只能設置四個斷點,而且斷點起作用的區域只有四個字節,如果想要跟蹤一大塊內存數據,請使用下面介紹的內存斷點。
內存斷點:用于大塊區域,不是真正的斷點,而是改變了內存中某個塊或者頁的權限。一個內存頁是操作系統處理的最小的內存單位,一個內存頁被申請成功后,就擁有了一個權限集,如可執行頁、可讀頁、可寫頁,這些決定了內存該如何被訪問,任何對保護頁的訪問都會引發異常,之后頁面恢復訪問前的狀態。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。