首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

組語技巧:利用 CALL/POP 獲取運行時當前位址(位置無關碼核心)

     編輯:組合語言

經典模式

CALL @F
@@:
POP EBX

原理解析

  1. CALL 指令會將**下一條指令的位址**(即返回位址)壓入堆疊
  2. 標號 @@: 即為該下一條指令的位置
  3. 執行到 POP EBX 時,堆疊頂 SS:[ESP] 正是 @@: 的位址
  4. POP EBX 將此位址彈出存入 EBX,EBX 現在持有當前代碼的運行時位址

等效替代寫法

@@:
MOV EBX, $

$ 為組譯器內建符號,代表當前位置計數器值。經驗證,MOV EBX, $ 可直接將當前位址載入暫存器,效果與 CALL/POP 完全一致,且指令更短、不破壞堆疊平衡、無需標號。

應用場景

  • **位置無關碼 (PIC)**:Shellcode、病毒代碼、動態加載模組需在不知載入基址情況下定位自身數據
  • **相對定址**:配合 EBX 作為基址,以 [EBX + offset] 存取嵌入代碼中的字串、表格等數據
  • **反調試/混淆**:隱藏真實調用流程

注意事項

  • 32 位模式下 CALL rel32 壓入 32 位返回位址,POP EBX 完美匹配
  • 64 位模式需用 POP RBX,且 CALL 為相對跳轉,同樣適用
  • MOV EBX, $ 為組譯器編譯期解析,若代碼被重定位需確認組譯器是否生成重定位項目(通常不會,故更適合 PIC)

掌握此技巧,是編寫高級 Shellcode 與位置無關組語代碼的基礎入門。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved