二進制炸彈實驗報告_第1頁
二進制炸彈實驗報告_第2頁
二進制炸彈實驗報告_第3頁
二進制炸彈實驗報告_第4頁
二進制炸彈實驗報告_第5頁
已閱讀5頁,還剩13頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、二進制炸彈實驗報告實驗目的: 通過二進制炸彈實驗,熟悉匯編語言及其機器碼表示,熟悉GDB調試工具。實驗簡介:這個實驗是一個過關游戲,共有6關。在一臺Linux服務器上有一個可執行的炸彈文件,運行它游戲就開始了。每一關相當于是一扇門,要求你輸入密碼,只有密碼正確才能通過,進入下一關,否則它會“爆炸”,每輸入錯誤一次就會“爆炸”一次,服務器會記錄你“爆炸”的次數,“爆炸”次數越多扣分越多。你是一位“黑客”,你所擁有的所有資源就是這個可執行的炸彈文件,你需要破譯這個炸彈文件,從中找出每一關的過關密碼,如果破譯錯誤,你需要付出相應的代價。實驗流程:一、 使用PuTTy登錄并修改密碼l PuTTY 是一

2、套免費的SSH/Telnet 程序,相當于一個跨平臺的遠程登錄工具,通過它登錄遠程Linux主機進行實驗操作。l 登錄后通過passwd username指令修改密碼。二、 反匯編并利用winscp工具下載反匯編代碼l 通過ls指令顯示當前目錄下的文件,找到壓縮包bomb56.tar,即目標炸彈。通過tar xvf bomb56.tar解壓此壓縮包,然后再通過ls顯示解壓出的文件:bomb、bomb.c和README。l 通過objdump d bomb >>bomb.txt將炸彈程序反匯編并重定向到bomb.txt,通過ls顯示反匯編出的代碼文件bomb.txt。l 打開wins

3、cp工具,登錄到遠程主機,將遠程主機上的文件下載到本機上,便于查看。三、 查看目標文件并做好調試準備l 文件介紹:bomb.txt:反匯編得到的代碼文件,也是主要研究的目標文件。bomb.c:主函數,通過調用每一關的函數實現,未顯示每關的具體代碼。bomb:炸彈程序,當調試得出每一關的密碼后打開程序運行來拆炸彈。l 通過gdb bomb指令進入gdb調試環境。l 大致瀏覽反匯編代碼,可以觀察到整個程序一共有六關,分別為phase_1到phase_6,并有一關隱藏關secret_phase,每次輸入錯誤時會調用引爆函數explode_bomb,因此為避免調試時引爆炸彈,需要首先在引爆函數前設置斷

4、點,即break explode_bomb。四、 第一關炸彈拆除08048c10 <phase_1>: 8048c10:83 ec 1c sub $0x1c,%esp /取0x8049a04處的內容存入%esp+4 8048c13:c7 44 24 04 04 9a 04 movl $0x8049a04,0x4(%esp) 8048c1a:08 /取用戶輸入的內容存入%esp 8048c1b:8b 44 24 20 mov 0x20(%esp),%eax 8048c1f:89 04 24 mov %eax,(%esp) /調用字符串比較函數 8048c22:e8 1d 04 00

5、00 call 8049044 <strings_not_equal> /判斷%eax是否為0,為0跳轉,不為0引爆 8048c27:85 c0 test %eax,%eax 8048c29:74 05 je 8048c30 <phase_1+0x20> 8048c2b:e8 a3 09 00 00 call 80495d3 <explode_bomb> /撤銷棧楨,返回 8048c30:83 c4 1c add $0x1c,%esp 8048c33:c3 ret 程序流程:1. 取內存地址0x8049a04處的內容;2. 取用戶輸入的內容(即密碼);3.

6、比較兩者的值,相等則%eax置為0,進入下一關,不相等則調用引爆程序引爆炸彈。破解思路:通過p (char *) 0x8049a04指令取出該地址的字符串,得到: 因此第一關的密碼:For NASA, space is still a high priority.五、 第二關炸彈拆除08048c34 <phase_2>: 8048c34:53 push %ebx 8048c35:83 ec 38 sub $0x38,%esp 8048c38:8d 44 24 18 lea 0x18(%esp),%eax 8048c3c:89 44 24 04 mov %eax,0x4(%esp)

7、/取用戶輸入的內容,存入%esp 8048c40:8b 44 24 40 mov 0x40(%esp),%eax 8048c44:89 04 24 mov %eax,(%esp) /調用函數read_six_numbers 8048c47:e8 8c 0a 00 00 call 80496d8 <read_six_numbers> /比較第一個輸入的的數是否為1 8048c4c:83 7c 24 18 01 cmpl $0x1,0x18(%esp) /若為1則跳轉下一步,否則引爆 8048c51:74 05 je 8048c58 <phase_2+0x24> 8048c

