【匯編逆向系列】一、無參數的函數調用- RSP,EAX寄存器,全局變量,INT類型和MOV,INC,SHL指令

給出一段簡單的匯編

no_params_function:0000000000000000: 40 57              push        rdi0000000000000002: 8B 05 00 00 00 00  mov         eax,dword ptr [global_counter]0000000000000008: FF C0              inc         eax000000000000000A: 89 05 00 00 00 00  mov         dword ptr [global_counter],eax0000000000000010: 8B 05 00 00 00 00  mov         eax,dword ptr [global_counter]0000000000000016: D1 E0              shl         eax,10000000000000018: 5F                 pop         rdi0000000000000019: C3                 ret000000000000001A: CC                 int         3000000000000001B: CC                 int         3000000000000001C: CC                 int         3000000000000001D: CC                 int         3000000000000001E: CC                 int         3000000000000001F: CC                 int         3

匯編分析

1. ??寄存器保存與恢復??

可以看到有一個對應操作push rdi和pop rdi, 該操作是debug編譯特有的操作,release編譯則會優化掉。它的作用的保存rdi寄存器的值到該函數的棧頂,讓這個函數內部可以隨意使用rdi寄存器,而不會損壞函數外部的數據.

執行前: RSP = 0x7FFF0000
執行后: RSP = 0x7FFEFFF8
? ? ? ? [0x7FFEFFF8] = RDI原始值

這里出現了RSP寄存器

2. RSP寄存器

在Windows操作系統的x86-64架構中,??RSP寄存器(Register Stack Pointer)?? 是核心的棧指針寄存器,用于管理程序運行時的棧內存操作。RSP始終指向當前棧幀的頂部地址(即最新入棧數據的地址)。棧是一種“后進先出”(LIFO)的內存結構,用于存儲函數調用時的臨時數據(如局部變量、函數參數、返回地址等)。當數據壓棧(push)時,RSP值減小;數據出棧(pop)時,RSP值增大,確保棧空間的動態分配與釋放

3. 全局變量

? 0000000000000002: 8B 05 00 00 00 00 ?mov ? ? ? ? eax,dword ptr [global_counter]

匯編語句中用[]表示一個全局變量名,在鏈接階段會轉化成全局變量的地址

4. EAX寄存器

EAX(Extended Accumulator Register,擴展累加器寄存器)是x86/x86-64架構中的核心通用寄存器之一,主要用于算術運算、函數返回值存儲及系統調用交互。其核心特性與功能如下:

1.? ??算術運算的缺省寄存器

累加器角色??:加法(ADD)、乘法(MUL/IMUL)等指令默認使用EAX存儲操作數或結果

乘除法協作??:

  • 32位乘法時,結果的高32位存于??EDX??,低32位存于??EAX??;
  • 除法中,EAX存放被除數,結果商存于EAX,余數存于EDX

2. ??函數返回值與系統調用

在Windows/Linux系統調用及函數調用中,EAX通常存儲返回值(如API函數執行結果)

3. ??I/O操作端口尋址?

與??DX??寄存器配合,用于指定輸入/輸出設備的端口地址

這里使用到的是第二種用于存儲函數的返回值

5. INT整型變量

  • ??dword ptr??:指定 32 位操作(int 類型)
  • ??00 00 00 00??:地址占位符(鏈接時填充實際地址)

DWORD PTR 指定了32位操作,即一個整型

6. MOV語句

mov語句mov ? ? ? ? eax,dword ptr [global_counter]

即將[global_counter]地址內的取出一個32位值,存放進eax寄存器

7. INC和SHL語句

inc為加1指令,shl為左移指令相當于乘法

8. 二次加載

? 000000000000000A: 89 05 00 00 00 00 ?mov ? ? ? ? dword ptr [global_counter],eax
? 0000000000000010: 8B 05 00 00 00 00 ?mov ? ? ? ? eax,dword ptr [global_counter]

在匯編中INC和SHL計算中,有一個二次加載的動作,將eax和[global_counter]進行了交換。主要原因是debug模式下的特性,在release當中會被優化掉

  1. 確保內存可見性(多線程場景)
  2. 避免寄存器優化(方便調試)
  3. 內存訪問斷點支持

9. RET語句

跳出函數

10. 調試特征

  • 末尾的?int 3CC)指令是調試斷點,用于填充函數對齊(Debug 模式常見)
  • Release 模式會優化掉冗余的寄存器保存和二次內存訪問。

