重定位

风花赏秋月發表於2024-10-31

重定位的復現

病毒可以利用重定位技術來使其程式碼在不同的記憶體位置執行,這有助於逃避檢測和防禦機制。下面是病毒實現重定位的一般步驟:

  1. 獲取基礎資訊: 病毒首先需要獲取系統環境的基礎資訊,例如程式載入的地址、系統呼叫的方式等。
  2. 計算偏移量: 病毒會計算當前程式碼相對於基礎位置的偏移量。這可以透過一些技術來完成,例如獲取特定函式的地址,然後計算與之間的偏移量。
  3. 修改指令: 接下來,病毒需要修改其程式碼,以便在執行時進行重定位。這包括替換硬編碼的記憶體地址為相對於基礎位置的偏移量,或者使用相對定址的方式來訪問資料。
  4. 重定位過程: 在執行時,病毒首先會找到自身的基礎位置,然後使用之前計算的偏移量來動態調整其程式碼和資料的位置。這可能涉及修改程式碼的記憶體位置,或者修改指向資料的指標。
  5. 執行修改後的程式碼: 一旦重定位完成,病毒就可以執行其修改後的程式碼。由於程式碼已經動態調整了位置,它可以在不同的記憶體位置執行而不影響其功能。

總的來說,透過實現重定位技術,病毒可以使其程式碼更具靈活性和隱蔽性,從而更難被檢測和清除

c語言:

#include <stdio.h>

// 定義初始變數地址

#define VStart 0x1000

#define var2_offset 0x20

// 定義偏移量

#define offset_delta 0x10

int main() {

// 模擬執行 call delta

int stack_top = 0x2000;

int delta_addr = stack_top;

stack_top -= 4; // 模擬壓入 delta 地址

int ebp = delta_addr;

// 模擬執行 pop ebp

ebp = delta_addr;

// 計算偏移差

int delta = delta_addr - VStart;

// 計算 var2 的真實地址

int var2_real_addr = var2_offset + ebp;

printf("var2 的真實地址:0x%X\n", var2_real_addr);

return 0;}

組合語言:

section .data

; 定義初始變數地址

VStart equ 0x1000

var2_offset equ 0x20

section .text

global _start

_start:

; 模擬執行 call delta

; 在實際彙編中,call指令會自動將返回地址壓入棧中

mov ebp, esp ; 將當前棧頂(返回地址)存入ebp中

mov eax, delta

call eax

delta:

; 模擬執行 pop ebp

pop ebp ; 彈出返回地址,存入ebp中

; 計算偏移差

sub ebp, VStart

; 計算 var2 的真實地址

lea eax, [var2_offset + ebp]

; 輸出 var2 的真實地址

; 在實際彙編中,通常會將結果存入暫存器或記憶體,這裡簡化為直接輸出

mov ebx, eax ; 將 var2 的真實地址存入 ebx

mov eax, 4 ; 系統呼叫號,表示 sys_write

mov ecx, 1 ; 檔案描述符,表示 stdout

mov edx, 8 ; 輸出的位元組數

int 0x80 ; 呼叫 Linux 核心進行系統呼叫

; 退出程式

mov eax, 1 ; 系統呼叫號,表示 sys_exit

xor ebx, ebx ; 返回值,表示成功退出

int 0x80 ; 呼叫 Linux 核心進行系統呼叫

相關文章