游戏安全实验室 首页 技术入门 查看内容

 阅读目录

【转载】Shellcode In X64-1Find Kernel32.dll

发布于:2015-11-18 10:22   |    285006次阅读 作者: 管理员    |   原作者: 调试逆向   |   来自: 转载

Shellcode In X64-1Find Kernel32.dll

 

原文出自:http://www.52pojie.cn/forum.php?mod=forumdisplay&fid=59&filter=typeid&typeid=157


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位又进化成64ax->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基地址

 

 

 *转载请注明来自游戏安全实验室(https://gslab.qq.com

分享到:
踩1 赞1

收藏

上一篇:Unity游戏逆向及破解方法介绍

下一篇:Android平台基于异常的Hook实现

相关阅读
最新评论
B Color Image Link Quote Code Smilies

发表评论