匯編學習之《指針寄存器大小端學習》

什么是指針寄存器?

操作棧的寄存器

棧: 保存函數里面傳遞的參數,局部變量等。

EBP: 指向棧底的指針

ESP: 指向棧頂的指針。

計算入棧地址變化規則

通過OllDbg查看

有可能點擊安裝的時候棧區域第一次查看會沒有顯示上面的標題區域,可以通過右鍵點擊棧區域

選擇Appearanzhix選擇show bar 就有了,其他幾個區域一樣的。

現在我們嘗試通過F8執行一次push 命令來看棧頂指針寄存器的地址和數據變化。

首先我們需要通過F8執行讓CPU執行到push 命令處停下來,并記錄相關信息。 比如我這里。

(如果要和我一樣,先修改EAX 累加寄存器的值為 00000022,修改指令為push EAX,棧頂寄存器值可能不一樣。其實也沒必要,大家可以看自己的數據,按照下面的規則算就可以了)

執行推送前信息:

當前CUP位置是待執行的push 指令 :? push EAX;? 推送累加寄存器的值到棧頂。

當前 EAX 的值是:?00000022

當前ESP棧頂的地址是:??0199F7D4

當前ESP棧頂地址的對應的值是: 15F58E65

執行推送后,我們期望的信息:

當前 EAX 的值是:?00000022? 不變

當前ESP棧頂的地址是:??0199F7D0

當前ESP棧頂地址的對應的值是: 00000022

備注: 這里要說明下,為啥棧頂地址從0199F7D4變成了0199F7D0,這個是因為棧頂插入了4個字節,所以內存地址向高位偏移了4個字節。

我們嘗試執行下,看看數據是否是我們預期的。

最終確認,以上數據符合預期

練習題

我們上章節學習了 16位寄存器, 高八位寄存器,低八位寄存器。假如我們的指令是

push ax指令,那么數據又會怎么變化呢?? 這里我們嘗試一次。

先修改下數據,EAX 寄存器的值修改位 00001100

按F8執行語句,查看EAX的值,可以看到已經改變。

修改當前CPU執行位置的命令是: push ax

現在我們開始記錄執行后續命令前的數據:

當前CUP位置是待執行的push 指令 :? push ax;? 推送累加寄存器的值到棧頂。

當前 EAX 的值是:00001100

當前ESP棧頂的地址是:??0199FA78

當前ESP棧頂地址的對應的值是: 76987BA9

執行推送后,我們期望的信息:

當前 EAX 的值是:?00001100 不變

當前ESP棧頂的地址是:?0199FA76

當前ESP棧頂地址的對應的值是:7BA91100

F8執行語句后查看數據

執行后的結果:

當前 EAX 的值是:?00001100 不變

當前ESP棧頂的地址是:?0199FA76

當前ESP棧頂地址的對應的值是:7BA91100

以上為啥結果我會標記為紅色?

其實在這結果運行之前,我的預期運行結果是

當前 EAX 的值是:?00001100 不變

當前ESP棧頂的地址是:?0199FA76

當前ESP棧頂地址的對應的值是:76981100

為啥會犯這樣的錯誤?

先說結果我忽略了數據是小端數據存儲的。x86 架構采用小端字節序所以,其實我們通過OllDbg看到的數據并不是真實的內存展示的數據,也不是想當然的直接替換后面兩個字節的數據。

當然如果你對這以上沒有疑問,完全可以跳過后面的章節。接下來我會詳細描述下大小端的概念,以及為啥運行 push ax 后ESP棧頂的值是7BA91100,而不是76981100。

大端和小端?

比如有一個數據: 0x76 98 7B A9

在解釋大端和小端之前,我先說幾個概念。

低位字節,高位字節概念:

比如數據??0x76 98 7B A9

0x76 就是最高位字節,? 0xA9就是最低位字節。

高位字節 ---------------------------低位字節

