華中科技大學計算機系統(tǒng)基礎(chǔ)實驗報告_第1頁
華中科技大學計算機系統(tǒng)基礎(chǔ)實驗報告_第2頁
華中科技大學計算機系統(tǒng)基礎(chǔ)實驗報告_第3頁
華中科技大學計算機系統(tǒng)基礎(chǔ)實驗報告_第4頁
華中科技大學計算機系統(tǒng)基礎(chǔ)實驗報告_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上課 程 實 驗 報 告課程名稱: 計算機系統(tǒng)基礎(chǔ) 專業(yè)班級: 學 號: 姓 名: 指導教師: 報告日期: 2016年 5月 24 日 計算機科學與技術(shù)學院目錄專心-專注-專業(yè)實驗1: 數(shù)據(jù)表示 1.1 實驗概述 本實驗的目的是更好地熟悉和掌握計算機中整數(shù)和浮點數(shù)的二進制編碼表示。實驗中,你需要解開一系列編程“難題”使用有限類型和數(shù)量的運算操作實現(xiàn)一組給定功能的函數(shù),在此過程中你將加深對數(shù)據(jù)二進制編碼表示的了解。實驗語言:c; 實驗環(huán)境: linux1.2 實驗內(nèi)容 需要完成 bits.c 中下列函數(shù)功能,具體分為三大類:位操作、補碼運算和浮點數(shù)操作。1.3 實驗設(shè)計

2、源碼如下:/* * lsbZero - set 0 to the least significant bit of x * Example: lsbZero(0x) = 0x * Legal ops: ! & | + << >> * Max ops: 5 * Rating: 1 */int lsbZero(int x) /x右移一位再左移一位實現(xiàn)把最低有效位置0 x = x>>1; x = x<<1; return x;/* * byteNot - bit-inversion to byte n from word x * Bytes n

3、umbered from 0 (LSB) to 3 (MSB) * Examples: getByteNot(0x,1) = 0x1234A978 * Legal ops: ! & | + << >> * Max ops: 6 * Rating: 2 */int byteNot(int x, int n) /x第n個字節(jié)每位都和1異或?qū)崿F(xiàn)取反 int y = 0xff; n = n<<3; y = y<<n; x = (xy); return x;/* * byteXor - compare the nth byte of x and y

4、, if it is same, return 0, if not, return 1 * example: byteXor(0x, 0x, 1) = 1 * byteXor(0x, 0x, 2) = 0 * Legal ops: ! & | + << >> * Max ops: 20 * Rating: 2 */int byteXor(int x, int y, int n) /把x和y的第n個字節(jié)取出來異或,再轉(zhuǎn)換為邏輯的0和1 n = n<<3; x = x>>n; y = y>>n; x = x&(0xff);

