重定位的復現
病毒可以利用重定位技術來使其程式碼在不同的記憶體位置執行,這有助於逃避檢測和防禦機制。下面是病毒實現重定位的一般步驟:
- 獲取基礎資訊: 病毒首先需要獲取系統環境的基礎資訊,例如程式載入的地址、系統呼叫的方式等。
- 計算偏移量: 病毒會計算當前程式碼相對於基礎位置的偏移量。這可以透過一些技術來完成,例如獲取特定函式的地址,然後計算與之間的偏移量。
- 修改指令: 接下來,病毒需要修改其程式碼,以便在執行時進行重定位。這包括替換硬編碼的記憶體地址為相對於基礎位置的偏移量,或者使用相對定址的方式來訪問資料。
- 重定位過程: 在執行時,病毒首先會找到自身的基礎位置,然後使用之前計算的偏移量來動態調整其程式碼和資料的位置。這可能涉及修改程式碼的記憶體位置,或者修改指向資料的指標。
- 執行修改後的程式碼: 一旦重定位完成,病毒就可以執行其修改後的程式碼。由於程式碼已經動態調整了位置,它可以在不同的記憶體位置執行而不影響其功能。
總的來說,透過實現重定位技術,病毒可以使其程式碼更具靈活性和隱蔽性,從而更難被檢測和清除
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 核心進行系統呼叫