8、53:e8 7b 09 00 00 call 80495d3 <explode_bomb> /設置循環變量初始值%ebx=1 8048c58:bb 01 00 00 00 mov $0x1,%ebx /循環開始 /保存當前循環變量 %eax <- %ebx 8048c5d:89 d8 mov %ebx,%eax /循環變量后移 %edx <- %ebx+=1 8048c5f:83 c3 01 add $0x1,%ebx 8048c62:89 da mov %ebx,%edx /%edx *= *(%esp+%eax*4+14) 8048c64:0f af 54 84 1

9、4 imul 0x14(%esp,%eax,4),%edx /比較%edx與*(%esp+%eax*4+18) 8048c69:39 54 84 18 cmp %edx,0x18(%esp,%eax,4) /相等則跳轉下一步,否則引爆 8048c6d:74 05 je 8048c74 <phase_2+0x40> 8048c6f:e8 5f 09 00 00 call 80495d3 <explode_bomb> /比較%ebx是否為6,不等則繼續循環 8048c74:83 fb 06 cmp $0x6,%ebx 8048c77:75 e4 jne 8048c5d &l

10、t;phase_2+0x29> /循環結束,撤銷棧楨,返回 8048c79:83 c4 38 add $0x38,%esp 8048c7c:5b pop %ebx 8048c7d:c3 ret 程序流程:1. 讀取用戶輸入內容(為6個數字);2. 判斷輸入的第一個值是否為1,不是則引爆炸彈;3. 做一個6次循環,判斷后一個數是否等于前一個數乘當前循環變量,不是則引爆炸彈;4. 六個數字判斷相等結束后,進入下一關破解思路:設輸入內容為一個數組Key6,則可知Key0=1,Keyi+1=Keyi*(i+1)。因此第二關的密碼是:1 2 6 24 120 720六、 第三關炸彈拆除08048c

11、7e <phase_3>: 8048c7e:83 ec 2c sub $0x2c,%esp /用戶輸入的參數2存在%esp+1c 8048c81:8d 44 24 1c lea 0x1c(%esp),%eax 8048c85:89 44 24 0c mov %eax,0xc(%esp) /用戶輸入的參數1存在%esp+18 8048c89:8d 44 24 18 lea 0x18(%esp),%eax 8048c8d:89 44 24 08 mov %eax,0x8(%esp) /取出地址8049dfa中的內容”%d %d” 8048c91:c7 44 24 04 fa 9d 04

12、 movl $0x8049dfa,0x4(%esp) 8048c98:08 8048c99:8b 44 24 30 mov 0x30(%esp),%eax 8048c9d:89 04 24 mov %eax,(%esp) /調用sscanf函數,傳入輸入參數 8048ca0:e8 6b fc ff ff call 8048910 <_isoc99_sscanfplt> /判斷返回值是否大于1,大于則引爆 8048ca5:83 f8 01 cmp $0x1,%eax 8048ca8:7f 05 jg 8048caf <phase_3+0x31> 8048caa:e8 24

13、 09 00 00 call 80495d3 <explode_bomb> /比較參數1是否大于7,大于則引爆 8048caf:83 7c 24 18 07 cmpl $0x7,0x18(%esp) 8048cb4:77 66 ja 8048d1c <phase_3+0x9e> /把參數1存入%eax,作為地址搜索變量 8048cb6:8b 44 24 18 mov 0x18(%esp),%eax /跳轉到地址0x8049a60+4*%eax處 8048cba:ff 24 85 60 9a 04 08 jmp *0x8049a60(,%eax,4) /參數1為1時跳轉到

14、此處,并繼續跳轉 8048cc1:b8 00 00 00 00 mov $0x0,%eax /1 8048cc6:eb 05 jmp 8048ccd <phase_3+0x4f> /參數1為0時跳轉到此處,并繼續跳轉 8048cc8:b8 40 01 00 00 mov $0x140,%eax /0 8048ccd:2d a6 00 00 00 sub $0xa6,%eax 8048cd2:eb 05 jmp 8048cd9 <phase_3+0x5b> /參數1為2時跳轉到此處,并繼續跳轉 8048cd4:b8 00 00 00 00 mov $0x0,%eax /2