5、 y = y&(0xff); return !(xy);/* * logicalAnd - x && y * Legal ops: ! & | + << >> * Max ops: 20 * Rating: 3 */int logicalAnd(int x, int y) /把x和y分別轉(zhuǎn)化為邏輯的0和1,再相與 x = (!(!x)&(!(!y); return x;/* * logicalOr - x | y * Legal ops: ! & | + << >> * Max ops: 20 *

6、Rating: 3 */int logicalOr(int x, int y) /把x和y分別轉(zhuǎn)化為邏輯的0和1,再相或 x = (!(!x)|(!(!y); return x;/* * rotateLeft - Rotate x to the left by n * Can assume that 0 <= n <= 31 * Examples: rotateLeft(0x,4) = 0x * Legal ops: & | + << >> ! * Max ops: 25 * Rating: 3 */int rotateLeft(int x, int

7、 n) /先構(gòu)造低n位為1,高(32-n)位為0的數(shù)z,x左移n位后的數(shù)加上x右移(32-n)位的數(shù)&z即可 int z; z = (1<<31)>>31)<<n); x = (x>>(32+(n+1)&z)+(x<<n); return x;/* * parityCheck - returns 1 if x contains an odd number of 1's * Examples: parityCheck(5) = 0, parityCheck(7) = 1 * Legal ops: ! &

8、| + << >> * Max ops: 20 * Rating: 4 */int parityCheck(int x) /每次將數(shù)的低半數(shù)位與高半數(shù)位比較,再把y右移31位,最后把y轉(zhuǎn)化為邏輯的0和1 int y; y = x<<16; y = yx; y = y(y<<8); y = y(y<<4); y = y(y<<2); y = y(y<<1); y = y>>31; return !(!y);/* * mul2OK - Determine if can compute 2*x witho

9、ut overflow * Examples: mul2OK(0x) = 1 * mul2OK(0x) = 0 * * Legal ops: & | + << >> * Max ops: 20 * Rating: 2 */int mul2OK(int x) /把x第31位和30位分別和1做按位與,再異或,再和1異或 int m; m = (x>>31)&0x1)(x>>30)&0x1); return m0x1;/* * mult3div2 - multiplies by 3/2 rounding toward 0, *

10、Should exactly duplicate effect of C expression (x*3/2), * including overflow behavior. * Examples: mult3div2(11) = 16 * mult3div2(-9) = -13 * mult3div2() = -(overflow) * Legal ops: ! & | + << >> * Max ops: 12 * Rating: 2 */int mult3div2(int x) /左移一位再+x即x*3,右移一位的時候,當y的最高位和最低位都為0時還要+1

11、 int y = (x<<1)+x; y = (y>>1)+(y>>31)&1)&(y<<31)>>31)&1); return y;/* * subOK - Determine if can compute x-y without overflow * Example: subOK(0x,0x) = 1, * subOK(0x,0x) = 0, * Legal ops: ! & | + << >> * Max ops: 20 * Rating: 3 */int subOK(in

12、t x, int y) /x的最高有效位和y的最高有效位不同且x和(x-y)的最高位不同才能判斷溢出 int m = (x>>31)&1; int n = (y>>31)&1; x = (mn)&(m(x+(y+1)>>31)&1); return (!x);/* * absVal - absolute value of x * Example: absVal(-1) = 1. * You may assume -TMax <= x <= TMax * Legal ops: ! & | + <<

13、 >> * Max ops: 10 * Rating: 4 */int absVal(int x) /x最高位為0時就是x,最高位為1時是x+1 int y = x>>31; x = (y&(x+1)+(y)&x); return x;/* * float_abs - Return bit-level equivalent of absolute value of f for * floating point argument f. * Both the argument and result are passed as unsigned int'

14、;s, but * they are to be interpreted as the bit-level representations of * single-precision floating point values. * When argument is NaN, return argument. * Legal ops: Any integer/unsigned operations incl. |, &&. also if, while * Max ops: 10 * Rating: 2 */unsigned float_abs(unsigned uf) int

15、 x=uf&(1<<31); if(x>0x7f) return uf; else return x;/* * float_f2i - Return bit-level equivalent of expression (int) f * for floating point argument f. * Argument is passed as unsigned int, but * it is to be interpreted as the bit-level representation of a * single-precision floating poi

16、nt value. * Anything out of range (including NaN and infinity) should return * 0xu. * Legal ops: Any integer/unsigned operations incl. |, &&. also if, while * Max ops: 30 * Rating: 4 */int float_f2i(unsigned uf) unsigned num=0x; int x=(uf&0x007fffff)0x; int order=0; order=(uf&0x7f)&g

