x64 gs暫存器的一點資料

2021-07-23 19:38:58 字數 2650 閱讀 3186

編寫shellcode很重要的一步就是搜尋kernel32的基址,畢竟我們要獲取api的位址

x86下總所周知的fs暫存器搜尋kernel32基址的辦法,在x64下已經失效了.

x64下fs的角色已經換成了gs.

暫時發現儲存的一些感興趣的東西,如果有其他的,希望能告知我.

gs:[0x30]                 teb

gs:[0x40]                 pid

gs:[0x48]                 tid

gs:[0x60]                peb

gs:[0x68]                 lasterror

值得一提的是,雖然gs:[0x60] 直接存放的peb,但是由於vista/7後的位址隨機化機制,還是從teb獲取比較靠譜.

0:009> dt 000007fffff98000 _teb

ntdll!_teb

+0×000 nttib            : _nt_tib

+0×038 environmentpointer : (null)

+0×040 clientid         : _client_id

+0×050 activerpchandle  : (null)

+0×058 threadlocalstoragepointer : (null)

+0×060 processenvironmentblock : 0x000007ff`fffd5000 _peb    //這裡即是peb

//用c語言描述就是

#define x64_getpeb()                    ( (long64*)(*((long64*)((byte*)x64_getteb()+0×060))) )

得到了peb,剩下的就和x86下一樣了.只是偏移不一樣了

0:009> dt 0x000007ff`fffd5000 _peb

ntdll!_peb

+0×000 inheritedaddressspace : 0 」

+0×001 readimagefileexecoptions : 0 」

+0×002 beingdebugged    : 0×1 」

+0×003 bitfield         : 0×8 」

+0×003 imageuseslargepages : 0y0

+0×003 isprotectedprocess : 0y0

+0×003 islegacyprocess  : 0y0

+0×003 isimagedynamicallyrelocated : 0y1

+0×003 skippatchinguser32forwarders : 0y0

+0×003 sparebits        : 0y000

+0×008 mutant           : 0xffffffff`ffffffff void

+0×010 imagebaseaddress : 0×00000000`ff310000 void

+0×018 ldr              : 0×00000000`77222640 _peb_ldr_data

0:009> dt 0×00000000`77222640 _peb_ldr_data

ntdll!_peb_ldr_data

+0×000 length           : 0×58

+0×004 initialized      : 0×1 」

+0×008 sshandle         : (null)

+0×010 inloadordermodulelist : _list_entry [ 0x00000000`00202780 - 0x2421b0 ]

+0×020 inmemoryordermodulelist : _list_entry [ 0x00000000`00202790 - 0x2421c0 ]

+0×030 ininitializationordermodulelist : _list_entry [ 0x00000000`00202890 - 0x2421d0 ]

同樣的,搜尋ininitializationordermodulelist 即可得到kernel32的基址.

由於x64下vs2005沒法直接使用內聯彙編,所以只把必須使用彙編來做的事情寫成單獨的asm

x64下.指標的長度已經是8個位元組,所以偏移不一樣了.

0:009> dt _ldr_data_table_entry

ntdll!_ldr_data_table_entry

+0×000 inloadorderlinks : _list_entry

+0×010 inmemoryorderlinks : _list_entry

+0×020 ininitializationorderlinks : _list_entry

+0×030 dllbase          : ptr64 void

+0×038 entrypoint       : ptr64 void

+0×040 sizeofimage      : uint4b

+0×048 fulldllname      : _unicode_string

c語言表述x64下這個搜尋的過程

win7 x64下測試通過. 

x86的暫存器

最近一段時間,在看組合語言方面的東西。看的大部分都是基於8086。而8086的晶元中是16位的資料線,16位的暫存器。看了大部分指令後也是16位的。所在在把程式移植到32位的處理器上的時候,就會發現有此不同。雖然處理器是32位的,但是它還是保留的ax,bx,cx,dx,bp暫存器還是16位。其定址方...

64位暫存器與彙編

64位暫存器分配的不同 順帶提乙個小問題,64位的彙編 在ret之前可能會加一句rep,這裡的rep沒有實際意義,只是出於amd處理器的原因,避免jmp所到達的地方直接就是ret,這樣會使得處理器執行更快一些。但是現在的棧幀經常是固定大小的,在函式呼叫的最開始就被設定,在整個呼叫期間,棧頂指標保持不...

x86暫存器說明

32位cpu有2個32位通用暫存器esi和edi。其低16位對應先前cpu中的si和di,對低16位資料的訪問,不影響 高16位的資料。暫存器esi edi si和di稱為變址暫存器 index register 它們主要用於存放儲存單元在段內的偏移量,用它們可實現多種儲存器運算元的定址方式,為以不...