




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、實驗題目:逆向二進制bomb實驗實驗目的:熟悉匯編代碼的閱讀,了解 gdb工具的使用實驗環(huán)境:win7 64 位,VMware workstation,ubuntu實驗內(nèi)容:程序運行在linux環(huán)境中。程序運行中有 6個關卡(6個phase ),每個phase需要用戶在終端上輸入密碼,否則會引爆炸彈。我們需要通過使用gdb工具反匯編出匯編代碼,然后找到每一個關卡的密碼。實驗需要用到gdb工具,需要網(wǎng)上查找 gdb使用方法和參數(shù)。操作步驟:一.打開終端進入bomb文件夾開始進行實驗,我們要分析每個炸彈的密碼,就必須要分析其中的匯編代碼,所以第一步就是要反匯編出代碼,通過使用gdb下 面的disa
2、s main來查看匯編代碼。如下:0O Ujia)Ujia-virtuaUmachine: -/LAB3Reading symbols from /home/lijia/LAB3/bomb.done, (gdb) disas mainDump of assembler code for function main:0 x08。489b4 :push%ebp0 xO8O489b5 :mov%esp,%ebp0 xO80489b7 :and$0 xfffffff0,%esp0 x080489ba :push%esi0 xO80489bb :push%ebx0 x080489bc :sub$0 xl
3、8,%esp0 xO80489bf :mov0 x8(%ebp),%eax0XO80489C2 :movOxc(%ebp),%esi0X080489C5 :cmpSOxleaxOX08O489C8 :jne0 x80489d6 0 x080489ca :mov0 x804c3a4,%eax0 x080489cf :mov%eax,0 x8O4c3d40 xO80489d4 :jnp0 x8048a4b 9x08。489d6 :cmp$0 x2,%eax0 x080489d9 :jneOx8048a25 0 x08。489db v139:lea0 x4(%esi),%ebxUbuntu軟件中心4
4、2:movl$0 x8049fe8,0 x4(%esp)mov(%ebx),%eax0 x080489e8 :mov%eax,(%esp)0 xO8O489eb :call0 x8048850 fopenplt0 xO8O489f0 :mov%eax,Ox804c3d40 x080489de:novi$Ox8049fe8/0 x4(%esp)Ox08O489e6:nov(%ebx),%eax0 x080489e8十52;ROV%eaxf(%esp)Ox08O489eb:call0 x8048850 Ox08O489f0:mov%eaxf0 x804c3d4Ox080489f5;test%eax
5、,%eax- Type to continue.or q to quitOx08O489f7:jne0 x8O48a4b OX80489f9:nov(%ebx),%eax0 x08。489fb:nov%eax0 xc(%esp)Ox080489ff:nov(%esi),%eax9X08048301:nov%eax,0 x8(%esp)0 x08。48ao5:novi$Ox8049fea,0 x4(%esp)Ox08048dOd:novi$0 xl,(%usp0X08048314:call0 x8048870 Ox08048al9:movl$9x8f(%esp)Ox08O48d2O:call0
6、x8048810 x08048d25:mov(%esl),%eax0X08048327:nov%eax0 x8(%esp)OxO8048a2b:novi$0X8043607,0 x4(%esp)X08048d33:novi$6xl,(%espSOx08048a3a:call0 x8048870 v_printf_chkpltOx08048a3fmovlSOxSesp)-0 x08。48a46;call0 x8048810 lijia)lijia-virtuabmachine: /LAB3Ox。8048a4b:call0 x804934a 0 x08O48a50:movl$0X8048034,0
7、 x4(%esp) 一Lx。8648a58:movl$0 xl,(%esp)0 x08O48a5f:call0 x8048870 0 xO8O48a64:movl$0 x8046070,0 x4(%esp)0 xO8048a6c:movl$0 xl,(%esp)-Type to continue,or q to quitOx。8048a73:call0 x8048870 0 x08O48a78:call0 x8049206 0 x08048a7d:mov%eax,(%esp)0 x08O48a80:call0 x8048f61 0 x08。48a85:call0 x8049014 ,1 :cu
8、;.,:movl$0 x804a0a0,Ox4(%esp):movl$0 xl,(%esp)3x08。48a99:call0 x8048870 0 xO8048a9e:call0 x8049206 0 xO8O48aa3:mov%eax,(%esp)0 x08048aa6:call0 x8048d6a 0 x08048aab:call0 x8049014 0 x08O48abO:movl$0 x804a0cc,Ox4(%esp)Ox。8048ab8:movl$0 xl,(%esp)0 x08048abf:call0 x8048870 0 x68048ac4:call0 x8049206 0 x
9、08048ac9:mov%eax,(%esp)Lijia)Lijia*virtualmachfne: */LAB5OX080488CCOx08048adl0 xO8O48ad60 xO8O48adeOxO8048ae5Ox08048aea:::call call movl movl call call-Type to continue,0 xO8O48aef 0X08048af2 OX08048af7 Ox08048afc 0 xO8048bO4 0 xO8O48b0b 0X08048bl0 6x08048bl5 6x08048bl8 OX08e48bld OxO8048b22 Ox08048
10、b2a 0 xO8048b31 0 xO8O48b36 0X08O48b3b OX08948b3e 0 x08O48b43: : ::::::::mov call call movl movl call call mov call call movl movl call call mov call call0 x8048eal 0 x8049014 $Gx804a021,0 x4(%esp)$0 xl,(*esp)0 x8048870 6x8049206 or q to quit%eax,(%esp)0 x8048e2e 0 x8049014 $Ox804a0ec,0 x4(%esp)$0 x
11、l,(%esp)0 x8948876 0 x8049206 %eax,(%esp)0 x8048db8 0 x8849014 $0 x894all4,0 x4(%esp)$Qxl,(%esp)0 x8048870 0 x8049206 %eax,(%esp)0 x8048c89 0 x8049014 6,臼3日4gh4d :OX08048&51 :Qx08048b52 :0XO8048b54 :add pop pop mov popgl-Type to 8ntinue,Ox08048b55 : ret$0 x18,%esp%ebx%esi%ebp,%esp%ebpor q to quit-也可
12、用另外一種方法查找匯編代碼,使用命令行objdump -d bomb 1.txt,將反匯編代碼轉(zhuǎn)存至文本txt中。便于查看。為便于解釋,通過使用第二方式得到的反匯編代碼進行解釋。二.進行拆炸彈通過使用反匯編,Phasel在得到phase_1的代碼后我們對它進行分析尋找密碼Dump of assembler code for function phase_1:0 x08048f61 :push%ebp0 x08048f62 :mov%esp,%ebp0 x08048f64 :sub$0 x18,%esp/0 x08048f67 :movl$0 x804a15c,0 x4(%esp)0 x0804
13、8f6f :mov0 x8(%ebp),%eax0 x08048f72 :mov%eax,(%esp)0 x08048f75 :call0 x8048fab 0 x08048f7a :test%eax,%eax/判斷返回值是否為0 如果不為0的話就會調(diào)用call0 x08048f7c :je0 x8048f83 0 x08048f7e :call0 x80490d1 0 x08048f83 :leave0 x08048f84 :ret0 x80490d1 BOMB爆炸gdb 狀態(tài)下用 x/s 0 x804a15c 查看出現(xiàn)字符串We have to stand with our North K
14、orean則它應為我們第allies.所以我們應當輸入We have to stand with our North Korean allies.關卡的密碼。Firefox網(wǎng)絡瀏淀器strings_not_equal0 x8O490dlhaveStarting Weleone which to0 x08048t6f OxO8O48f72 Ox03048f75 0 xG8048f7a 0 x08048f7c 6xOS04Sf7e OxO8O48f83 0 x08048f84fiendish yourselflittle bombnovi rnov ROV0 xS648fab %eax,%eax
15、0X8048r83 Ox8049fldlstand with our North Korean alitesprogram: /home/ltjta/LAB3/bonb$0 x18,%esp$9x804a15c,0 x4(%esp)0 x8(%ebp)%eax,(%esp)Breakpoint (gdb) run0 x08048f61 48f62We have to stdnd with our Phase 1 defused * How aboutEnd of assenbler dump, (gdb) x/s 0 x884al5c &x864ai5c:*We have(qdb) break
16、 *0 x80490dlHave a nice day 1 North Korean allies the next one?第一個炸彈拆除成功Phase20 x08048d6a :push%ebp0 x08048d6b :mov%esp,%ebp0 x08048d6d :push%esi0 x08048d6e :push%ebx0 x08048d6f:sub$0 x30,%espDump of assembler code for function phase_2:0 x08048d75 :0 x08048d79 :0 x08048d7c :0 x08048d7f:/進彳T 6個數(shù)值的判斷0
17、 x08048d84 :0 x08048d88 :0 x08048d8a :0 x08048d8e :0 x08048d90 :0 x08048d95 :0 x08048d98 :束的標志因為地址-0 x80 x08048d9b :的個數(shù)字值0 x08048d9e :0 x08048da1 :0 x08048da3 :0 x08048da5 :0 x08048daa :數(shù)。0 x08048dad :mov%eax,0 x4(%esp)mov0 x8(%ebp),%eaxmov%eax,(%esp)call 0 x804910b cmpl$0 x0,-0 x20(%ebp)jne0 x8048d
18、90 第一個數(shù)值為0cmpl$0 x1,-0 x1c(%ebp)je0 x8048d95 /第二個數(shù)值為1call0 x80490d1 lea-0 x18(%ebp),%ebxlea -0 x8(%ebp),%esi/ 將地址-0 x8 (%edp )賦給 %esi 作為結(jié)(%ebp )在最后一個數(shù)字的上一個地址。mov -0 x4(%ebx),%eax開始進入循環(huán),判斷第 3、4、5、6add -0 x8(%ebx),%eaxcmp %eax,(%ebx)/后一個數(shù)為前面兩個數(shù)的和je0 x8048daa call0 x80490d1 add $0 x4,%ebx 增加%ebx 中的地址的值
19、,開始判斷下一個cmp %esi,%ebx 如果ebx 中的地址值和 %esi中的地址值不同,也就是 %ebx中的地址值不等于-0 x8(%ebp)的地址,那么繼續(xù)進行循環(huán)否則跳出循環(huán)。0 x08048db1 :add$0 x30,%esp0 x08048db4 :pop%ebx0 x08048db5 :pop%esi0 x08048db6 :pop%ebp0 x08048db7 :ret爭個 lijlalijla-virtuabmachlne: -/LAB30XO3O48f64sub50 x18,將e5P0 xO8O48f67:novi$ex804al5c/Ox4(%esp)0 xO8O48
20、f6f:P1OV0 x8(ebp),%eax0 xO8648f72:P1OV%eax,(%esp)Ox03O48f75:call0 x8048fab 0XO3O48f7a:test%eax,%eax0 xO8O48f7C:je0 x8048f83 Ox0SO48f7ecall0 x80490dl Ox。8948f83:leave0X08048f84:ret0 x08048daf:jne0 x8048d9b End of assembler dump.(gdb) x/s Ox804al5cOx804al5c:He have to stand with our North Korean allie
21、s.(gdb) break *ox89490dlBreakpoint 1 at Ox8049Odl(gdb) runStarting program: /hone/Lijia/LAB3/bombWelcome to my fiendish little bomb* You have 6 phases with which to blow yourself up Have 己 nice day!We have to stand Phase 1 defused. 0 112 3 5 That1s number 2.Keep going!with our North Korean allies. H
22、ow about the next one?(3)phase3第三關卡的代碼較大,但是比較簡單,容易找到密碼Dump of assembler code for function phase_3:0 x08048ea1 :push%ebp0 x08048ea2 :0 x08048ea4 :0 x08048ea7 :0 x08048eaa :0 x08048eae :0 x08048eb1 :0 x08048eb5 :movsublea movlea mov movl%esp,%ebp$0 x28,%esp-0 x10(%ebp),%eax%eax,0 xc(%esp)-0 xc(%ebp),%
23、eax%eax,0 x8(%esp)$0 x804a23e,0 x4(%esp)/又是一個立即數(shù)0 x08048ebd :0 x08048ec0 :0 x08048ec3 :mov mov call0 x8(%ebp),%eax%eax,(%esp)0 x8048840 /調(diào)用 sscanf 函數(shù)0 x08048ec8 :0 x08048ecb :cmpjg$0 x1,%eax0 x8048ed2 /所輸入的值的個數(shù)大于10 x08048ecd :0 x08048ed2 :0 x08048ed6 :callcmplja0 x80490d1 $0 x7,-0 xc(%ebp)0 x8048f43
24、 /所輸入的個值小于70 x08048ed8 :0 x08048edb :movjmp-0 xc(%ebp),%eax*0 x804a1a0(,%eax,4)/進入switch 語句跳轉(zhuǎn)到以0 x804a1a0為基址的跳轉(zhuǎn)表中輸入0 x08048ee2 :mov0 x08048ee7 :jmp0 x08048ee9 :movp/x *0 x804a1a0$0 x0,%eax0 x8048f3c $0 x0,%eax0 x08048eee :xchg%ax,%ax0 x08048ef0 :jmp0 x8048f37 0 x08048ef2 :mov$0 x0,%eax0 x08048ef7 :j
25、mp0 x8048f32 0 x08048ef9 :mov$0 x0,%eax0 x08048efe :xchg%ax,%ax0 x08048f00 :jmp0 x8048f2d 0 x08048f02 :mov$0 x0,%eax0 x08048f07 :jmp0 x8048f28 0 x08048f09 :mov$0 x0,%eax0 x08048f0e :xchg%ax,%ax0 x08048f10 :jmp0 x8048f23 0 x08048f12 :mov$0 x314,%eax 輸入0的時候跳轉(zhuǎn)到這里執(zhí)行將給 %eax0 x08048f17 :jmp0 x8048f1e 0 x0
26、8048f19 :mov$0 x0,%eax0 x08048f1e :sub$0 x35a,%eax0 x08048f23 :add$0 x2ef,%eax0 x08048f28 :sub$0 x216,%eax0 x08048f2d : add$0 x216,%eax0 x08048f32 :sub$0 x216,%eax0 x08048f37 :add$0 x216,%eax314賦0 x08048f3c :sub $0 x216,%eax0 x08048f41 :jmp0 x8048f4d 0 x08048f43 :call0 x80490d1 0 x08048f48 :mov$0 x0
27、,%eax0 x08048f4d : cmpl$0 x5,-0 xc(%ebp)0 x08048f51 :jg0 x8048f58 0 x08048f53 :cmp-0 x10(%ebp),%eax /上面的值我們所輸入的第二個參數(shù)0 x08048f56 :je0 x8048f5d 0 x08048f58 :call0 x80490d1 0 x08048f5d : leave0 x08048f5e :xchg%ax,%ax0 x08048f60 :ret看到 0 x08048eb5 :movl $0 x804a23e,0 x4(%esp)這行代碼,又是一個立即數(shù)同樣結(jié)果為147cmp以下的操作
28、就是 0 x314-0 x35a+0 x2ef-0 x216+0 x216-0 x216+0 x216-0 x216 -0 x10(%ebp),%eax這個語句說明147就是我們第三關卡的密碼。e have to stand wtth our North Korean alites* hase 1 defused. How about the next one?112 3 5haf s nunber 2, Keep going J147第三個炸彈拆除成功(4)phase4代碼如下:Dump of assembler code for function phase_4:0 x08048e2e :
29、push%ebp0 x08048e2f:mov%esp,%ebp0 x08048e31 :sub$0 x28,%esp0 x08048e34 :lea-0 x10(%ebp),%eax0 x08048e37 :mov%eax,0 xc(%esp)0 x08048e3b :lea-0 xc(%ebp),%eax0 x08048e3e :mov%eax,0 x8(%esp)0 x08048e42 :movl$0 x804a23e,0 x4(%esp)0 x08048e4a :mov0 x8(%ebp),%eax0 x08048e4d :mov%eax,(%esp)0 x08048e50 :call
30、0 x8048840 0 x08048e55 :cmp$0 x2,%eax0 x08048e58 :jne0 x8048e66 0 x08048e5a :mov-0 xc(%ebp),%eax0 x08048e5d :test%eax,%eax0 x08048e5f:js0 x8048e66 A 個參數(shù)00 x08048e61 :cmp$0 xe,%eax0 x08048e64 :jle0 x8048e6b /個參數(shù)小于等于 140 x08048e66 :call0 x80490d1 0 x08048e6b :movl$0 xe,0 x8(%esp)0 x08048e73 :movl$0 x0
31、,0 x4(%esp)0 x08048e7b :mov-0 xc(%ebp),%eax0 x08048e7e :mov%eax,(%esp)0 x08048e81 :call0 x8048b60 /調(diào)用遞歸函數(shù)0 x08048e86 :cmp$0 x1,%eax0 x08048e89 :jne0 x8048e91 /遞歸后的返回值須為10 x08048e8b :cmpl $0 x1,-0 x10(%ebp)0 x08048e8f:je0 x8048e9d 第二個參數(shù)為10 x08048e91 :lea0 x0(%esi,%eiz,1),%esi0 x08048e98 : call0 x8049
32、0d1 0 x08048e9d :leave0 x08048e9e : xchg%ax,%ax0 x08048ea0 : ret根據(jù) 0 x08048e42 :movl $0 x804a23e,0 x4(%esp)的我們查看0 x804a23e 的值結(jié)果為再根據(jù)語句 0 x08048e50 :call 0 x8048840 0 x08048e55 :cmp斷這兩個整型數(shù)分別是什么。由代碼0 x08048e73 :movl0 x08048e7b :mov0 x08048e7e :mov$0 x0,0 x4(%esp)-0 xc(%ebp),%eax$0 x2,%eax說明我們要輸入兩個整型數(shù),下
33、面的工作就是判0 x08048e6b :movl $0 xe,0 x8(%esp)%eax,(%esp)可以看出我們以第一個參數(shù), 0 , 14為參數(shù)傳入遞歸函數(shù)中而且返回值為1,所以我們這時做的事情就是分析func4 函數(shù),看第一個參數(shù)為多少時返回值能為1 ,而第二個參數(shù)由代碼0 x08048e8b : cmpl$0 x1,-0 x10(%ebp)0 x08048e8f :je 0 x8048e9d 可知第二個參數(shù)就為 1下面分析func4Dump of assembler code for function func4:0 x08048b60 :push%ebp0 x08048b61 :m
34、ov%esp,%ebp0 x08048b63 :sub$0 x18,%esp0 x08048b66 :mov%ebx,-0 x8(%ebp)0 x08048b69 :mov%esi,-0 x4(%ebp)0 x08048b6c :mov0 x8(%ebp),%edx0 x08048b6f:mov0 xc(%ebp),%eax0 x08048b72 :mov0 x10(%ebp),%ebx0 x08048b75 :mov%ebx,%ecx0 x08048b77 :sub%eax,%ecx /%ecx 中的值減去%eax的值0 x08048b79 :mov%ecx,%esi0 x08048b7b
35、:shr$0 x1f,%esi/獲彳導%ecx-%eax 的符號位0 x08048b7e :lea(%esi,%ecx,1),%ecx / 將值 ecx+ 符號位的值傳給 %ecx0 x08048b81 :sar%ecx /將ecx中的值除以20 x08048b83 :add%eax,%ecx /%ecx 的值加上 %eax 的值0 x08048b85 :cmp%edx,%ecx 比較edx 和ecx的值也就是將第二個參0 x08048ba7 :jge0 x08048ba9 :mov0 x08048bad :add0 x08048bb0 :mov0 x08048bb4 :mov0 x08048
36、bb7 :call0 x08048bbc :lea0 x8048bc0 /若大于等于則結(jié)束遞歸%ebx,0 x8(%esp) /將ebx的值作為第一個參數(shù)$0 x1,%ecx%ecx,0 x4(%esp)/ 將ecx減1之后的值作為第 2個參數(shù)%edx,(%esp)/ 將3*的值作為第3個參數(shù)0 x8048b60 0 x1(%eax,%eax,1),%eax/最后返回的值也就是說我們第次調(diào)用 func4 是在 0 x08048bb7 :call 0 x8048b60 中。0 x08048bc0 :mov -0 x8(%ebp),%ebx0 x08048bc3 :mov -0 x4(%ebp),
37、%esi數(shù)和第三個參數(shù)經(jīng)過計算的值與第一個參數(shù)比較0 x08048b87 :jle0 x8048ba0 /若小于 Q 貝 U跳轉(zhuǎn)至 U0 x8048ba00 x08048b89 :sub$0 x1,%ecx /%ecx 減 10 x08048b8c :mov%ecx,0 x8(%esp)/ 以ecx的值為第3個參數(shù)0 x08048b90 :mov%eax,0 x4(%esp) / 以%eax的值為第2個參數(shù)0 x08048b94 :mov%edx,(%esp) / 以3*的值為愛-個參數(shù)0 x08048b97 :call0 x8048b60 /再次調(diào)用 func40 x08048b9c :ad
38、d%eax,%eax /0 x08048b9e :jmp0 x8048bc0 0 x08048ba0 :mov$0 x0,%eax/ 將 0 傳入 %eax0 x08048ba5 :cmp%edx,%ecx /比較edx 和ecx 的值也就是將第二個參數(shù)和第三個參數(shù)經(jīng)過計算的值與第一個參數(shù)比較0 x08048bc6 : mov%ebp,%esp0 x08048bc8 : pop%ebp0 x08048bc9 : ret根據(jù)判斷條件 jle 0 x8048ba0 和: jge 0 x8048bc0 可知這個函數(shù)就是參數(shù)2和參數(shù)3經(jīng)過一系列的操作最終等于參數(shù)1.,參數(shù)1在這個過程中是不變的。我們第
39、一次傳入func4的參數(shù)為:參數(shù)1 , 0, 14結(jié)果返回值要求為 1 ,也就是%eax的值為1 ,我用的是反向推理的方法。首先如果使返回值為10 x08048bbc :lea 0 x1(%eax,%eax,1),%eax根據(jù)這條語句我們可以使這條語句為最后返回的值也就是說我們第一次調(diào)用func4是在 0 x08048bb7 :call0 x8048b60 那么就是說參數(shù)1大于7,在此條件下我們將(9, 8, 14)傳入再次調(diào)用func4 ,調(diào)用func4后我們希望它的返回值為0這樣本據(jù)0 x1(%eax,%eax,1),%eax返回值就是1 了,最簡單的一種情況就是14和8經(jīng)過運算后結(jié)果為
40、11而參數(shù)1恰好等于11的情況,更復雜一些的情況就是它又調(diào)用了這里0 x08048b97 :call 0 x8048b60 再由它的返回值再繼續(xù)推理,所以此題有多種答案,最簡單的就是 11 1故此題密碼可為111.輸入密碼,解除第四個炸彈。(5)Phase5Dump of assembler code for function phase_5:0 x08048db8 :push %ebp0 x08048db9 :mov %esp,%ebp0 x08048dbb :0 x08048dbc :0 x08048dbd :0 x08048dc0 :0 x08048dc3 :0 x08048dc7 :0
41、 x08048dca :0 x08048dce :0 x08048dd6 :0 x08048dd9 :0 x08048ddc :0 x08048de1 :0 x08048de4 :0 x08048de6 :0 x08048deb :0 x08048dee :0 x08048df1 :-0 xc(%ebp)中0 x08048df4 :于150 x08048df7 :push %esipush%ebxsub$0 x20,%esplea-0 x10(%ebp),%eaxmov %eax,0 xc(%esp)lea-0 xc(%ebp),%eaxmov%eax,0 x8(%esp)movl$0 x80
42、4a23e,0 x4(%esp)mov0 x8(%ebp),%eaxmov%eax,(%esp)call0 x8048840 cmp$0 x1,%eax 所輸入的值的個數(shù)應該大于 1jg 0 x8048deb call 0 x80490d1 mov -0 xc(%ebp),%eaxand $0 xf,%eax 將eax中的值與0 xf做邏輯與運算mov %eax,-0 xc(%ebp) /將相與后 的結(jié)果傳 入地址cmp $0 xf,%eax 比較eax中的值是否等于 15,結(jié)果不能等je 0 x8048e22 0 x08048df9 :mov$0 x0,%ecx0 x08048dfe :mo
43、v$0 x0,%edx0 x08048e03 :mov$0 x804a1c0,%ebx /將數(shù)組的首地址中的值傳入 %edx0 x08048e08 :add$0 x1,%edx/進入循環(huán)0 x08048e0b :mov(%ebx,%eax,4),%eax/將數(shù)組中第 %eax位直的值傳給 %eax0 x08048e0e :add%eax,%ecx/講每次%eax的值累加起來0 x08048e10 :cmp$0 xf,%eax /比較eax和15若等于則跳出循環(huán)0 x08048e13 :jne0 x8048e08 0 x08048e15 :mov%eax,-0 xc(%ebp)/ 將 得到 的%
44、eax 的 值傳入-0 xc(%ebp)0 x08048e18 :cmp$0 xf,%edx /比較edx和15 ,如不等丁會 bomb !所以循環(huán)以后%edx等于150 x08048e1b :jne0 x8048e22 0 x08048e1d :cmp%ecx,-0 x10(%ebp)/我們所輸入的第一個參數(shù)等丁循環(huán)之后%ecx的結(jié)果0 x08048e20 : je0 x8048e27 0 x08048e22 : call0 x80490d1 0 x08048e27 : add$0 x20,%esp0 x08048e2a : pop%ebx0 x08048e2b :pop%esi0 x080
45、48e2c : pop%ebp0 x08048e2d :ret根據(jù)實驗三的經(jīng)驗,可以知道這一關也是要輸入兩個數(shù) 有一個循環(huán),翻譯過來是int c=0;int d=0;int b=a0;While(an!=15)d+;n=an;c=c+n;0 x08048e1b : jne0 x8048e22 根據(jù)這一行可以知道,要循環(huán)15次,因為最后的 %eax的值15根據(jù)n=an來進行倒推:n=an=15n=an=6n=an=14n=an=2n=an=1n=an=10n=an=0n=an=8n=an=4n=an=9n=an=13n=an=11n=an=7n=an=3n=an=12n=an=5所以此處實際上循
46、環(huán)執(zhí)行了15次也就是n=an=12,那么此時n=an=5 就是第一個參數(shù)的后位就是0101也就是5,而第二個參數(shù) n=an=15 累加也就是115所以第五關的通關密鑰為5 115所以輸入5 115 ,第五個關卡炸彈解除。(1) Phase6Dump of assembler code for function phase_6:0 x08048c89 :push%ebp0 x08048c8a :mov%esp,%ebp0 x08048c8c :push%edi0 x08048c8d :push%esi0 x08048c8e :push%ebx0 x08048c8f:sub$0 x5c,%esp0
47、 x08048c92 :lea-0 x30(%ebp),%eax0 x08048c95 :mov%eax,0 x4(%esp)0 x08048c99 :mov0 x8(%ebp),%eax0 x08048c9c :mov%eax,(%esp)0 x08048c9f:call0 x804910b 0 x08048ca4 :mov$0 x0,%esi0 x08048ca9 :lea-0 x30(%ebp),%edi0 x08048cac :mov(%edi,%esi,4),%eax0 x08048caf:sub$0 x1,%eax0 x08048cb2 :cmp$0 x5,%eax/%eax 的值
48、小于 60 x08048cb5 :jbe0 x8048cbc 0 x08048cb7 :call0 x80490d1 0 x08048cbc :add$0 x1,%esi0 x08048cbf:cmp$0 x6,%esi0 x08048cc2 :je0 x8048ce6 0 x08048cc4 :lea(%edi,%esi,4),%ebx0 x08048cc7 :mov%esi,-0 x4c(%ebp)0 x08048cca :mov-0 x4(%edi,%esi,4),%eax0 x08048cce :cmp(%ebx),%eax/兩個參數(shù)的值不同0 x08048cd0 :jne0 x804
49、8cd7 0 x08048cd2 :call0 x80490d1 0 x08048cd7 :addl $0 x1,-0 x4c(%ebp)0 x08048cdb :add$0 x4,%ebx0 x08048cde :cmpl$0 x5,-0 x4c(%ebp)0 x08048ce2 :jle0 x8048cca這部分循環(huán)的作用是當前參數(shù)與其余6個不同0 x08048ce4 :jmp0 x8048cac /這部分循環(huán)主要實現(xiàn)的就是將鏈表中的值存放在地址-0 x48 (%ebp )依次向上的地方0 x08048ce6 : mov$0 x0,%ebx/存的順序也就是按照6個參數(shù)的順序,每次將據(jù)首地址
50、距離為當前第n個參數(shù)值的節(jié)點的值傳入 -048 (%eb , %esi(n)。0 x08048ceb :lea -0 x30(%ebp),%edi0 x08048cee : jmp0 x8048d06 0 x08048cf0 :mov0 x8(%edx),%edx0 x08048cf3 :add0 x08048cf6 :cmp0 x08048cf8 :jne0 x08048cfa :mov的位置$0 x1,%eax%ecx,%eax/將距離頭節(jié)點n距離的值傳給%edx0 x8048cf0 %edx,-0 x48(%ebp,%esi,4)將 %edx 值 傳 入-0 x48+%ebp+%esi*
51、40 x08048cfe :add$0 x1,%ebx0 x08048d01 :cmp$0 x6,%ebx/ 判斷條件%ebx是否小于60 x08048d04 :je0 x8048d1c 0 x08048d06 :mov%ebx,%esi /0 x08048d08 :mov(%edi,%ebx,4),%ecx / 地址增加,判斷下一個參數(shù)0 x08048d0b :m ov$0 x804c0c4,%edx/ 鏈表的首地址0 x08048d10 :mov$0 x1,%eax0 x08048d15 :cmp$0 x1,%ecx0 x08048d18 :jg0 x8048cf0 0 x08048d1a
52、 :jmp0 x8048cfa /橘色的部分就是將-0 x48(%ebp)至ij -0 x34(%ebp)的值按照距離為 0 x8的地址排列起來0 x08048d1c : mov-0 x48(%ebp),%ebx0 x08048d1f: mov-0 x44(%ebp),%eax0 x08048d22 :mov%eax,0 x8(%ebx)0 x08048d25 :mov-0 x40(%ebp),%edx0 x08048d28 :mov%edx,0 x8(%eax)0 x08048d2b :m ov-0 x3c(%ebp),%eax0 x08048d2e :mov%eax,0 x8(%edx)0
53、 x08048d31 :mov-0 x38(%ebp),%edx0 x08048d34 :mov%edx,0 x8(%eax)0 x08048d37 :mov-0 x34(%ebp),%eax0 x08048d3a :mov %eax,0 x8(%edx)這部分函數(shù)說明排列的六個值是遞減的也就是說-0 x48(%ebp),中的值大于-0 x44(%ebp)的值0 x08048d3d :m ovl$0 x0,0 x8(%eax)0 x08048d44 :mov$0 x0,%esi0 x08048d49 :mov0 x8(%ebx),%eax0 x08048d4c : mov(%ebx),%edx
54、0 x08048d4e :cmp(%eax),%edx/%edx 的值必須大丁 %eax中的值0 x08048d50 :jge0 x8048d57 0 x08048d52 :call0 x80490d1 0 x08048d57 :mov0 x8(%ebx),%ebx0 x08048d5a :add$0 x1,%esi0 x08048d5d :cmp$0 x5,%esi0 x08048d60 :jne0 x8048d49 0 x08048d62 :add$0 x5c,%esp0 x08048d65 :pop%ebx0 x08048d66 :pop%esi0 x08048d67 :pop%edi0
55、 x08048d68 :pop%ebp0 x08048d69 :ret首先我們看到了 知道了還是6個數(shù)字 里先用1 2 3 4 5 6來進行測試。Good work On to the next* 12 356Breakpoint 1, 0 xesO48c8f in phases () (gdb) i r $ebxebx0 xb7fbf00O-126822S792(gdb) t r $ebp ebpOxbffff128 TOC o 1-5 h z (gdb) x/x *0 xbffff128 OxbfffflSS:0 x00(gdb) x/x Oxbffff128 Oxbffff128:0X5
56、8(gdb) x/x Oxbffff12c Oxbffff12c:0 x43(gdb) x/x *Oxbffff12c 0 x8。48b43 :0 xe8(gdb) x/x *(Oxbffff128-0 x30) 0 x1:Cannot access memory(gdb) x/x *(Oxbffff128-0 x2c) 0 x2:Cannot access nemory(gdb) x/x *(Oxbffff128-0 x28) 0 x3:Cannot access memory(gdb) x/x *(Oxbffff128-0 x24) 0 x4:Cannot access memory(gd
57、b) x/x *(Oxbffff128-0 x20) 0 x5:Cannot access memory(gdb) x/x *(Oxbffff128-0 xlc) 0 x6:Cannot access memory(gdb) x/x *(Oxbffff128-0 x18) 0 x1:Cannot access memory(gdb) x/x *(Oxbffff128-0 x14) 0 x2:Cannot access memory(gdb) x/x *(Oxbffff128-0 x10) 0 xb7f0fO79 (gdb) | 一 Oxbffff128at address 0 x1at add
58、ress 0 x2at address 8x3at address 0 x4at address OxSat address 0 x6at address 0 x1at address 0 x20 x81運行到0 x8048cf6地址時出現(xiàn)ecx寄存器,于是查看內(nèi)存,發(fā)現(xiàn)寄存器中原本值為0。通過查看鏈表各個節(jié)點得到原鏈表序列,將其進行降序排序后得到5 6 1 432的輸入序列。 首先嘗試在defused函數(shù)處下斷點,但是發(fā)現(xiàn)一直失敗,后來查看發(fā)現(xiàn)調(diào)用的是phase_defused函數(shù),下斷點查看。(gdb) x/s 0 x804a209 0X80432091 DrEvtl(qdb) I接下來轉(zhuǎn)
59、到函數(shù)內(nèi)部。進入隱藏函數(shù)內(nèi)部進行分析。0 x0804903clea-0 x64(%ebp)(%ex0 x0804903f+43;nov%eax,0 xc(%sp)0 x08049043:lea6x6O(%bp)OX0364964S:nov%eaXj6x8(Xesp)0 x0804904a:novi$0 x804a2CJCx4(%esp)0 x08049052:novi$0 x804c4dG0 x08049059:callOx8046S46 OxOS64905e;cnp$0 x3 f%eax通過讀取字符串發(fā)現(xiàn)隱藏函數(shù)讀入了三個參數(shù)(gdb) x/sOx804a2000X8046209:+%d %
60、d找到函數(shù)入口,通過phase_defused函數(shù)可知是在一個可以對 -5c(%ebp)位置進行操作的函數(shù)之后進 入隱藏函數(shù)Good work! On to the next., 5 6 14 3 2Congratulations! Vou1ve defused the bomb!實驗結(jié)果及分析:which to blow yourself up. Have a nice day I We have to stand with our North Korean allies. Phase 1 defused. How about the next one?0 112 3 5That1S num
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 雞西市重點中學2025屆校高三第五次月考物理試題含解析
- 南開大學濱海學院《體育休閑娛樂導論》2023-2024學年第二學期期末試卷
- 工程質(zhì)量控制中的風險識別與應對策略
- 第8課 北宋的政治 教案2024-2025學年七年級歷史下冊新課標
- 白領上班背包使用習慣問卷
- 金灣區(qū)溫室大棚施工方案
- 襄陽移動木屋施工方案
- 燃燒器改造施工方案
- 噴灰漆施工方案
- 臨時用戶供電施工方案
- 道路施工安全隱患及防范措施
- 新生兒魚鱗病個案護理
- 生物質(zhì)燃料的資源開發(fā)與利用
- 《積極心理學》課件
- 食管胃底靜脈曲張出血的診治指南解讀
- 急性農(nóng)藥中毒護理查房
- 2024-2025北京高考英語作文及范文匯編
- 2024年八年級語文下冊《經(jīng)典常談》第一章《說文解字》練習題卷附答案
- 特殊環(huán)境焊接防護技術
- 通用電子嘉賓禮薄
- 學校輔導員安全培訓課件
評論
0/150
提交評論