15、 8048cd9:05 b6 01 00 00 add $0x1b6,%eax 8048cde:eb 05 jmp 8048ce5 <phase_3+0x67>/參數1為3時跳轉到此處,并繼續跳轉 8048ce0:b8 00 00 00 00 mov $0x0,%eax /3 8048ce5:2d db 01 00 00 sub $0x1db,%eax 8048cea:eb 05 jmp 8048cf1 <phase_3+0x73> /參數1為4時跳轉到此處,并繼續跳轉 8048cec:b8 00 00 00 00 mov $0x0,%eax /4 8048cf1:05

16、 6d 03 00 00 add $0x36d,%eax 8048cf6:eb 05 jmp 8048cfd <phase_3+0x7f> /參數1為5時跳轉到此處,并繼續跳轉 8048cf8:b8 00 00 00 00 mov $0x0,%eax /5 8048cfd:2d f4 00 00 00 sub $0xf4,%eax 8048d02:eb 05 jmp 8048d09 <phase_3+0x8b> /參數1為6時跳轉到此處,并繼續跳轉 8048d04:b8 00 00 00 00 mov $0x0,%eax /6 8048d09:05 f4 00 00 0

17、0 add $0xf4,%eax 8048d0e:eb 05 jmp 8048d15 <phase_3+0x97> /參數1為7時跳轉到此處,并繼續跳轉 8048d10:b8 00 00 00 00 mov $0x0,%eax /7 8048d15:2d 9e 02 00 00 sub $0x29e,%eax 8048d1a:eb 0a jmp 8048d26 <phase_3+0xa8> 8048d1c:e8 b2 08 00 00 call 80495d3 <explode_bomb> 8048d21:b8 00 00 00 00 mov $0x0,%e

18、ax /比較參數1是否大于5,大于則引爆 8048d26:83 7c 24 18 05 cmpl $0x5,0x18(%esp) 8048d2b:7f 06 jg 8048d33 <phase_3+0xb5> /比較參數2與計算得到的%eax是否相等 8048d2d:3b 44 24 1c cmp 0x1c(%esp),%eax /相等則返回,不相等則引爆 8048d31:74 05 je 8048d38 <phase_3+0xba> 8048d33:e8 9b 08 00 00 call 80495d3 <explode_bomb> 8048d38:83

19、c4 2c add $0x2c,%esp 8048d3b:c3 ret 程序流程:1. 讀取輸入參數1和參數2,調用ssanf函數傳入兩個參數;2. 比較參數1與7的大小,小于等于7繼續,大于7引爆;3. 根據參數1的值來搜索跳轉地址,計算得到最終的%eax;4. 比較參數1與5的大小,小于等于5繼續,大于5引爆;5. 比較參數2與計算得到的%eax是否相等,相等則進入下一關,不相等則引爆。破解思路:首先我們通過p(char *)8049dfa讀取該內存地址中的內容: 可知輸入的兩個參數都是整數,并且進一步我們知道參數1小于等于7(無符合數),那么參數1只能是0 1 2 3 4 5 6 7。根

20、據參數1的值得到跳轉地址向量表:因此我們可以得到一個Switch函數表:Case 參數1 = 0:參數2 = 0x(140+a6+1b6-1db+36d-f4+f4-29e)=0x290=656;Case 參數1 = 1:參數2 = 0x(a6+1b6-1db+36d-f4+f4-29e)=0x150=336;Case 參數1 = 2:參數2 = 0x(1b6-1db+36d-f4+f4-29e)=0xaa=170;Case 參數1 = 3:參數2 = 0x(-1db+36d-f4+f4-29e)=0xfef4=-268;Case 參數1 = 4:參數2 = 0x(36d-f4+f4-29e)

21、=0xcf=207;Case 參數1 = 5:參數2 = 0x(-f4+f4-29e)=0xfd62=-670;Case 參數1 = 6:參數2 = 0x(f4-29e)=0xfe56=-426;Case 參數1 = 7:參數2 = 0x(-29e)=0xfd62=-670;注意到最后有個判斷條件要求參數1小于等于5:因此第三關的密碼是(以下任一組):0 656;1 336;2 170;3 -268;4 207;5 -670七、 第四關炸彈拆除:08048d7b <phase_4>: 8048d7b:83 ec 2c sub $0x2c,%esp /用戶輸入的參數存在%esp+1c

22、 8048d7e:8d 44 24 1c lea 0x1c(%esp),%eax 8048d82:89 44 24 08 mov %eax,0x8(%esp) /讀取地址0x8049dfd的內容 8048d86:c7 44 24 04 fd 9d 04 movl $0x8049dfd,0x4(%esp) 8048d8d:08 8048d8e:8b 44 24 30 mov 0x30(%esp),%eax 8048d92:89 04 24 mov %eax,(%esp) /調用函數sscanf 8048d95:e8 76 fb ff ff call 8048910 <_isoc99_ssc

