利用FS寄存器獲取KERNEL32.DLL基址算法的證明(ZZ)

轉自:http://blog.csdn.net/int2e/archive/2008/01/09/2032732.aspx

FS寄存器指向當前活動線程的TEB結構(線程結構)

偏移? 說明

000? 指向SEH鏈指針

004? 線程堆棧頂部

008? 線程堆棧底部

00C? SubSystemTib

010? FiberData

014? ArbitraryUserPointer

018? FS段寄存器在內存中的鏡像地址

020? 進程PID

024? 線程ID

02C? 指向線程局部存儲指針

030? PEB結構地址(進程結構)

034? 上個錯誤號

?

shellcode中用它來找KERNEL32.DLL基地址是常見的算法了,經典的三種算法都用到了FS寄存器!她們是:

1.?????? 通過PEB(FS:[30])獲取KERNEL32.DLL基地址

2.?????? 通過TEB(FS:[18])獲取KERNEL32.DLL基地址

3.?????? 通過SEH(FS:[00])獲取KERNEL32.DLL基地址

下面分別證明之。

?

命題一:通過PEB(FS:[30])獲取KERNEL32.DLL基地址

算法描述:

mov eax,fs:[30h]???? ;得到PEB結構地址

mov eax,[eax + 0ch]? ;得到PEB_LDR_DATA結構地址

mov esi,[eax + 1ch]??

lodsd ?; 得到KERNEL32.DLL所在LDR_MODULE結構的

; InInitializationOrderModuleList地址

mov edx,[eax + 8h]?? ;得到BaseAddress,既Kernel32.dll基址

?

證明:

1.?????? 隨便open一個exe,內存中的KERNEL32.DLL基地址是不變的;

2.?????? 獲取PEB基地址,

0:000> dd fs:30 L1

003b:00000030? 7ffd6000

看到了,7ffd6000

3.?????? 獲取PEB_LDR_DATA結構地址7ffd6000+0c

peb的結構定義:

ntdll!_PEB

?? +0x000 InheritedAddressSpace : UChar

?? +0x001 ReadImageFileExecOptions : UChar

?? +0x002 BeingDebugged??? : UChar

?? +0x003 SpareBool??????? : UChar

?? +0x004 Mutant?????????? : Ptr32 Void

?? +0x008 ImageBaseAddress : Ptr32 Void

?? +0x00c Ldr????????????? : Ptr32 _PEB_LDR_DATA

?? +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS

?? +0x014 SubSystemData??? : Ptr32 Void

?? +0x018 ProcessHeap????? : Ptr32 Void

?? +0x01c FastPebLock????? : Ptr32 _RTL_CRITICAL_SECTION

......

0:000>? dd 7ffd6000+0c L1

7ffd600c? 00181ea0

PEB_LDR_DATA-> 00181ea0

4.?????? 獲取InInitializationOrderModuleList的地址

說一下這個PEB_LDR_DATA,她是ntdll.dll中的undocumented的一個結構,PEB_LDR_DATA的結構定義:

0:000> dt _PEB_LDR_DATA

?? +0x000 Length?????????? : Uint4B

?? +0x004 Initialized????? : UChar

?? +0x008 SsHandle???????? : Ptr32 Void

?? +0x00c InLoadOrderModuleList : _LIST_ENTRY

?? +0x014 InMemoryOrderModuleList : _LIST_ENTRY

?? +0x01c InInitializationOrderModuleList : _LIST_ENTRY

?? +0x024 EntryInProgress? : Ptr32 Void

0:000> dd 00181ea0+1c L1

00181ebc? 00181f58

InInitializationOrderModuleList->00181f58

5.?????? 獲取kernel32的基地址

0:000> dd 00181f58+8 L1

00181f60? 7c920000

7c920000就是了?

check一下:

0:000> dd kernel32 L1

7c800000? 00905a4d

啊!竟然不是啊,7c920000ntdll.dll的,哈哈。

不過,算法命題仍然是正確的。因為在shellcode中模塊列表的第一個就是kernel32了,當然可以通過鏡像名稱來check的,不過shellcode的空間不允許的,這就是shellcode的藝術了。我用來測試的exe恰好先加載了ntdll.dll

?

命題二:通過TEB(FS:[18])獲取KERNEL32.DLL基地址

算法描述:

本地線程的棧里偏移18H的指針指向kernel32.dll內部,而fs :[ 0x18 ] 指向當前線程而且往里四個字節指向線程棧,結合棧頂指針進行對齊遍歷,找到PE文件頭(DLL的文件格式)的“MZMSDOS標志,就拿到了kernel32.dll基址。

xor esi , esi

mov esi , fs :[ esi + 0x18 ] // TEB

mov eax , [ esi + 4 ] // 這個是需要的棧頂

mov eax , [ eax - 0x1c ] // 指向Kernel32.dll內部

find_kernel32_base :

dec eax // 開始地毯式搜索Kernel32空間

xor ax , ax

cmp word ptr [ eax ], 0x5a4d // "MZ"

jne find_kernel32_base // 環遍 ,找到 返回 eax

?

證明:

1.?????? 找到TEB,這個好辦:

