吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9188|回复: 2
收起左侧

[调试逆向] Shellcode In X64-1Find Kernel32.dll

[复制链接]
KMSRussian 发表于 2012-8-31 03:10
网上对于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, 下载次数: 26)





发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

轉瞬即逝~的愛 发表于 2014-12-28 10:38
二楼沙发
www52pojiecn 发表于 2015-1-3 21:26
感觉这个很棒“ gs:60H,从teb得到peb”
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
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-20 02:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表