23、anfplt> /比較返回值是否等于1,不等則引爆 8048d9a:83 f8 01 cmp $0x1,%eax 8048d9d:75 07 jne 8048da6 <phase_4+0x2b> /比較輸入參數與0的大小,小于等于則引爆 8048d9f:83 7c 24 1c 00 cmpl $0x0,0x1c(%esp) 8048da4:7f 05 jg 8048dab <phase_4+0x30> 8048da6:e8 28 08 00 00 call 80495d3 <explode_bomb> /把輸入參數傳入函數func4,調用函數func4

24、 8048dab:8b 44 24 1c mov 0x1c(%esp),%eax 8048daf:89 04 24 mov %eax,(%esp) 8048db2:e8 85 ff ff ff call 8048d3c <func4> /比較返回值是否等于0x1055,不等則引爆 8048db7:3d 55 10 00 00 cmp $0x1055,%eax 8048dbc:74 05 je 8048dc3 <phase_4+0x48> 8048dbe:e8 10 08 00 00 call 80495d3 <explode_bomb> /相等則撤銷棧楨,返

25、回 8048dc3:83 c4 2c add $0x2c,%esp 8048dc6:c3 ret 主程序流程:1. 讀取參數,調用sscanf函數傳入參數;2. 比較輸入參數與0的大小,小于等于則引爆;3. 把輸入參數傳入函數func4,并調用函數func4;4. 若函數func4返回值等于0x1055,則返回,進入下一關,否則引爆炸彈。08048d3c <func4>: 8048d3c:83 ec 1c sub $0x1c,%esp 8048d3f:89 5c 24 14 mov %ebx,0x14(%esp) 8048d43:89 74 24 18 mov %esi,0x18(

26、%esp) /把參數傳入%ebx 8048d47:8b 5c 24 20 mov 0x20(%esp),%ebx 8048d4b:b8 01 00 00 00 mov $0x1,%eax /比較%ebx與1的大小,大于則繼續 8048d50:83 fb 01 cmp $0x1,%ebx 8048d53:7e 1a jle 8048d6f <func4+0x33> /%eax<-%ebx-1并傳入func4繼續遞歸 8048d55:8d 43 ff lea -0x1(%ebx),%eax 8048d58:89 04 24 mov %eax,(%esp) 8048d5b:e8 d

27、c ff ff ff call 8048d3c <func4> /%esi=%eax,%ebx-=2 8048d60:89 c6 mov %eax,%esi 8048d62:83 eb 02 sub $0x2,%ebx /%esp<-%ebx,并傳入fun4繼續遞歸 8048d65:89 1c 24 mov %ebx,(%esp) 8048d68:e8 cf ff ff ff call 8048d3c <func4> /%eax += %esi 8048d6d:01 f0 add %esi,%eax /%ebx<=1,返回 8048d6f:8b 5c 24

28、14 mov 0x14(%esp),%ebx 8048d73:8b 74 24 18 mov 0x18(%esp),%esi 8048d77:83 c4 1c add $0x1c,%esp 8048d7a:c3 ret func4函數流程:1. 比較傳入參數是否大于1,大于1則繼續,小于等于1則返回1;2. 循環%eax <- %ebx-1,并遞歸調用函數func4,直到參數小于等于1;3. 循環變量%ebx每次減2,并傳入%esp繼續遞歸調用函數func4;4. 函數返回的所得值加到%eax;破解思路:首先我們通過p(char *)0x8049dfd讀取該內存地址中的內容:可知輸入參數

29、為一個整數,進一步我們發現它大于0。為了更好地理解func4函數,我們可以寫出其大致的框架:通過列舉或用C程序跑該函數可以得到:Func4(0)=1;Func4(1)=1;Func4(2)=2;Func4(3)=3;Func4(4)=5;Func4(5)=8;Func4(6)=13;Func4(7)=21;Func4(8)=34;Func4(9)=55;Func4(10)=89;Func4(11)=144;Func4(12)=233;Func4(13)=377;Func4(14)=610;Func4(15)=987;Func4(16)=1597;Func4(17)=2584;Func4(18)

30、=4181=0x1055。因此第四關的密碼是:18八、 第五關炸彈拆除08048dc7 <phase_5>: 8048dc7:53 push %ebx 8048dc8:83 ec 18 sub $0x18,%esp 8048dcb:8b 5c 24 20 mov 0x20(%esp),%ebx 8048dcf:89 1c 24 mov %ebx,(%esp) /調用string_length函數 8048dd2:e8 54 02 00 00 call 804902b <string_length> /比較字符串長度,不等于6則引爆 8048dd7:83 f8 06 cm