0:000>? dd fs:18 L1

003b:00000018? 7ffdd000

TEB->7ffdd000

2.?????? 找到棧頂指針:

0:000> dd 7ffdd000+4 L1

7ffdd004? 00070000

3.?????? 進入Kernel32空間:

0:000> dd 00070000-1c L1

0006ffe4? 7c839aa8

?

4.?????? Kernel32空間的大搜索:

0:000> db 7c839aa7 L4

7c839aa7? 30 55 8b ec????????????????????????????????????? 0U..

......一直搞下去

0:000> db 7c800000 L4

7c800000? 4d 5a 90 00????????????????????????????????????? MZ..

找到了吧,哈哈。有點效率問題,shellcode有時候是要犧牲效率的,沒辦法,還是藝術問題。

?

命題三:通過SEH(FS:[00])獲取KERNEL32.DLL基地址

算法描述:

注意:FS:[ 0 ] 指向的是SHE,它指向kernel32.dll內部鏈,這樣就可以順藤摸瓜了。FS:[ 0 ] 指向的是SHE的內層鏈,為了找到頂層異常處理,我們向外遍歷找到prev成員等于 0xffffffff EXCEPTION_REGISTER結構,該結構的handler值就是系統 認的處理例程;這里有個細節,DLL的裝載是64K邊界對齊的,所以需要利用遍歷到的指向最后的異常處理的指針進行頁查找,再結合PE文件MSDOS標志部分,只要在每個 64K 邊界查找 MZ ”字符就能找到kernel32.dll基址。

xor ecx , ecx

mov esi , fs :[ ecx ]

find_seh :

mov eax ,[ esi ]

mov esi , eax

cmp [ eax ], ecx

jns find_seh // 0xffffffff

mov eax , [ eax + 0x04 ] // handler

find_kernel32_base :

dec eax

xor ax , ax

cmp word ptr [ eax ], 0x5a4d

jne find_kernel32_base

?

證明:

1.?????? 找到當前SEH

0:000> dd fs:0 L1

003b:00000000? 0006fedc

2.?????? 找到最外層SEH

round 1:

0:000> dd 0006fedc L1

0006fedc? 0006ffb0 ; esi

0:000> dd 0006ffb0 L1

0006ffb0? 0006ffe0 ; [eax]

round 2:

0:000> dd 0006ffb0 L1

0006ffb0? 0006ffe0 ; esi

0:000> dd 0006ffe0 L1

0006ffe0? ffffffff ; [eax]

不錯,第二趟就找到了!此時,eax=0006ffe0

3.?????? 找到MZ

0:000> dd 0006ffe0+4 L1

0006ffe4? 7c839aa8

?

0:000> db 7c839aa7 L4

7c839aa7? 30 55 8b ec????????????????????????????????????? 0U..

......又是一直搞下去

0:000> db 7c800000 L4

7c800000? 4d 5a 90 00????????????????????????????????????? MZ..

找到!

?

知其然,更要知其所以然!



pixy.gif?x-id=4d9d0ecd-6cf0-485d-b93c-a052e070afb4

轉載于:https://www.cnblogs.com/fanzi2009/archive/2009/03/19/1416805.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448517.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

很老很老的老偏方,小病一掃光

1、洋蔥、生姜治頭皮屑 ①將一個的洋蔥頭用紗布包好,用它揉擦頭皮,24小時后用溫水洗頭,即可止頭癢,除頭皮屑。 ②先將生姜切片,放入鍋里煮沸,待水溫不燙的時候倒上適量醋,加水洗頭。 2、小白果…

script 放置最佳位置以及 html 執行順序

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 看到知乎上有很多討論關于javascript位置的文章。所以特意留意了這方面的問題。 首先要了解到的是: html文件是自上而下的執…

677A

#include <stdio.h> int main() {int n, h;scanf("%d%d", &n, &h);int temp, width0;int i;for(i0; i<n; i){scanf("%d", &temp);if(temp<h)width;elsewidth2;}printf("%d\n", width);return 0; }轉載于:https://www.cn…

數據結構之二叉樹的一些基本操作

二叉樹是樹的特殊一種&#xff0c;具有如下特點&#xff1a;1、每個結點最多有兩顆子樹&#xff0c;結點的度最大為2。2、左子樹和右子樹是有順序的&#xff0c;次序不能顛倒。3、即使某結點只有一個子樹&#xff0c;也要區分左右子樹。 頭文件 BTree.h #ifndef __BTREE_H__ …

【Arduino】使用C#實現Arduino與電腦進行串行通訊

在給Arduino編程的時候&#xff0c;因為沒有調試工具&#xff0c;經常要通過使用串口通訊的方式調用Serial.print和Serial.println輸出Arduino運行過程中的相關信息&#xff0c;然后在電腦上用Arduino IDE的Serial Monitor來查看print出來的信息。Serial Monitor不僅可以接受Ar…

虛擬機NAT模式聯網

阿里開源鏡像軟件&#xff1a;https://opsx.alibaba.com/mirror 如何使VMware ip與本機ip處于同一網段 https://blog.csdn.net/kakuma_chen/article/details/71425620 轉載于:https://www.cnblogs.com/cdy0626/p/11131440.html