0x76? ? ? ? ?0x98? ? ? ? ? ?0x7B? ? ? ? ? 0xA9

為了幫忙你記住,你就按照家里你的兄弟排位來,第一個生的就是老大,排位最高,后面依次老二,老三。

低地址,高地址概念:

就是內存地址序,比如運行指令之前ESP棧頂0x0199FA78

連續四個字節那么它們的地址就依次是

低地址---------------------------------------------------------高地址

0x0199FA78,0x0199FA79,0x0199FA7A,0x0199FA7B

以上概念清楚后,我們就來說說大端和小端的內存數據是如何存儲的。

大端:高位字節數據存入低地址,低位字節數據存入高地址。

小端:低位字節數據存入低地址,高位字節數據存入高地址。

基于X86架構平臺都是小端,無論是win,linux 還是其他系統。 有的設備平臺可能是大端。另外就是網絡通信中,基于TCP/IP標準,網絡字節序就是大端的。

有了上面概念后,就可以接受為什么我們執行push ax后結果為啥是7BA91100。

執行命令前,我們看看當時數據在內存中是怎么樣的。

執行命令 push ax; 將數據1100寫入ESP棧頂, ax 是十六進制,所以需要在0x0199FA78進制向左移動兩個字節。變成從0x0199FA76開始

以上就是內存存儲情況,將上面內存中的數據?OllDbg展示的數據就是 0x7BA91100。

如果有問題歡迎大家指出來,有疑問也可以一起討論。

上一篇:匯編學習之《數據寄存器》

下一篇:匯編學習之《變址寄存器》

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

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

相關文章

Oracle數據庫數據編程SQL<3.7 PL/SQL 觸發器(Trigger)>

觸發器是Oracle數據庫中的一種特殊存儲過程,它會在特定數據庫事件發生時自動執行。觸發器通常用于實現復雜的業務規則、數據驗證、審計跟蹤等功能。 目錄 一、觸發器基本概念 1. 觸發器特點 2. 觸發器組成要素 二、觸發器類型 1. DML觸發器 2. DDL觸發器 3.…

2025年滲透測試面試題總結-某 攜程旅游-基礎安全工程師(題目+回答)

網絡安全領域各種資源,學習文檔,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具,歡迎關注。 目錄 攜程旅游-基礎安全工程師 反序列化原理 核心原理 擴展分析 SQL注入本質 核心原理 擴展分析 SQL注…

CSS 邊框(Border)樣式詳解