17、t;>23; if(order>158) return num; if(order<127) return 0; else if(uf>>31)&1)=1) if(order>150) return (x<<(order-150)+1; else return (x>>(150-order)+1; else if(order>150) return x<<(order-150); else return x>>(150-order); 1.4 實驗過程編寫源碼,運行btest,得出實驗結(jié)果。1.5

18、實驗結(jié)果 可見13個函數(shù)全部正確。1.6實驗小結(jié) 此次實驗主要考查的是對數(shù)據(jù)的處理,對此需要掌握數(shù)據(jù)在機器中的表示,運用合理的位運算來實現(xiàn)相應(yīng)的功能。實驗2: Binary Bombs 2.1 實驗概述本實驗中,你要使用課程所學知識拆除一個“binary bombs”來增強對程序的機器級表示、匯編語言、調(diào)試器和逆向工程等方面原理與技能的掌握。一個“binary bombs”(二進制炸彈,下文將簡稱為炸彈)是一個Linux可執(zhí)行C程序,包含了6個階段(phase1phase6)。炸彈運行的每個階段要求你輸入一個特定的字符串,若你的輸入符合程序預(yù)期的輸入,該階段的炸彈就被“拆除”,否則炸彈“爆炸”

19、并打印輸出 "BOOM!"字樣。實驗的目標是拆除盡可能多的炸彈層次。每個炸彈階段考察了機器級語言程序的一個不同方面,難度逐級遞增:* 階段1:字符串比較* 階段2:循環(huán)* 階段3:條件/分支* 階段4:遞歸調(diào)用和棧* 階段5:指針* 階段6:鏈表/指針/結(jié)構(gòu)另外還有一個隱藏階段,但只有當你在第4階段的解之后附加一特定字符串后才會出現(xiàn)。 為了完成二進制炸彈拆除任務(wù),你需要使用gdb調(diào)試器和objdump來反匯編炸彈的可執(zhí)行文件,并單步跟蹤調(diào)試每一階段的機器代碼,從中理解每一匯編語言代碼的行為或作用,進而設(shè)法“推斷”出拆除炸彈所需的目標字符串。這可能需要你在每一階段的開始代碼前

20、和引爆炸彈的函數(shù)前設(shè)置斷點,以便于調(diào)試。實驗語言:C語言實驗環(huán)境:linux2.2 實驗內(nèi)容反匯編bomb,得到匯編代碼,根據(jù)匯編代碼完成拆炸彈任務(wù)。2.2.1 階段1 字符串比較1.任務(wù)描述:找到與輸入的字符串進行比較的存儲的字符串的首地址,進而得到存儲的字符串,得到結(jié)果。2.實驗設(shè)計:根據(jù)反匯編代碼一步一步分析,具體見實驗過程。3.實驗過程:將bomb反匯編輸出到asm.txt文件中,在反匯編代碼中查找phase_1的位置:從上面的語句可以看出<strings_not_equal>所需要的兩個變量是存在于%ebp所指的堆棧存儲單元里,在main函數(shù)中:得知%eax里存儲的是調(diào)用

21、read_line()函數(shù)后返回的結(jié)果,就是輸入的字符串,所以得知和用戶輸入字符串比較的字符串的存儲地址為0x804a204,可用gdb查看這個地址存儲的數(shù)據(jù)內(nèi)容:翻譯過后的結(jié)果為The future will be better tomorrow.4.實驗結(jié)果:可見結(jié)果正確。2.2.2 階段2 循環(huán)1.任務(wù)描述:完成炸彈2的拆除 2.實驗設(shè)計:觀察分析phase_2代碼,使用gdb調(diào)試分析結(jié)果3.實驗過程:找到phase_2代碼:由read_six_numbers知是要輸入6個數(shù)字,觀察:可知輸入的第一個和第二個必須依次為0,1觀察這兩個循環(huán)可知只有當輸入的數(shù)為前兩個數(shù)之和時才不會bomb,

22、故得到序列0,1,1,2,3,54.實驗結(jié)果:輸入上述序列后得:可知結(jié)果正確。2.2.3 階段3 條件/分支1.任務(wù)描述:完成炸彈3的拆除 2.實驗設(shè)計:觀察分析phase_3代碼,使用gdb調(diào)試分析結(jié)果3.實驗過程:找到phase_3代碼如下:08048c0a <phase_3>: 8048c0a:83 ec 3c sub $0x3c,%esp 8048c0d:8d 44 24 2c lea 0x2c(%esp),%eax 8048c11:89 44 24 10 mov %eax,0x10(%esp) 8048c15:8d 44 24 27 lea 0x27(%esp),%eax

23、 8048c19:89 44 24 0c mov %eax,0xc(%esp) 8048c1d:8d 44 24 28 lea 0x28(%esp),%eax 8048c21:89 44 24 08 mov %eax,0x8(%esp) 8048c25:c7 44 24 04 4e a2 04 movl $0x804a24e,0x4(%esp)由此行代碼查看輸入內(nèi)容:可知輸入的依次是數(shù)字、字符、數(shù)字 8048c43:83 7c 24 28 07 cmpl $0x7,0x28(%esp) 8048c48:0f 87 f5 00 00 00 ja 8048d43 <phase_3+0x139

24、> 8048d43:e8 8d 04 00 00 call 80491d5 <explode_bomb>可見輸入的第一個數(shù)一定小于7 8048c4e:8b 44 24 28 mov 0x28(%esp),%eax 8048c52:ff 24 85 60 a2 04 08 jmp *0x804a260(,%eax,4)假設(shè)輸入的第一個數(shù)為0,即(%eax)=0,所以: 8048c59:b8 76 00 00 00 mov $0x76,%eax 8048c5e:81 7c 24 2c 04 01 00 cmpl $0x104,0x2c(%esp)所以第二個字符ascll碼為0x7

25、6,即字符'v'而第三個數(shù)為0x104,即2604.實驗結(jié)果:從實驗結(jié)果來看結(jié)果正確,拆彈成功。2.2.4 階段4 遞歸調(diào)用和棧1.任務(wù)描述:拆除炸彈4 2.實驗設(shè)計:觀察分析phase_4代碼,使用gdb調(diào)試分析結(jié)果3.實驗過程:用x/sb 0x804a3cf 來查詢有幾個輸入以及輸入的類型,如下所示:由此可見輸入是兩個整數(shù)。再由phase_4中:知道func4第二個參數(shù)值為1f,即37再仔細研究func4函數(shù),發(fā)現(xiàn)其實現(xiàn)了遞歸調(diào)用:08048d5c <func4>: 8048d5c:56 push %esi 8048d5d:53 push %ebx 8048d5

26、e:83 ec 14 sub $0x14,%esp 8048d61:8b 54 24 20 mov 0x20(%esp),%edx /ebx是傳遞的參數(shù)/ 8048d65:8b 44 24 24 mov 0x24(%esp),%eax 8048d69:8b 74 24 28 mov 0x28(%esp),%esi 8048d6d:89 f1 mov %esi,%ecx 8048d6f:29 c1 sub %eax,%ecx 8048d71:89 cb mov %ecx,%ebx 8048d73:c1 eb 1f shr $0x1f,%ebx / ebx 右移31位 / 8048d76:01 d

27、9 add %ebx,%ecx 8048d78:d1 f9 sar %ecx 8048d7a:8d 1c 01 lea (%ecx,%eax,1),%ebx 8048d7d:39 d3 cmp %edx,%ebx 8048d7f:7e 17 jle 8048d98 <func4+0x3c> 8048d81:8d 4b ff lea -0x1(%ebx),%ecx 8048d84:89 4c 24 08 mov %ecx,0x8(%esp) 8048d88:89 44 24 04 mov %eax,0x4(%esp) 8048d8c:89 14 24 mov %edx,(%esp)

28、8048d8f:e8 c8 ff ff ff call 8048d5c <func4> 8048d94:01 d8 add %ebx,%eax 8048d96:eb 1b jmp 8048db3 <func4+0x57> 8048d98:89 d8 mov %ebx,%eax 8048d9a:39 d3 cmp %edx,%ebx 8048d9c:7d 15 jge 8048db3 <func4+0x57> 8048d9e:89 74 24 08 mov %esi,0x8(%esp) 8048da2:8d 43 01 lea 0x1(%ebx),%eax 8

29、048da5:89 44 24 04 mov %eax,0x4(%esp) 8048da9:89 14 24 mov %edx,(%esp) 8048dac:e8 ab ff ff ff call 8048d5c <func4> 8048db1:01 d8 add %ebx,%eax 8048db3:83 c4 14 add $0x14,%esp 8048db6:5b pop %ebx 8048db7:5e pop %esi 8048db8:c3 ret 下面就來剖析func4,這個函數(shù)在確定棧之后,首先取出來傳遞給它的參數(shù),依次放在eax,edx,esi.中,從一個jle和一個j

30、ge可以看出,這個遞歸函數(shù)跳出的條件根據(jù)func4的第二個參數(shù)和第二個參數(shù)進過種種運算的結(jié)果等于第一個參數(shù)即可。注意在遞歸過程中第一個參數(shù)是不變的,最后返回值是經(jīng)過運算后的ebx加上第一個參數(shù)。當時做實驗時推出了具體的表達式,未記錄下來,只記錄了最后得出fun(11)=31。運行結(jié)果如下:由此可見,phase_4拆除成功!4.實驗結(jié)果:給出階段x的實驗結(jié)果和必要的結(jié)果分析2.2.5 階段5 phase_51.任務(wù)描述:拆除一個關(guān)于指針的炸彈。2.實驗設(shè)計: 此階段實驗與指針相關(guān),又根據(jù)靜態(tài)調(diào)試跟蹤可知,需借助gdb的動態(tài)調(diào)試跟蹤來查找相關(guān)地址中存放的數(shù)據(jù)的值,進而分析出最終的拆彈密碼。3.實驗

31、過程: 首先觀察代碼,分析代碼時發(fā)現(xiàn)有多個跳轉(zhuǎn)指令,具體為x>15時,bomb;x>=1時,取x低4位;使用gdb調(diào)試發(fā)現(xiàn),要輸入的是兩個%d數(shù)。由后面的步驟知輸入第一個數(shù)為初始數(shù)組下標,第二個數(shù)為循環(huán)15次累加求的和。再接著: 8048e70:8b 04 85 80 a2 04 08 mov 0x804a280(,%eax,4),%eax,這句就是從(0x804a280+eax*4)里面拿數(shù)據(jù)出來,加到eax上。因為eax只能是0F的數(shù),所以0x804a260 這個地址里面存的應(yīng)該是一個數(shù)據(jù)大小為16的數(shù)組,用gdb看,得到:觀察到果然是一個數(shù)組,然后下面就是把5個輸入對應(yīng)asc

32、ll碼的低4位轉(zhuǎn)換的十進制數(shù)對應(yīng)的數(shù)值一個一個的轉(zhuǎn)化為這個數(shù)組,得到累加值ecx。觀察循環(huán)部分:由此知當退出循環(huán)的條件是取出的數(shù)eax為15,而且循環(huán)次數(shù)為15次由于115=12+3+7+11+13+9+4+8+10+1+2+14+6+15=a(5)+a(12).+a(6)最后得到的ecx值是115,輸入的初始數(shù)組下標為5。所以答案為:5 1154.實驗結(jié)果:可知結(jié)果正確。2.2.6 階段6 phase_61.任務(wù)描述:拆除一個關(guān)于鏈表/指針/結(jié)構(gòu)的炸彈。2.實驗設(shè)計:初步靜態(tài)分析,此階段代碼有些過長,所以單純通過靜態(tài)調(diào)試跟蹤有些困難,因此我首先找到幾個循環(huán)體,通過靜態(tài)調(diào)試跟蹤和動態(tài)調(diào)試跟蹤的

33、方法來確認循環(huán)體的功能,最后將循環(huán)體結(jié)合起來,拆除此階段炸斷。3.實驗過程:由于代碼較長,為便于分析,先總結(jié)一下,phase_6分為:參數(shù)讀取,一個雙層循環(huán),三個單層循環(huán)。首先是參數(shù)讀?。河纱丝梢?,readsix_number所有參數(shù)均小于6且不相等。 由于后面代碼部分過多,便采用gdb單步執(zhí)行來了解代碼的功能。在此,觀察到后面:可以看到輸入六個數(shù)字的初始地址值在0x804c13c,再由for循環(huán)中: 8048ebf:8b 52 08 mov 0x8(%edx),%edx 可以看出六個數(shù)字按8個字節(jié)的順序進行排列,因此分別調(diào)用gdb查看 (0x804c13c) 、*(0x804c13c+0x8

34、)、*(*(0x804c13c+0x8)+0x8)、*(*(*(0x804c13c+0x8)+0x8)+0x8) 、*(*(*(*(0x804c13c+0x8)+0x8)+0x8)+0x8)、*(*(*(*(*(0x804c13c+0x8)+0x8)+0x8)+0x8)+0x8) 的值即可。如圖所示:在下面檢測鏈表值時,要求鏈表值從大到小排列。由上圖可以看出,鏈表原本各個位置的值按順序排列位:292 385 c6 3db 7e 308。按從小到大順序排列應(yīng)該為:7e c6 292 308 385 3db。由此可以看出,用戶應(yīng)該輸入:5 3 1 6 2 4。4.實驗結(jié)果:可見結(jié)果正確。 1.3

35、實驗小結(jié)本次實驗熟悉了obj、gdb的各種操作,對數(shù)據(jù)在計算機中的存儲有了更加清晰的認識,更加加深了對匯編代碼的理解,對循環(huán)、分支、數(shù)組指針結(jié)構(gòu)在機器內(nèi)部的存儲有了更深刻的認識。實驗3: 緩沖區(qū)溢出攻擊 3.1 實驗概述 本實驗的目的在于加深對IA-32函數(shù)調(diào)用規(guī)則和棧結(jié)構(gòu)的具體理解。實驗的主要內(nèi)容是對一個可執(zhí)行程序“bufbomb”實施一系列緩沖區(qū)溢出攻擊(buffer overflow attacks),也就是設(shè)法通過造成緩沖區(qū)溢出來改變該可執(zhí)行程序的運行內(nèi)存映像,繼而執(zhí)行一些原來程序中沒有的行為,例如將給定的字節(jié)序列插入到其本不應(yīng)出現(xiàn)的內(nèi)存位置等。本次實驗需要你熟練運用gdb、objdu

36、mp、gcc等工具完成。實驗中你需要對目標可執(zhí)行程序BUFBOMB分別完成5個難度遞增的緩沖區(qū)溢出攻擊。5個難度級分別命名為Smoke(level 0)、Fizz(level 1)、Bang(level 2)、Boom(level 3)和Nitro(level 4),其中Smoke級最簡單而Nitro級最困難。實驗語言:c;實驗環(huán)境:linux3.2 實驗內(nèi)容設(shè)法通過造成緩沖區(qū)溢出來改變該可執(zhí)行程序的運行內(nèi)存映像,繼而執(zhí)行一些原來程序中沒有的行為。3.2.0 階段0 smoke1.任務(wù)描述:將getbuf函數(shù)執(zhí)行return后執(zhí)行test函數(shù)改為執(zhí)行smoke函數(shù)。2.實驗設(shè)計:首先根據(jù)反匯編

37、代碼求得buf離返回地址的字節(jié)距離,確定要填充幾個字節(jié),然后找到smoke函數(shù)的起始地址,把這個地址填入buf末尾,即可實現(xiàn)該功能。3.實驗過程:首先通過gdb工具對bufbomb文件進行反匯編,查看getbuf的匯編代碼:可見lea把buf的指針地址-0x28(%ebp)傳給了Gets(),所以buf離返回地址有0x28+4=44個字節(jié)的距離,因此只要在buf處開始填44個字節(jié)的非'n'數(shù),接下來填寫要返回的地址,因為要返回至smoke,查看smoke函數(shù)的代碼:可見smoke函數(shù)起始地址為0x08048c90,所以最后四個字節(jié)應(yīng)該填入90 8c 04 08,所以輸入的48個

38、字節(jié)為:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 90 8c 04 084.實驗結(jié)果:可見getbuf成功返回至smoke。3.2.1 階段1 fizz1.任務(wù)描述:將getbuf函數(shù)執(zhí)行return后執(zhí)行test函數(shù)改為執(zhí)行fizz函數(shù)。2.實驗設(shè)計:跟階段0類似,多了一個比較cookie環(huán)節(jié),所以要把cookie填入相應(yīng)地址。3.實驗過程:只是將執(zhí)行的函數(shù)從smoke改為

39、fizz,查看fizz的匯編代碼:可知val變量存儲地址為fizz函數(shù)中的0x8(%ebp),而fizz函數(shù)開始的地址為08048cba,所以輸入的前44個字節(jié)為非'n'任意值,第45-48個字節(jié)存放fizz函數(shù)起始地址,即ba 8c 04 08,接下來4字節(jié)也是非'n'值,最后為cookie值,即07 ab 99 67,所以輸入的56個字節(jié)為00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

40、00 00 00 00 00 00 00 ba 8c 04 08 00 00 00 00 07 ab 99 674.實驗結(jié)果:可見成功返回至fizz。3.2.2 階段2 bang1.任務(wù)描述: 將getbuf函數(shù)執(zhí)行return后執(zhí)行test函數(shù)改為執(zhí)行bang函數(shù) 。2.實驗設(shè)計:找到cookie的地址和global_value的地址,將global_value的值改為cookie值,再使函數(shù)成功跳至bang執(zhí)行。3.實驗過程:先觀察bang的代碼:bang函數(shù)的首地址0x08048d05,在bang函數(shù)中,會將全局變量global_value和cookie進行比較,global_value

41、的地址是0x804c218,cookie的地址是0x804c220,global_value在c代碼中顯示為0,所以需要修改global_value的值使其與cookie一致。匯編代碼為:mov0x804c220,%eaxmov%eax,0x804c218ret將這4行代碼保存至example.s文件,進行匯編和反匯編,查看example.d文件得到指令序列:a1 20 c2 04 08 a3 18 c2 04 08 c3設(shè)置斷點查看cookie為 0x6799ab07時buf的首地址:為0x,綜合之前的指令序列,45-48字節(jié)放buf首址,49-52放bang函數(shù)首址,得到:a1 20 c2 04 08 a3 18 c2 04 08 c3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論