VS2008下最新X264(svn 2009.9)編譯不過的解決辦法

總有人說最新的版本 編譯不過&#xff0c;搞的群、 論壇里到處都是這種求助貼。建議斑竹把這個解決辦法放到醒目的位置&#xff0c;以減少噪音。科普開始1、編譯問題由于MS的VS編譯器對C99標準支持不好&#xff0c;不支持函數當中混合定義、聲明變量。解決辦法&#xff1a;在函…

node、npm、vue安裝 -- VUE 項目 demo 實例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 安裝node&#xff1a; sudo yum install epel-release sudo yum install nodejs node --version // 安裝好后查看版本2. 安裝 npm …

用C語言實現簡單的停車場管理

這個程序是利用棧和循環隊列實現的&#xff0c;自己得先處理好邏輯關系就好了。由于題目沒有要求&#xff0c;這個程序就沒加重復判斷&#xff0c;比如一輛車已經停在車位上或者便道上&#xff0c;再來一輛就判斷不了了。關于棧&#xff0c;就是先進后出的思想&#xff0c;隊列…

推薦一個配置linux服務的網站

該網站的各種linux服務的配置都是基于CentOS系統的 基本上各種linux服務都有了 http://www.server-world.info/en/轉載于:https://www.cnblogs.com/Skyar/p/3582389.html

mariadb數據庫增刪改查

1.常用數據類型 1&#xff09;整數:int, bit 2&#xff09;小數:decimal    #decimal(5,2)表示共有五位數&#xff0c;保留兩位小數 3&#xff09;字符串:varchar, char   4&#xff09;日期時間:date, time, datetime 5&#xff09;枚舉類型(enu…

為什么你工作努力卻沒有起色?

成為職場達人&#xff0c;未必要經常挑燈夜戰。相反&#xff0c;注意到下面幾條&#xff0c;會讓你少走彎路。 1&#xff09;成長的機會永遠比眼前的待遇重要——做重要的事比多拿錢重要。 我知道在水木bbs上的worklife版本&#xff0c;每天都在上演的就是比較自己的第一個o…

《 Spring 實戰 》(第4版) 讀書筆記 (未完結,更新中...)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Pxx 表示在書的第 xx 頁。 Spring 框架的核心是 Spring 容器。 1. (P7.) 構造器注入是依賴注入的方式之一。 緊耦合&#xff1a;在 …

數據結構排序法之希爾排序法(Shell Sort)

希爾排序&#xff0c;也叫遞減增量排序&#xff0c;是插入排序的一種更高效的改進版本。希爾排序是不穩定的排序算法。 希爾排序是基于插入排序的以下兩點性質而提出改進方法的&#xff1a; 1、插入排序在對幾乎已經排好序的數據操作時&#xff0c;效率高&#xff0c;即可以達…

Windows To Ghost系統封裝之必備軟件集 - 好壓

好壓壓縮軟件&#xff08;HaoZip&#xff09;是強大的壓縮文件管理器&#xff0c;是完全免費的新一代壓縮軟件&#xff0c;相比其它壓縮軟件系統資源占用更少&#xff0c;有更好的兼容性&#xff0c;壓縮率比較高。 它提供了對ZIP、7Z和TAR文件的完整支持&#xff0c;能解壓RAR…

js 彈窗并定時關閉

1. $(input).click(function() {prompt(點擊成功, 2000) })function prompt(newName, time, fn) {var $div $(<div></div>);$div.css({position: fixed,top: 0,left: 0,width: 100%,height: 100%,z-index: 200,background-color: rgba(0,0,0,0.4),// background-c…

數據結構排序法之插入法

插入排序是一種簡單直觀的排序算法。它的工作原理非常類似于我們抓撲克牌。 對于未排序數據(右手抓到的牌)&#xff0c;在已排序序列(左手已經排好序的手牌)中從后向前掃描&#xff0c;找到相應位置并插入。 插入排序在實現上&#xff0c;通常采用in-place排序&#xff08;即…

XSLT學習筆記

1. 樣式聲明&#xff1a;<xsl:stylesheet>或<xsl:transform> 2. XSLT常用元素&#xff1a; 2.1 <xsl:template>&#xff1a;創建模板 Match屬性的作用是使模板和XML元素相關聯 e.g.:<xsl:template match"\">......</xsl:template&g…

職場:人生從沒有最佳時機!一個離職客服人員的領悟

每個人都有感到失落迷惘的時候。 人生用專制又霸道的方式運行著&#xff0c;每當我們心想一切塵埃落定、生活穩固的時候&#xff0c;生活總愛給我們驚喜&#xff0c;粉碎我們短暫的安逸&#xff0c;讓我們不得不重新思考。 「我走對路了嗎?」 「我能夠賺更多錢、爬到更高的地位…

VS Code 的常用快捷鍵

VS Code 的常用快捷鍵和插件 一、vs code 的常用快捷鍵 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、注釋&#xff1a; a) 單行注釋&#xff1a;[ctrlk,ctrlc] 或 ctrl/ b) 取消…