網上對於X64下Shellcode的討論比較少 中文網頁我也沒有找到幾個 在這幾篇文章裏 咱們着重討論下
X64下的Shellcode
1 病毒和shellcode的第一步
提及shellcode 大致的流程先說一下 shellcode和病毒所用的技術 基本一模一樣
第一步都是找到某模塊基址 如kernel32.dll 因爲kernel32.dll等有一些很重要的函數如
LoadLibrary GetProcAddress 獲取到這些函數後 病毒或者shellcode能夠隨心所欲的加載其餘的模塊
這也是今天咱們這篇文章所要談到的
2 X64下shellcode 的編寫和32位下有什麼不一樣
因爲X64下_asm關鍵字的取消,咱們沒有辦法在VC中內聯彙編了,因此咱們須要找一個64位的彙編的工具,(固然,你
若是是C語言高手,非得用C語言那不如彙編直觀的代碼來寫shellcode,我也無話可說)你能夠選擇微軟的masm,可是
我推薦fasm,你不須要設置什麼只須要把我給出的.asm文件直接打開或者複製粘貼而後編譯就能夠看到效果了。
3 說一下虛擬機X64的硬件環境
硬件:擁有兩塊硬盤的電腦檯式機或者筆記本 最好是大於4GB的內存
至於筆記本能夠加裝光驅位硬盤,或者內存條 兩塊硬盤的好處就是真實的系統在主盤上啓動 虛擬機放在從盤裏
即便同時啓動三四個虛擬機(我是說同時點虛擬機的power按鈕) 你的真實的操做系統也不是很卡 不少時候你很可
能虛擬機裏同時開着X64 的WIN7 WIN8 還可能開了一個XP
個人筆記本硬件是I3 380M 2.53Ghz的主頻 兩塊硬盤主盤5400rpm 從盤7200rpm
...........
其實這篇文章很簡單 咱們只要弄懂下面這幾行代碼就完成任務了 大概只有六行代碼 輕鬆加愉快 好了 咱們開始
GetKrnlBase3:
mov rsi, [gs:60h] ; peb from teb
mov rsi, [rsi+18h] ;_peb_ldr_data from peb
mov rsi, [rsi+30h] ;InInitializationOrderModuleList.Flink,
mov rsi, [rsi] ;kernelbase.dll
mov rsi, [rsi] ;kernel32.dll
mov rsi, [rsi+10h] ; pay attention to danwei
ret
4 X64下的一些基礎知識
先說幾個 之後的咱們現用現學
1 X64下增長了 r8-r15 8個通用寄存器 64位的哦
16位進化成32位 32位又進化成64位ax->eax->rax 固然兼容從前的寄存器的哦
2pushad popad 等X64下做廢
3記住這個順序r9 r8 rdx rcx X64下都是用的__fastcall的方式 四個寄存器用完了以後才用堆棧傳遞參數
4fs x64下換成了gs 天然[fs:0]的指向由[gs:0]繼承了哦
5windbg查看結構 和 代碼解釋
find kernel32.dll 我只說一種方法 這種方法通用於win8 x64 customer 驗證的方法就是把我給出的程序直接拖
進X64 WIN8虛擬機 會看到kernel32.dll的地址被打印出來了
mov rsi, [gs:60h] ; peb from teb
mov rsi, [rsi+18h] ;_peb_ldr_data from peb
這兩行代碼不用解釋 咱們看這個
mov rsi, [rsi+30h] ;InInitializationOrderModuleList.Flink,
咱們這裏採用的是從InInitializationOrderModuleList這個鏈表裏來找尋kernel32.dll的 我所看到的國外的一些
X64 shellcode都是從InLoadOrderModuleList這裏來找的 固然方法是同樣的;
/////http://mcdermottcybersecurity.com/articles/windows-x64-shellcode
/////http://code.google.com/p/win-exec-calc-shellcode/downloads/list
咱們來看一下InInitializationOrderModuleList這個的結構
在windbg中連續輸入如下命令
/*
PROCESS fffffa800b429b30
SessionId: 1 Cid: 04b0 Peb: 7fffffd9000 ParentCid: 048c
DirBase: 08dd6000 ObjectTable: fffff8a000e47010 HandleCount: 866.
Image: explorer.exe
*/
!process 0 0
//.process explorer.exe的 PROCESS值
.process fffffa800b429b30
.reload
看到這樣的提示後
Connected to Windows 7 7601 x64 target at (Fri Aug 31 00:34:01.041 2012 (UTC + 8:00)), ptr64 TRUE
Loading Kernel Symbols
...............................................................
................................................................
.............................
Loading User Symbols //千萬要注意 User Symbols是否加載成功
................................................................
................................................................
.............................................................
Loading unloaded module list
..........................................
咱們輸入
!peb 大概獲得以下結果 我這裏是這樣的
1: kd> !peb
PEB at 000007fffffd9000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: No
ImageBaseAddress: 00000000ffa20000
Ldr 0000000077742640
Ldr.Initialized: Yes
Ldr.InInitializationOrderModuleList: 00000000000627a0 . 00000000084dda10
Ldr.InLoadOrderModuleList: 0000000000062690 . 00000000084dd9f0
Ldr.InMemoryOrderModuleList: 00000000000626a0 . 00000000084dda00
Base TimeStamp Module
ffa20000 4ce7a144 Nov 20 18:21:56 2010 C:\Windows\Explorer.EXE
77610000 4ce7c8f9 Nov 20 21:11:21 2010 C:\Windows\SYSTEM32\ntdll.dll
773f0000 4ce7c78b Nov 20 21:05:15 2010 C:\Windows\system32\kernel32.dll
7fefd730000 4ce7c78c Nov 20 21:05:16 2010 C:\Windows\system32\KERNELBASE.dll
7fefeb70000 4a5bde6b Jul 14 09:24:59 2009 C:\Windows\system32\ADVAPI32.dll
咱們主要關心InInitializationOrderModuleList這個東東
1查看 Ldr.InInitializationOrderModuleList
1: kd> dd 00000000000627a0
00000000`000627a0 00062c90 00000000 77742670 00000000
00000000`000627b0 77610000 00000000 00000000 00000000 ntdll.dll的基地址77610000
00000000`000627c0 001a9000 00000000 003c003a 00000000
00000000`000627d0 00062600 00000000 00140012 00000000
00000000`000627e0 777253f8 00000000 00004004 0000ffff
00000000`000627f0 000cb510 00000000 7774aac0 00000000
00000000`00062800 4ce7c8f9 00000000 00000000 00000000
00000000`00062810 00000000 00000000 00062818 00000000
2查看模塊入口 dd 00062c90
1: kd> dd 00062c90
00000000`00062c90 00062b20 00000000 000627a0 00000000
00000000`00062ca0 fd730000 000007fe fd7330e0 000007fe kernelbase.dll的基地址7fefd730000
00000000`00062cb0 0006b000 00000000 00460044 00000000
00000000`00062cc0 00062c20 00000000 001e001c 00000000
00000000`00062cd0 00062c48 00000000 00084004 0000ffff
00000000`00062ce0 00088020 00000000 7774aae0 00000000
00000000`00062cf0 4ce7c78c 00000000 00000000 00000000
00000000`00062d00 00000000 00000000 00062d08 00000000
3下一個就是kernel32.dll了
1: kd> dd 00062b20
00000000`00062b20 00063ab0 00000000 00062c90 00000000
00000000`00062b30 773f0000 00000000 77405ea0 00000000 kernel32.dll的基地址773f0000
00000000`00062b40 0011f000 00000000 00420040 00000000
00000000`00062b50 00062ab0 00000000 001a0018 00000000
00000000`00062b60 00062ad8 00000000 00084004 0000ffff
00000000`00062b70 041401d0 00000000 7774aa40 00000000
00000000`00062b80 4ce7c78b 00000000 00000000 00000000
00000000`00062b90 00000000 00000000 00063dc0 00000000
大概參考了以上的幾個命令
mov rsi, [rsi] ;kernelbase.dll
mov rsi, [rsi] ;kernel32.dll
這兩條指令也應該理解了
mov rsi, [rsi+10h] ; pay attention to danwei
就剩這條指令了
10h也就是10進制的16
1: kd> dt _LIST_ENTRY
ntdll!_LIST_ENTRY
+0x000 Flink : Ptr64 _LIST_ENTRY
+0x008 Blink : Ptr64 _LIST_ENTRY
也就是 Flink 和 Blink的兩個指針長度的和 注意X64指針長度由4變成了8哦
那爲何加上了指針的長度就獲得了kernel32.dll的基地址呢
看這個命令 咱們用的是InInitializationOrderLinks 因此加兩個指針長度就能夠了
若是你用的是InLoadOrderLinks 那麼得加幾個指針長度呢 你本身算下吧
1: kd> dt _LDR_DATA_TABLE_ENTRY
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY
+0x010 InMemoryOrderLinks : _LIST_ENTRY
+0x020 InInitializationOrderLinks : _LIST_ENTRY
+0x030 DllBase : Ptr64 Void
+0x038 EntryPoint : Ptr64 Void
+0x040 SizeOfImage : Uint4B
+0x048 FullDllName : _UNICODE_STRING
+0x058 BaseDllName : _UNICODE_STRING
+0x068 Flags : Uint4B
好了 我再給出一個64位的FASM程序 通用於WIN7 和WIN8 運行以後打印出kernel32.dll的基地址
/////////////////////////////////////////////////////////////////////
format PE64 CONSOLE
macro .text {section '.text' code readable executable writeable}
macro .code {section '.code' code readable executable }
macro .data {section '.data' data readable writeable }
entry __Entry
include 'win64axp.inc'
.text
__Entry:
; push dword [esp]
; call GetKrnlBase
; call GetKrnlBase2
call GetKrnlBase3
xor rcx, rcx
cinvoke printf,type,rsi
ccall [printf ],hello_msg ;
cinvoke printf,type,0
cinvoke getch
invoke ExitProcess,rcx
; mov eax, [fs:30h]
; mov eax, [eax+0ch] ;Get _PEB_LDR_DATA
; mov eax, [eax+1ch] ;Get InInitializationOrderModuleList.Flink,
;此時eax指向的是ntdll模塊的InInitializationOrderModuleList線性地址。因此咱們得到它的下一個則是
kernel32.dll
; mov eax, [eax]
; mov eax, [eax+8h]
; ret
GetKrnlBase3:
mov rsi, [gs:60h] ;peb from teb
mov rsi, [rsi+18h] ;_peb_ldr_data from peb
mov rsi, [rsi+30h] ;InInitializationOrderModuleList.Flink,
;rsi==00232c90 00000000
mov rsi, [rsi] ;kernelbase.dll
;rsi=00232b20 00000000
mov rsi, [esi] ;kernel32.dll
mov rsi, [rsi+10h] ; pay attention to danwei
ret
.data
type db "%I64x",0
hello_msg db 0Dh,0Ah
section '.IDAta' import data readable writable
library kernel,'KERNEL32.DLL',\
msvcrt,'msvcrt.dll'
import kernel,\
ExitProcess,'ExitProcess'
import msvcrt,\
printf,'printf',\
getch, '_getch'
/////////////////////////////////////////////////////////
[gs:0] 指向teb windbg查看teb
1: kd> dt _teb
ntdll!_TEB
+0x000 NtTib : _NT_TIB
+0x038 EnvironmentPointer : Ptr64 Void
+0x040 ClientId : _CLIENT_ID
+0x050 ActiveRpcHandle : Ptr64 Void
+0x058 ThreadLocalStoragePointer : Ptr64 Void
+0x060 ProcessEnvironmentBlock : Ptr64 _PEB
1: kd> dt _peb
ntdll!_PEB
+0x000 InheritedAddressSpace : UChar
+0x001 ReadImageFileExecOptions : UChar
+0x002 BeingDebugged : UChar
+0x003 BitField : UChar
+0x003 ImageUsesLargePages : Pos 0, 1 Bit
+0x003 IsProtectedProcess : Pos 1, 1 Bit
+0x003 IsLegacyProcess : Pos 2, 1 Bit
+0x003 IsImageDynamicallyRelocated : Pos 3, 1 Bit
+0x003 SkipPatchingUser32Forwarders : Pos 4, 1 Bit
+0x003 SpareBits : Pos 5, 3 Bits
+0x008 Mutant : Ptr64 Void
+0x010 ImageBaseAddress : Ptr64 Void
+0x018 Ldr : Ptr64 _PEB_LDR_DATA
1: kd> dt _PEB_LDR_DATA
ntdll!_PEB_LDR_DATA
+0x000 Length : Uint4B
+0x004 Initialized : UChar
+0x008 SsHandle : Ptr64 Void
+0x010 InLoadOrderModuleList : _LIST_ENTRY
+0x020 InMemoryOrderModuleList : _LIST_ENTRY
+0x030 InInitializationOrderModuleList : _LIST_ENTRY
1: kd> dt _LIST_ENTRY
ntdll!_LIST_ENTRY
+0x000 Flink : Ptr64 _LIST_ENTRY
+0x008 Blink : Ptr64 _LIST_ENTRY
1: kd> dt _LDR_DATA_TABLE_ENTRY
ntdll!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY
+0x010 InMemoryOrderLinks : _LIST_ENTRY
+0x020 InInitializationOrderLinks : _LIST_ENTRY
+0x030 DllBase : Ptr64 Void
+0x038 EntryPoint : Ptr64 Void
+0x040 SizeOfImage : Uint4B
+0x048 FullDllName : _UNICODE_STRING
+0x058 BaseDllName : _UNICODE_STRING
+0x068 Flags : Uint4B
FASM Demo程序 打印出kernel32.dll基地址 printf.7z (1.36 KB, 下載次數: 13) php