31、p $0x6,%eax 8048dda:74 05 je 8048de1 <phase_5+0x1a> 8048ddc:e8 f2 07 00 00 call 80495d3 <explode_bomb> /把%edx和%eax初始化置0 8048de1:ba 00 00 00 00 mov $0x0,%edx /循環開始 8048de6:b8 00 00 00 00 mov $0x0,%eax /%ecx <- (%ebx+%eax) 8048deb:0f be 0c 03 movsbl (%ebx,%eax,1),%ecx /取%ecx中的內容的低四位 804

32、8def:83 e1 0f and $0xf,%ecx /%edx += *(0x8049a80+4*%ecx) 8048df2:03 14 8d 80 9a 04 08 add 0x8049a80(,%ecx,4),%edx /循環變量%eax+=1 8048df9:83 c0 01 add $0x1,%eax /比較循環變量%eax與6,不等則再循環 8048dfc:83 f8 06 cmp $0x6,%eax 8048dff:75 ea jne 8048deb <phase_5+0x24> /循環結束 /比較%edx是否等于0x36,不等則引爆 8048e01:83 fa 3

33、6 cmp $0x36,%edx 8048e04:74 05 je 8048e0b <phase_5+0x44> 8048e06:e8 c8 07 00 00 call 80495d3 <explode_bomb> /相等則撤銷棧楨,返回 8048e0b:83 c4 18 add $0x18,%esp 8048e0e:5b pop %ebx 8048e0f:90 nop8048e10:c3 ret程序流程:1. 調用string_length的字符串長度函數,測得的長度若不為6則引爆;2. 做一個6次的循環,循環變量%eax從1到6,令%ecx<-(%ebx+%e

34、ax);3. 只保留%ecx的低四位,并以此作為地址搜索變量,取出0x8049a80+4*%ecx中的數加到%edx上,如此循環6次后跳出;4. 比較總和%edx的值是否等于0x36(54),相等則返回進入下一關,不等則引爆。破解思路:首先我們得知輸入的字符串長度為6,然后通過p /x *(0x8049a80+4*%ecx)的指令得到:上述值分別對應%eax=04。因為字符在機器中是以ASCII碼的形式存儲,因此我們要尋找的一個6位字符串要滿足其每個字符的ASCII碼位數對應的值相加為0x36即54。因此不妨取3*(c+6)=0x36,即取ASCII碼位數(16進制)分別為2和4的的字母,例如

35、B(42H)和D(44H),重復三次即可。因此第五關的密碼為(不唯一):BBBDDD九、 第六關炸彈拆除08048e11 <phase_6>: 8048e11:56 push %esi 8048e12:53 push %ebx 8048e13:83 ec 44 sub $0x44,%esp 8048e16:8d 44 24 10 lea 0x10(%esp),%eax 8048e1a:89 44 24 04 mov %eax,0x4(%esp) 8048e1e:8b 44 24 50 mov 0x50(%esp),%eax 8048e22:89 04 24 mov %eax,(%e

36、sp) /調用函數read_six_numbers 8048e25:e8 ae 08 00 00 call 80496d8 <read_six_numbers> /初始化循環變量%esi=0 8048e2a:be 00 00 00 00 mov $0x0,%esi /循環1開始 /%eax <- *(%esp+4*%esi) 8048e2f:8b 44 b4 10 mov 0x10(%esp,%esi,4),%eax /比較%eax-1是否大于5(無符號數) 8048e33:83 e8 01 sub $0x1,%eax 8048e36:83 f8 05 cmp $0x5,%e

37、ax /小于等于則繼續 8048e39:76 05 jbe 8048e40 <phase_6+0x2f> 8048e3b:e8 93 07 00 00 call 80495d3 <explode_bomb> /循環變量%esi+=1 8048e40:83 c6 01 add $0x1,%esi /判斷%esi是否等于6,等于則跳出循環 8048e43:83 fe 06 cmp $0x6,%esi 8048e46:74 33 je 8048e7b <phase_6+0x6a> /%ebx=%esi 8048e48:89 f3 mov %esi,%ebx /取出%esp+4*%ebx+10 8048e4a:8b 44 9c 10 mov 0x10(%esp,%ebx,4),%eax /與%esp+4*%esi+c比較,相等則引爆 8048e4e:39 44 b4 0c cmp %eax,0xc(%esp,%esi,4) 8048e52:75 05 jne 8048e59 <phase_6+0x48> 8048e54:e8 7a 07 00 00 call 80495d3 <exp

溫馨提示

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

最新文檔

評論

0/150

提交評論