




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
緩沖區(qū)溢出襲擊詳細(xì)講解緩沖區(qū)溢出(BufferOverflow)是計(jì)算機(jī)安全領(lǐng)域內(nèi)既經(jīng)典而又古老的話題。伴隨計(jì)算機(jī)系統(tǒng)安全性的加強(qiáng),老式的緩沖區(qū)溢出襲擊方式也許變得不再奏效,對(duì)應(yīng)的簡(jiǎn)介緩沖區(qū)溢出原理的資料也變得“大眾化”起來(lái)。其中看雪的《0day安全:軟件漏洞分析技術(shù)》一書(shū)將緩沖區(qū)溢出襲擊的原理論述得簡(jiǎn)潔明了。本文參照該書(shū)對(duì)緩沖區(qū)溢出原理的講解,并結(jié)合實(shí)際的代碼實(shí)例進(jìn)行驗(yàn)證。不過(guò)即便如此,完畢一種簡(jiǎn)樸的溢出代碼也需要處理諸多書(shū)中無(wú)法波及的問(wèn)題,尤其是面對(duì)較新的具有安全特性的編譯器——例如MS的VisualStudio。接下來(lái),我們結(jié)合詳細(xì)代碼,按照對(duì)緩沖區(qū)溢出原理的循序漸進(jìn)地理解方式去挖掘緩沖區(qū)溢出背后的底層機(jī)制。一、代碼
<=>
數(shù)據(jù)顧名思義,緩沖區(qū)溢出的含義是為緩沖區(qū)提供了多于其存儲(chǔ)容量的數(shù)據(jù),就像往杯子里倒入了過(guò)量的水同樣。一般狀況下,緩沖區(qū)溢出的數(shù)據(jù)只會(huì)破壞程序數(shù)據(jù),導(dǎo)致意外終止。不過(guò)假如有人精心構(gòu)造溢出數(shù)據(jù)的內(nèi)容,那么就有也許獲得系統(tǒng)的控制權(quán)!假如說(shuō)顧客(也也許是黑客)提供了水——緩沖區(qū)溢出襲擊的數(shù)據(jù),那么系統(tǒng)提供了溢出的容器——緩沖區(qū)。緩沖區(qū)在系統(tǒng)中的體現(xiàn)形式是多樣的,高級(jí)語(yǔ)言定義的變量、數(shù)組、構(gòu)造體等在運(yùn)行時(shí)可以說(shuō)都是保留在緩沖區(qū)內(nèi)的,因此所謂緩沖區(qū)可以更抽象地理解為一段可讀寫(xiě)的內(nèi)存區(qū)域,緩沖區(qū)襲擊的最終目的就是但愿系統(tǒng)能執(zhí)行這塊可讀寫(xiě)內(nèi)存中已經(jīng)被蓄意設(shè)定好的惡意代碼。按照馮·諾依曼存儲(chǔ)程序原理,程序代碼是作為二進(jìn)制數(shù)據(jù)存儲(chǔ)在內(nèi)存的,同樣程序的數(shù)據(jù)也在內(nèi)存中,因此直接從內(nèi)存的二進(jìn)制形式上是無(wú)法辨別哪些是數(shù)據(jù)哪些是代碼的,這也為緩沖區(qū)溢出襲擊提供了也許。圖1
進(jìn)程地址空間分布圖1是進(jìn)程地址空間分布的簡(jiǎn)樸表達(dá)。代碼存儲(chǔ)了顧客程序的所有可執(zhí)行代碼,在程序正常執(zhí)行的狀況下,程序計(jì)數(shù)器(PC指針)只會(huì)在代碼段和操作系統(tǒng)地址空間(內(nèi)核態(tài))內(nèi)尋址。數(shù)據(jù)段內(nèi)存儲(chǔ)了顧客程序的全局變量,文字池等。??臻g存儲(chǔ)了顧客程序的函數(shù)棧幀(包括參數(shù)、局部數(shù)據(jù)等),實(shí)現(xiàn)函數(shù)調(diào)用機(jī)制,它的數(shù)據(jù)增長(zhǎng)方向是低地址方向。堆空間存儲(chǔ)了程序運(yùn)行時(shí)動(dòng)態(tài)申請(qǐng)的內(nèi)存數(shù)據(jù)等,數(shù)據(jù)增長(zhǎng)方向是高地址方向。除了代碼段和受操作系統(tǒng)保護(hù)的數(shù)據(jù)區(qū)域,其他的內(nèi)存區(qū)域都也許作為緩沖區(qū),因此緩沖區(qū)溢出的位置也許在數(shù)據(jù)段,也也許在堆、棧段。假如程序的代碼有軟件漏洞,惡意程序會(huì)“教唆”程序計(jì)數(shù)器從上述緩沖區(qū)內(nèi)取指,執(zhí)行惡意程序提供的數(shù)據(jù)代碼!本文分析并實(shí)現(xiàn)棧溢出襲擊方式。二、函數(shù)棧幀棧的重要功能是實(shí)現(xiàn)函數(shù)的調(diào)用。因此在簡(jiǎn)介棧溢出原理之前,需要弄清函數(shù)調(diào)用時(shí)棧空間發(fā)生了怎樣的變化。每次函數(shù)調(diào)用時(shí),系統(tǒng)會(huì)把函數(shù)的返回地址(函數(shù)調(diào)用指令后緊跟指令的地址),某些關(guān)鍵的寄存器值保留在棧內(nèi),函數(shù)的實(shí)際參數(shù)和局部變量(包括數(shù)據(jù)、構(gòu)造體、對(duì)象等)也會(huì)保留在棧內(nèi)。這些數(shù)據(jù)統(tǒng)稱(chēng)為函數(shù)調(diào)用的棧幀,并且是每次函數(shù)調(diào)用都會(huì)有個(gè)獨(dú)立的棧幀,這也為遞歸函數(shù)的實(shí)現(xiàn)提供了也許。圖2
函數(shù)棧幀如圖所示,我們定義了一種簡(jiǎn)樸的函數(shù)function,它接受一種整形參數(shù),做一次乘法操作并返回。當(dāng)調(diào)用function(0)時(shí),arg參數(shù)記錄了值0入棧,并將callfunction指令下一條指令的地址0x00bd16f0保留到棧內(nèi),然后跳轉(zhuǎn)到function函數(shù)內(nèi)部執(zhí)行。每個(gè)函數(shù)定義都會(huì)有函數(shù)頭和函數(shù)尾代碼,如圖綠框表達(dá)。由于函數(shù)內(nèi)需要用ebp保留函數(shù)棧幀基址,因此先保留ebp本來(lái)的值到棧內(nèi),然后將棧指針esp內(nèi)容保留到ebp。函數(shù)返回前需要做相反的操作——將esp指針恢復(fù),并彈出ebp。這樣,函數(shù)內(nèi)正常狀況下無(wú)論怎樣使用棧,都不會(huì)使棧失去平衡。subesp,44h指令為局部變量開(kāi)辟了??臻g,例如ret變量的位置。理論上,function只需要再開(kāi)辟4字節(jié)空間保留ret即可,不過(guò)編譯器開(kāi)辟了更多的空間(這個(gè)問(wèn)題很詭異,你覺(jué)得呢?)。函數(shù)調(diào)用結(jié)束返回后,函數(shù)棧幀恢復(fù)到保留參數(shù)0時(shí)的狀態(tài),為了保持棧幀平衡,需要恢復(fù)esp的內(nèi)容,使用addesp,4將壓入的參數(shù)彈出。之因此會(huì)有緩沖區(qū)溢出的也許,重要是由于??臻g內(nèi)保留了函數(shù)的返回地址。該地址保留了函數(shù)調(diào)用結(jié)束后后續(xù)執(zhí)行的指令的位置,對(duì)于計(jì)算機(jī)安全來(lái)說(shuō),該信息是很敏感的。假如有人惡意修改了這個(gè)返回地址,并使該返回地址指向了一種新的代碼位置,程序便能從其他位置繼續(xù)執(zhí)行。三、棧溢出基本原理上邊給出的代碼是無(wú)法進(jìn)行溢出操作的,由于顧客沒(méi)有“插足”的機(jī)會(huì)。不過(guò)實(shí)際上諸多程序都會(huì)接受顧客的外界輸入,尤其是當(dāng)函數(shù)內(nèi)的一種數(shù)組緩沖區(qū)接受顧客輸入的時(shí)候,一旦程序代碼未對(duì)輸入的長(zhǎng)度進(jìn)行合法性檢查的話,緩沖區(qū)溢出便有也許觸發(fā)!例如下邊的一種簡(jiǎn)樸的函數(shù)。void
fun(unsigned
char
*data){unsigned
char
buffer[BUF_LEN];strcpy((char*)buffer,(char*)data);//溢出點(diǎn)}這個(gè)函數(shù)沒(méi)有做什么有“意義”的事情(這里重要是為了簡(jiǎn)化問(wèn)題),不過(guò)它是一種經(jīng)典的棧溢出代碼。在使用不安全的strcpy庫(kù)函數(shù)時(shí),系統(tǒng)會(huì)盲目地將data的所有數(shù)據(jù)拷貝到buffer指向的內(nèi)存區(qū)域。buffer的長(zhǎng)度是有限的,一旦data的數(shù)據(jù)長(zhǎng)度超過(guò)BUF_LEN,便會(huì)產(chǎn)生緩沖區(qū)溢出。圖3
緩沖區(qū)溢出由于棧是低地址方向增長(zhǎng)的,因此局部數(shù)組buffer的指針在緩沖區(qū)的下方。當(dāng)把data的數(shù)據(jù)拷貝到buffer內(nèi)時(shí),超過(guò)緩沖區(qū)區(qū)域的高地址部分?jǐn)?shù)據(jù)會(huì)“沉沒(méi)”原本的其他棧幀數(shù)據(jù),根據(jù)沉沒(méi)數(shù)據(jù)的內(nèi)容不一樣,也許會(huì)有產(chǎn)生如下?tīng)顩r:1、沉沒(méi)了其他的局部變量。假如被沉沒(méi)的局部變量是條件變量,那么也許會(huì)變化函數(shù)原本的執(zhí)行流程。這種方式可以用于破解簡(jiǎn)樸的軟件驗(yàn)證。2、沉沒(méi)了ebp的值。修改了函數(shù)執(zhí)行結(jié)束后要恢復(fù)的棧指針,將會(huì)導(dǎo)致棧幀失去平衡。3、沉沒(méi)了返回地址。這是棧溢出原理的關(guān)鍵所在,通過(guò)沉沒(méi)的方式修改函數(shù)的返回地址,使程序代碼執(zhí)行“意外”的流程!4、沉沒(méi)參數(shù)變量。修改函數(shù)的參數(shù)變量也也許變化目前函數(shù)的執(zhí)行成果和流程。5、沉沒(méi)上級(jí)函數(shù)的棧幀,狀況和上述4點(diǎn)類(lèi)似,只不過(guò)影響的是上級(jí)函數(shù)的執(zhí)行。當(dāng)然這里的前提是保證函數(shù)能正常返回,即函數(shù)地址不能被隨意修改(這也許很麻煩?。?。假如在data自身的數(shù)據(jù)內(nèi)就保留了一系列的指令的二進(jìn)制代碼,一旦棧溢出修改了函數(shù)的返回地址,并將該地址指向這段二進(jìn)制代碼的其實(shí)位置,那么就完畢了基本的溢出襲擊行為。圖4
基本棧溢出襲擊通過(guò)計(jì)算返回地址內(nèi)存區(qū)域相對(duì)于buffer的偏移,并在對(duì)應(yīng)位置構(gòu)造新的地址指向buffer內(nèi)部二進(jìn)制代碼的其實(shí)位置,便能執(zhí)行顧客的自定義代碼!這段既是代碼又是數(shù)據(jù)的二進(jìn)制數(shù)據(jù)被稱(chēng)為shellcode,由于襲擊者但愿通過(guò)這段代碼打開(kāi)系統(tǒng)的shell,以執(zhí)行任意的操作系統(tǒng)命令——例如下載病毒,安裝木馬,開(kāi)放端口,格式化磁盤(pán)等惡意操作。四、棧溢出襲擊上述過(guò)程雖然理論上能完畢棧溢出襲擊行為,不過(guò)實(shí)際上很難實(shí)現(xiàn)。操作系統(tǒng)每次加載可執(zhí)行文獻(xiàn)到進(jìn)程空間的位置都是無(wú)法預(yù)測(cè)的,因此棧的位置實(shí)際是不固定的,通過(guò)硬編碼覆蓋新返回地址的方式并不可靠。為了能精確定位shellcode的地址,需要借助某些額外的操作,其中最經(jīng)典的是借助跳板的棧溢出方式。根據(jù)前邊所述,函數(shù)執(zhí)行后,棧指針esp會(huì)恢復(fù)到壓入?yún)?shù)時(shí)的狀態(tài),在圖4中即data參數(shù)的地址。假如我們?cè)诤瘮?shù)的返回地址填入一種地址,該地址指向的內(nèi)存保留了一條特殊的指令jmpesp——跳板。那么函數(shù)返回后,會(huì)執(zhí)行該指令并跳轉(zhuǎn)到esp所在的位置——即data的位置。我們可以將緩沖區(qū)再多溢出一部分,沉沒(méi)data這樣的函數(shù)參數(shù),并在這里放上我們想要執(zhí)行的代碼!這樣,不管程序被加載到哪個(gè)位置,最終都會(huì)回來(lái)執(zhí)行棧內(nèi)的代碼。圖5
借助跳板的棧溢出襲擊借助于跳板確實(shí)可以很好的處理?xiàng)莆唬<虞d地址不固定)的問(wèn)題,不過(guò)跳板指令從哪找呢?“幸運(yùn)”的是,在Windows操作系統(tǒng)加載的大量dll中,包括了許多這樣的指令,例如kernel32.dll,ntdll.dll,這兩個(gè)動(dòng)態(tài)鏈接庫(kù)是Windows程序默認(rèn)加載的。假如是圖形化界面的Windows程序還會(huì)加載user32.dll,它也包括了大量的跳板指令!并且更“神奇”的是Windows操作系統(tǒng)加載dll時(shí)候一般都是固定地址,因此這些dll內(nèi)的跳板指令的地址一般都是固定的。我們可以離線搜索出跳板執(zhí)行在dll內(nèi)的偏移,并加上dll的加載地址,便得到一種合用的跳板指令地址!//查詢dll內(nèi)第一種jmp
esp指令的位置
int
findJmp(char*dll_name)
{
char*
handle=(char*)LoadLibraryA(dll_name);//獲取dll加載地址
for(int
pos=0;;pos++)//遍歷dll代碼空間
{
if(handle[pos]==(char)0xff&&handle[pos+1]==(char)0xe4)//尋找0xffe4
=
jmp
esp
{
return
(int)(handle+pos);
}
}
}這里簡(jiǎn)化了搜索算法,輸出第一種跳板指令的地址,讀者可以選用其他更合適位置。LoadLibraryA庫(kù)函數(shù)返回值就是dll的加載地址,然后加上搜索到的跳板指令偏移pos便是最終地址。jmpesp指令的二進(jìn)制表達(dá)為0xffe4,因此搜索算法就是搜索dll內(nèi)這樣的字節(jié)數(shù)據(jù)即可。雖然如此,上述的襲擊方式還不夠好。由于在esp后繼續(xù)追加shellcode代碼會(huì)將上級(jí)函數(shù)的棧幀沉沒(méi),這樣做并沒(méi)有什么好處,甚至也許會(huì)帶來(lái)運(yùn)行時(shí)問(wèn)題。既然被溢出的函數(shù)棧幀內(nèi)提供了緩沖區(qū),我們還是把關(guān)鍵的shellcode放在緩沖區(qū)內(nèi),而在esp之后放上跳轉(zhuǎn)指令轉(zhuǎn)移到原本的緩沖區(qū)位置。由于這樣做使代碼的位置在esp指針之前,假如shellcode中使用了push指令便會(huì)讓esp指令和shellcode代碼越來(lái)越近,甚至沉沒(méi)自身的代碼。這顯然不是我們想要的成果,因此我們可以強(qiáng)制抬高esp指針,使它在shellcode之前(低地址位置),這樣就能在shellcode內(nèi)正常使用push指令了。圖6
調(diào)整shellcode和棧指針調(diào)整代碼的內(nèi)容很簡(jiǎn)樸:
add
esp,-X
jmp
esp第一條指令抬高了棧指針到shellcode之前。X代表shellcode起始地址和esp的偏移。假如shellcode從緩沖區(qū)起始位置開(kāi)始,那么就是buffer的地址偏移。這里不使用subesp,X指令重要是防止X的高位字節(jié)為0的問(wèn)題,諸多狀況下緩沖區(qū)溢出是針對(duì)字符串緩沖區(qū)的,假如出現(xiàn)字節(jié)0會(huì)導(dǎo)致緩沖區(qū)截?cái)?,從而?dǎo)致溢出失敗。第二條指令就是跳轉(zhuǎn)到shellcode的起始位置繼續(xù)執(zhí)行。(又是jmpesp?。┩ㄟ^(guò)上述方式便能獲得一種較為穩(wěn)定的棧溢出襲擊。五、shellcode構(gòu)造shellcode實(shí)質(zhì)是指溢出后執(zhí)行的能啟動(dòng)系統(tǒng)shell的代碼。不過(guò)在緩沖區(qū)溢出襲擊時(shí),也可以將整個(gè)觸發(fā)緩沖區(qū)溢出襲擊過(guò)程的代碼統(tǒng)稱(chēng)為shellcode,按照這種定義可以把shellcode分為四部分:1、關(guān)鍵shellcode代碼,包括了襲擊者要執(zhí)行的所有代碼。2、溢出地址,是觸發(fā)shellcode的關(guān)鍵所在。3、填充物,填充未使用的緩沖區(qū),用于控制溢出地址的位置,一般使用nop指令填充——0x90表達(dá)。4、結(jié)束符號(hào)0,對(duì)于符號(hào)串shellcode需要用0結(jié)尾,防止溢出時(shí)字符串異常。前邊一直在圍繞溢出地址討論,并處理了shellcode組織的問(wèn)題,而最關(guān)鍵的代碼怎樣構(gòu)造并未提及——即襲擊成功后做的事情。其實(shí)一旦緩沖區(qū)溢出襲擊成功后,假如被襲擊的程序有系統(tǒng)的root權(quán)限——例如系統(tǒng)服務(wù)程序,那么襲擊者基本上可認(rèn)為所欲為了!不過(guò)我們需要清晰的是,關(guān)鍵shellcode必須是二進(jìn)制代碼形式。并且shellcode執(zhí)行時(shí)是在遠(yuǎn)程的計(jì)算機(jī)上,因此shellcode與否能通用是一種很復(fù)雜的問(wèn)題。我們可以用一段簡(jiǎn)樸的代碼實(shí)例來(lái)闡明這個(gè)問(wèn)題。緩沖區(qū)溢出成功后,一般大家都會(huì)但愿啟動(dòng)一種遠(yuǎn)程的shell控制被襲擊的計(jì)算機(jī)。啟動(dòng)shell最直接的方式便是調(diào)用C語(yǔ)言的庫(kù)函數(shù)system,該函數(shù)可以執(zhí)行操作系統(tǒng)的命令,就像我們?cè)诿钚邢聢?zhí)行命令那樣。假如我們執(zhí)行cmd命令——在遠(yuǎn)程計(jì)算機(jī)上啟動(dòng)一種命令提醒終端(我們也許還不能和它交互,不過(guò)可以在這之前建立一種遠(yuǎn)程管道等),這里僅作為實(shí)例測(cè)試。為了使system函數(shù)調(diào)用成功,我們需要將“cmd”字符串內(nèi)容壓入??臻g,并將其地址壓入作為system函數(shù)的參數(shù),然后使用call指令調(diào)用system函數(shù)的地址,完畢函數(shù)的執(zhí)行。不過(guò)這樣做還不夠,假如被溢出的程序沒(méi)有加載C語(yǔ)言庫(kù)的話,我們還需要調(diào)用Windows的APILoadlibrary加載C語(yǔ)言的庫(kù)msvcrt.dll,類(lèi)似的我們也需要為字符串“msvcrt.dll”開(kāi)辟??臻g。xor
ebx,ebx
;//ebx=0
push
0x3f3f6c6c
;//ll??push
0x642e7472
;//rt.dpush
0x6376736d
;//msvcmov
[esp+10],ebx
;//'?'->'0'mov
[esp+11],ebx
;//'?'->'0'mov
eax,esp
;//"msvcrt.dll"地址push
eax
;//"msvcrt.dll"mov
eax,0x77b62864
;//kernel32.dll:LoadLibraryAcall
eax
;//LoadLibraryA("msvcrt.dll")add
esp,16push
0x3f646d63
;//"cmd?"mov
[esp+3],ebx
;//'?'->'\0'mov
eax,esp;//"cmd"地址push
eax
;//"cmd"mov
eax,0x774ab16f
;//msvcrt.dll:systemcall
eax
;//system("cmd")add
esp,8上述匯編代碼實(shí)質(zhì)上是如下兩個(gè)函數(shù)調(diào)用語(yǔ)句:Loadlibrary(“msvcrt.dll”);system(“cmd”);
不過(guò)在構(gòu)造這段匯編代碼時(shí)需要注意不能出現(xiàn)字節(jié)0,為了填充字符串的結(jié)束字符,我們使用已經(jīng)初始化為0的ebx寄存器替代。此外,在對(duì)庫(kù)函數(shù)調(diào)用的時(shí)候需要提前計(jì)算出函數(shù)的地址,如Loadlibrary函數(shù)的0x77b62864。計(jì)算方式如下:int
findFunc(char*dll_name,char*func_name){HINSTANCE
handle=LoadLibraryA(dll_name);//獲取dll加載地址return
(int)GetProcAddress(handle,func_name);}這個(gè)函數(shù)地址是在當(dāng)?shù)赜?jì)算的,假如被襲擊計(jì)算機(jī)的操作系統(tǒng)版本差異較大的話,這個(gè)地址也許是錯(cuò)誤的。不過(guò)在《0day安全:軟件漏洞分析技術(shù)》中,作者提供了一種更好的方式,感愛(ài)好的讀者可以參照該書(shū)提供的代碼。因此構(gòu)造一種通用的shellcode并非十分輕易,假如想讓襲擊變得有效的話。六、匯編語(yǔ)言自動(dòng)轉(zhuǎn)換寫(xiě)出shellcode后(無(wú)論是簡(jiǎn)樸的還是通用的),我們還需要將這段匯編代碼轉(zhuǎn)換為機(jī)器代碼。假如讀者對(duì)x86匯編十分熟悉的話,選擇手工敲出二進(jìn)制代碼的話也未嘗不可。不過(guò)我們都但愿能讓計(jì)算機(jī)協(xié)助做完這些事,既然開(kāi)發(fā)環(huán)境提供了編譯器,用它們幫忙何樂(lè)而不為呢?既不用OllyDbg工具,也不合用其他的第三方工具,我們寫(xiě)一種簡(jiǎn)樸的函數(shù)來(lái)完畢這個(gè)工作。//將內(nèi)嵌匯編的二進(jìn)制指令dump到文獻(xiàn),style指定輸出數(shù)組格式還是二進(jìn)制形式,返回代碼長(zhǎng)度int
dumpCode(unsigned
char*buffer){goto
END
;//略過(guò)匯編代碼BEGIN:__asm{//在這里定義任意的合法匯編代碼}END://確定代碼范圍UINT
begin,end;__asm{mov
eax,BEGIN
;mov
begin,eax
;mov
eax,END
;mov
end,eax
;}//輸出int
len=end-begin;memcpy(buffer,(void*)begin,len);//四字節(jié)對(duì)齊int
fill=(len-len%4)%4;while(fill--)buffer[len+fill]=0x90;//返回長(zhǎng)度return
len+fill;}由于C++是支持嵌入式匯編代碼的,因此在函數(shù)內(nèi)的匯編代碼都會(huì)被整成編譯為二進(jìn)制代碼。實(shí)現(xiàn)二進(jìn)制轉(zhuǎn)換的基本思想是讀取編譯器最終身成的二進(jìn)制代碼段數(shù)據(jù),將數(shù)據(jù)導(dǎo)出到指定的緩沖區(qū)內(nèi)。為了鎖定嵌入式匯編代碼的位置和長(zhǎng)度,我們定義了兩個(gè)標(biāo)簽BEGIN和END。這兩個(gè)標(biāo)簽在匯編語(yǔ)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 4《四季》第二課時(shí) 教學(xué)設(shè)計(jì)-2024-2025學(xué)年統(tǒng)編版語(yǔ)文一年級(jí)上冊(cè)
- 2024-2025學(xué)年高中歷史 專(zhuān)題六 和平與發(fā)展-當(dāng)今世界的時(shí)代主題 一 爭(zhēng)取人類(lèi)和平(3)教學(xué)教學(xué)實(shí)錄 人民版選修3
- 8《望廬山瀑布》教學(xué)設(shè)計(jì)-2024-2025學(xué)年二年級(jí)上冊(cè)語(yǔ)文統(tǒng)編版
- IT項(xiàng)目監(jiān)理和管理咨詢服務(wù)協(xié)議
- 10《愛(ài)心的傳遞者》(教學(xué)設(shè)計(jì))2023-2024學(xué)年統(tǒng)編版道德與法治三年級(jí)下冊(cè)
- 2024-2025學(xué)年高中歷史 第二單元 西方人文精神的起源及其發(fā)展 第5課 西方人文主義思想的起源新課教學(xué)實(shí)錄2 新人教版必修3
- 2024年學(xué)年八年級(jí)道德與法治下冊(cè) 第一單元 堅(jiān)持憲法至上 第2課 第1框 堅(jiān)持依憲治國(guó)教學(xué)實(shí)錄 新人教版
- 6《導(dǎo)體和絕緣體》教學(xué)設(shè)計(jì)-2023-2024學(xué)年教科版科學(xué)四年級(jí)下冊(cè)
- 10 沙灘上的童話 教學(xué)設(shè)計(jì)-2023-2024學(xué)年語(yǔ)文二年級(jí)下冊(cè)統(tǒng)編版
- 2024年高中英語(yǔ) Unit 2 Integrated skills教學(xué)實(shí)錄 牛津譯林版選擇性必修第二冊(cè)
- TDT1055-2019第三次全國(guó)國(guó)土調(diào)查技術(shù)規(guī)程
- 【MOOC】電工學(xué)-中原工學(xué)院 中國(guó)大學(xué)慕課MOOC答案
- 濫用抗生素現(xiàn)狀及危害課件
- 2021年河南公務(wù)員行測(cè)考試真題及答案
- 廣告安裝施工及方案
- 應(yīng)急第一響應(yīng)人理論考試試卷(含答案)
- 2024年海南省公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 《預(yù)防未成年人犯罪》課件(圖文)
- 上下級(jí)關(guān)系與領(lǐng)導(dǎo)力管理制度
- 九年級(jí)化學(xué)人教版跨學(xué)科實(shí)踐3水質(zhì)檢測(cè)及自制凈水器教學(xué)設(shè)計(jì)
- 堆垛機(jī)保護(hù)保養(yǎng)手冊(cè)
評(píng)論
0/150
提交評(píng)論