CSS 邊框(Border)樣式詳解 CSS 提供了多種邊框樣式,使我們能夠控制元素的外觀。本文將詳細介紹 CSS 邊框的各種屬性及應用示例。 1. 基本邊框屬性 CSS 主要使用 border 相關屬性定義邊框,基本語法如下: border: [邊…

SpringCould微服務架構之Docker(6)

容器的基本命令: 1. docker exec :進入容器執行命令 2. docker logs: -f 持續查看容器的運行日志 3. docker ps:查看所有運行的容器和狀態 案例:創建運行一個容Nginx容器 docker run--name myNginx -p 80:80 -d nginx 命…

unity3d端監聽 uri scheme

一、消息監聽 1.創建一個腳本命名為 “URISchemeListener” ,用于接收URI消息(代碼如下)。 using System; using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.UI;public class URISchemeListener : MonoBehavio…

網絡信息安全應急演練方案

信息安全應急演練方案 總則 (一)編制目的 旨在建立并完善應對病毒入侵、Webshell 攻擊以及未授權訪問等信息安全突發事件的應急機制,提升組織對這類事件的快速響應、協同處理和恢復能力,最大程度降低事件對業務運營、數據安全和…

電商場景下高穩定性數據接口的選型與實踐

在電商系統開發中,API接口需要應對高并發請求、動態數據更新和復雜業務場景。我將重點解析電商場景對數據接口的特殊需求及選型方案。 一、電商API必備的四大核心能力 千萬級商品數據實時同步 支持SKU基礎信息/價格/庫存多維度更新每日增量數據抓取與歷史版本對比…

Android R adb remount 調用流程

目的:調查adb remount 與adb shell進去后執行remount的差異 調試方法:添加log編譯adbd,替換system\apex\com.android.adbd\bin\adbd 一、調查adb remount實現 關鍵代碼:system\core\adb\daemon\services.cpp unique_fd daemon_service_to…

多模態大語言模型arxiv論文略讀(二)

Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representation Space ?? 論文標題:Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representat…

【運維】負載均衡

老規矩,先占坑,后續更新。 開頭先理解一下所謂的“均衡”,不能狹義地理解為分配給所有實際服務器一樣多的工作量,因為多臺服務器的承載能力各不相同,這可能體現在硬件配置、網絡帶寬的差異,也可能因為某臺…

大型語言模型Claude的“思維模式”最近被公開解剖

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

Ubuntu環境安裝

1. 安裝gcc、g和make sudo apt update sudo apt install build-essential 2. 安裝cmake ubuntu安裝cmake的三種方法(超方便!)-CSDN博客 3. 安裝ssh sudo apt-get install libssl-dev

【力扣hot100題】(028)刪除鏈表的倒數第N個節點

鏈表題還是太簡單了。 怕越界所以先定義了一個頭結點的頭結點,然后定義快慢指針,快指針先走n步,隨后一起走,直到快指針走到頭,刪除慢指針后一個節點即可。 /*** Definition for singly-linked list.* struct ListNod…

C/C++回調函數實現與std::function和std::bind介紹

1 概述 回調函數是一種編程模式,指的是將一個函數作為參數傳遞給另一個函數,并在某個特定事件發生時或滿足某些條件時由該函數調用。這種機制允許你定義在特定事件發生時應執行的代碼,從而實現更靈活和模塊化的程序設計。 2 傳統C/C回調實現…

【藍橋杯】單片機設計與開發,速成備賽

一、LED模塊開看,到大模板 二、刷第零講題目(直接復制模板) 三、空降芯片模板直接調用部分(聽完再敲代碼) 四、第十三講開刷省賽題(開始自己背敲模板) 五、考前串講刷一遍 b連接&#xff1…

Java 基礎-28- 多態 — 多態下的類型轉換問題

在 Java 中,多態(Polymorphism)是面向對象編程的核心概念之一。多態允許不同類型的對象通過相同的方法接口進行操作,而實際調用的行為取決于對象的實際類型。雖然多態提供了極大的靈活性,但在多態的使用過程中&#xf…

Epub轉PDF軟件Calibre電子書管理軟件

Epub轉PDF軟件:Calibre電子書管理軟件 https://download.csdn.net/download/hu5566798/90549599 一款好用的電子書管理軟件,可快速導入電腦里的電子書并進行管理,支持多種格式,閱讀起來非常方便。同時也有電子書格式轉換功能。 …

在 Ubuntu 22.04 上安裝 Docker Compose 的步驟

1. 確保已安裝 Docker Docker Compose 需要 Docker 作為依賴,請先安裝 Docker: sudo apt update sudo apt install docker.io sudo systemctl enable --now docker2. 下載 Docker Compose 二進制文件 推薦安裝最新穩定版的 Docker Compose&#xff08…

Mysql-數據庫、安裝、登錄

一. 數據庫 1. 數據庫:DataBase(DB),是存儲和管理數據的倉庫。 2. 數據庫管理系統:DataBase Management System(DBMS),操縱管理數據庫的大型軟件 3. SQL:Structured Query Language&…

基于SpringAOP面向切面編程的一些實踐(日志記錄、權限控制、統一異常處理)

前言 Spring框架中的AOP(面向切面編程) 通過上面的文章我們了解到了AOP面向切面編程的思想,接下來通過一些實踐,去更加深入的了解我們所學到的知識。 簡單回顧一下AOP的常見應用場景 日志記錄:記錄方法入參、返回值、執…