編寫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 它們主要用於存放儲存單元在段內的偏移量,用它們可實現多種儲存器運算元的定址方式,為以不...