CALL @F
@@:
POP EBX
CALL 指令會將**下一條指令的位址**(即返回位址)壓入堆疊@@: 即為該下一條指令的位置POP EBX 時,堆疊頂 SS:[ESP] 正是 @@: 的位址POP EBX 將此位址彈出存入 EBX,EBX 現在持有當前代碼的運行時位址@@:
MOV EBX, $
$ 為組譯器內建符號,代表當前位置計數器值。經驗證,MOV EBX, $ 可直接將當前位址載入暫存器,效果與 CALL/POP 完全一致,且指令更短、不破壞堆疊平衡、無需標號。
EBX 作為基址,以 [EBX + offset] 存取嵌入代碼中的字串、表格等數據CALL rel32 壓入 32 位返回位址,POP EBX 完美匹配POP RBX,且 CALL 為相對跳轉,同樣適用MOV EBX, $ 為組譯器編譯期解析,若代碼被重定位需確認組譯器是否生成重定位項目(通常不會,故更適合 PIC)掌握此技巧,是編寫高級 Shellcode 與位置無關組語代碼的基礎入門。