arm64入棧出棧 棧 ARM64

2021-10-13 13:25:46 字數 1027 閱讀 9874

棧:是一種具有特殊的訪問方式的儲存空間(後進先出, last in out firt,lifo)

sp和fp暫存器

sp暫存器在任意時刻會儲存我們棧頂的位址.

fp暫存器也稱為x29暫存器屬於通用暫存器,但是在某些時刻我們利用它儲存棧底的位址!()

注意:arm64開始,取消32位的 ldm,stm,push,pop指令! 取而代之的是ldr\ldp str\stp

arm64裡面 對棧的操作是16位元組對齊的!!

關於記憶體讀寫指令

注意:讀/寫 資料是都是往高位址讀/寫

str(store register)指令

將資料從暫存器中讀出來,存到記憶體中.

ldr(load register)指令

將資料從記憶體中讀出來,存到暫存器中

此ldr 和 str 的變種ldp 和 stp 還可以操作2個暫存器.

堆疊操作練習

使用32個位元組空間作為這段程式的棧空間,然後利用棧將x0和x1的值進行交換.

sub sp, sp, #0x20 ;拉伸棧空間32個位元組

stp x0, x1, [sp, #0x10] ;sp往上加16個位元組,存放x0 和 x1

ldp x1, x0, [sp, #0x10] ;將sp偏移16個位元組的值取出來,放入x1 和 x0

bl和ret指令

bl標號

轉到標號處執行指令

ret預設使用lr(x30)暫存器的值,通過底層指令提示cpu此處作為下條指令位址!

arm64平台的特色指令,它面向硬體做了優化處理的

x30暫存器

x30暫存器存放的是函式的返回位址.當ret指令執行時刻,會尋找x30暫存器儲存的位址值!

注意:在函式巢狀呼叫的時候.需要講x30入棧!

函式的引數和返回值

arm64下,函式的引數是存放在x0到x7(w0到w7)這8個暫存器裡面的.如果超過8個引數,就會入棧.

函式的返回值是放在x0 暫存器裡面的.

函式的區域性變數

函式的區域性變數放在棧裡面!

ARM64除錯環境

自從上一次zctf做了一道arm64的逆向題目後,我決定記錄下利用qemu搭建arm64的環境的過程,以後肯定會遇到更多arm平台下的reverse和pwn。我要模擬的是64位的arm環境,所以需要使用的是qemu system aarch64。在kali下,使用apt get install qe...

arm64 頁表對映

armv8最多支援48根位址,4級頁表,這樣最多支援user space和kernnel space 分別是256tb 其中user space佔據低端位址 kernel可以支援48 42 39 根位址 config arm64 va bits 39 is not set config arm64 ...

Arm64彙編 BFXIL指令

下屬專案 測試用例數量 問題背景無0 解決方法無1 總結無0復現一套加密演算法時,遇到了bfxil指令。ida中顯示情況如下 bfxil w9,w16,2 2 ida使用fn f5操作得到偽 如下 v4 v4 v8 0xfc 2 3 其中v4就是w9,v8 0xfc 這個整體就是w16,定義如下 u...