等價轉化

通過如上分析將匯編主要做的操作注釋如下

no_params_function:0000000000000000: 40 57              push        rdi         ; 保存 RDI 寄存器0000000000000002: 8B 05 00 00 00 00  mov         eax, dword ptr [global_counter]  ; 加載全局變量0000000000000008: FF C0              inc         eax         ; eax 值加 1000000000000000A: 89 05 00 00 00 00  mov         dword ptr [global_counter], eax  ; 存回全局變量0000000000000010: 8B 05 00 00 00 00  mov         eax, dword ptr [global_counter]  ; 重新加載全局變量0000000000000016: D1 E0              shl         eax, 1      ; eax 左移 1 位(相當于乘 2)0000000000000018: 5F                 pop         rdi         ; 恢復 RDI 寄存器0000000000000019: C3                 ret                    ; 返回(返回值在 eax 中)

轉化成C語言:

int no_params_function(void){global_counter = global_counter + 1;return global_counter * 2;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82647.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

知識蒸餾:從模型輸出到深層理解

1. 概念闡釋: 還記得上次說的“老師教你畫畫,不只教‘貓’,還教‘像狗像樹葉’的細微感覺”嗎?那是最初的蒸餾。 后來大家發現,老師不僅僅通過“最后畫出來像什么”來教你。 有時候,老師是教你“他畫畫時,哪里用了力氣,哪里畫得特別認真”(這叫基于特征的蒸餾,學習…

vue-18(使用 Vuex 插件實現高級功能)

使用 Vuex 插件實現高級功能 Vuex 插件提供了一種強大的方式來擴展 Vuex 存儲的功能。它們為存儲的變更過程提供了鉤子,允許你攔截變更、執行副作用以及添加自定義邏輯。本章將探討如何利用 Vuex 插件實現持久化、日志記錄和時間旅行調試等高級功能。我們將深入研究…

【Java】CopyOnWriteArrayList

一,概述 CopyOnWriteArrayList作為List接口的實現之一,它區分于ArrayList在于它是線程安全的。如它名字一樣,所有的寫操作均復制了原數組的值,雖說代價較大,但讀多寫少的環境下,是可接受的。筆者在此簡單看…

【高等數學】函數項級數

目錄 函數項級數收斂域的定義收斂域的判定方法常見冪級數展開(麥克勞林級數)冪級數的應用 傅里葉級數傅里葉級數的基本概念傅里葉級數的主要性質奇偶函數的簡化周期延拓奇延拓偶延拓 函數項級數 函數項級數是指由一系列函數構成的無窮級數,形…

基于cornerstone3D的dicom影像瀏覽器 第二十八章 LabelTool文字標記,L標記,R標記及標記樣式設置

文章目錄 前言一、L標記、R標記二、修改工具樣式1. 樣式的四種級別2. 導入annotation3. 示例1 - 修改toolGroup中的樣式4. 示例2 - 修改viewport中的樣式 三、可配置樣式 前言 cornerstone3D 中的文字標記工具LabelTool,在添加文字標記時會彈出對話框讓用戶輸入文字…

PPT轉圖片拼貼工具 v4.3

軟件介紹 這個軟件就是將PPT文件轉換為圖片并且拼接起來。 效果展示 支持導入文件和支持導入文件夾,也支持手動輸入文件/文件夾路徑 軟件界面 這一次提供了源碼和開箱即用版本,exe就是直接用就可以了。 軟件源碼 import os import re import sys …

新版NANO下載燒錄過程

一、序言 搭建 Jetson 系列產品燒錄系統的環境需要在電腦主機上安裝 Ubuntu 系統。此處使用 18.04 LTS。 二、環境搭建 1、安裝庫 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建環境的過程需要這個應用庫來將某些 NVIDIA 軟件組件安裝到 Je…

神經網絡-Day45

目錄 一、tensorboard的基本操作1.1 發展歷史1.2 tensorboard的原理 二、tensorboard實戰2.1 cifar-10 MLP實戰2.2 cifar-10 CNN實戰 在神經網絡訓練中,為了幫助理解,借用了很多的組件,比如訓練進度條、可視化的loss下降曲線、權重分布圖&…

設計模式之單例模式(二): 心得體會

設計模式之單例模式(一)-CSDN博客 目錄 1.背景 2.分析 2.1.違背面向對象設計原則,導致職責混亂 2.2.全局狀態泛濫,引發依賴與耦合災難 2.3.多線程場景下風險放大,性能與穩定性受損 2.4.測試與維護難度指數級上升 2.5.違背 “最小知識原…

windows10 php報錯

參考這個, 實際解決了問題, 主要是repair c 然后重啟 【BUG】PHP Warning: ‘C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll‘ 14.0 is not compatible with this PHP bu_php warning: vcruntime140.dll 14.0 is not compat-CSDN博客

GPU顯存的作用和如何選擇

核心定義與作用 首先,顯存的全稱是顯示內存,英文是Video RAM或VRAM,是顯卡上的專用內存。 顯存的主要作用是用來存儲圖形處理單元(GPU)需要處理的數據,比如紋理、頂點數據、幀緩沖區等。 數據中轉站 GPU…

從零開始:用Tkinter打造你的第一個Python桌面應用

目錄 一、界面搭建:像搭積木一樣組合控件 二、菜單系統:給應用裝上“控制中樞” 三、事件驅動:讓界面“活”起來 四、進階技巧:打造專業級體驗 五、部署發布:讓作品觸手可及 六、學習路徑建議 在Python生態中,Tkinter就像一把瑞士軍刀,它沒有花哨的特效,卻能快速…

Unity基礎-Mathf相關

Unity基礎-Mathf相關 一、Mathf數學工具 概述 Mathf是Unity中封裝好用于數學計算的工具結構體,提供了豐富的數學計算方法,特別適用于游戲開發場景。它是Unity開發中最常用的數學工具之一,能夠幫助我們處理各種數學計算和插值運算。 Mathf…

Android Studio 之基礎代碼解析

1、 onCreate 在 Android 開發中,MainActivity 作為應用的入口 Activity,其 onCreate() 方法是生命周期中第一個且最重要的回調方法,負責初始化核心組件和界面。以下是其核心要點: 一、基本定義與作用 調用時機 當 Activity 首次…

AIGC圖像去噪:核心原理、算法實現與深度學習模型詳解

1. 背景概述 1.1 目標與范疇 在AIGC(人工智能生成內容) 的技術生態系統中,圖像生成模型(如生成對抗網絡GAN、擴散模型Diffusion Model)所產出的視覺內容,其質量常因訓練數據中的固有瑕疵、生成過程中的隨機擾動或數據傳輸期間的信號衰減而呈現出不同程度的退化。因此,…

電路圖識圖基礎知識-自耦變壓器降壓啟動電動機控制電路(十六)

自耦變壓器降壓啟動電動機控制電路 自耦變壓器降壓啟動電動機控制電路是將自耦變壓器的原邊繞組接于電源側,副邊繞組接 于電機側。電動機定子繞組啟動時的電壓為自耦變壓器降壓后得到的電壓,這樣可以減少電動 機的啟動電流和啟動力矩,當電動…

Life:Internship finding

1. 前言 fishwheel writes this Blog to 記錄自分自身在研二下找實習的經歷。When 寫這篇 Blog 的時候我的最后一搏也掛掉了,只能啟用保底方案了。When I 打開我的郵箱時,發現里面有 nearly 100 多封與之相關的郵件,頓時感到有些心涼&#x…

Redis 常用數據類型和命令使用

目錄 1 string 2 hash 3 list 4 set集合 5 zset有序集合 1 string 值可以是字符串、數字和二進制的value&#xff0c;值最大不能超過512MB 應用場景&#xff1a; 應用程序緩存 計數器 web共享session 限速 1.1 設置單個鍵值 set <key> value [EX seconds|PX…

Spring Boot緩存組件Ehcache、Caffeine、Redis、Hazelcast

一、Spring Boot緩存架構核心 Spring Boot通過spring-boot-starter-cache提供統一的緩存抽象層&#xff1a; #mermaid-svg-PW9nciqD2RyVrZcZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PW9nciqD2RyVrZcZ .erro…

【photoshop】專色濃度和專色密度

1.1 專色濃度 是圖層填充到專色前&#xff0c;設置的前景色CMYK的K值。填充到專色后&#xff0c;可以查看到專色中圖層的k值。 ps前景色填充快捷鍵 1.Windows 系統&#xff1a;Alt Delete&#xff1b;2.Mac 系統&#xff1a;Option Delete。 1.2專色密度 專色的屬性&…