主頁 > 軟體設計 > csapp bomblab1—6+secret,較為全面,每個人的題不一樣。

csapp bomblab1—6+secret,較為全面,每個人的題不一樣。

2020-12-21 12:30:22 軟體設計

bomblab

  • csapp bomblab,1—6+secret,較為全面,
    • bomb-1
    • bomb-2
    • bomb-3
    • bomb-4
    • bomb-5
    • bomb-6
    • secret

csapp bomblab,1—6+secret,較為全面,

我先把的answer公布一下,應該就知道,當然如果你的代碼和我的情況有一點點差距,也沒有關系,文章中有總結各個情況(不全面,只是我見到的)
answer

bomb-1

黑盒子,里面又一句口令,找到口令即可,
1.反匯編 命令列輸入objdump -d bomp >asm.txt
:>為輸出檔案,也可以寫成myname,txt,無所謂,
2.然后打開,找到函式<phase_1>
080488a0 <phase_1>:
80488a0: 55 push %ebp
80488a1: 89 e5 mov %esp,%ebp
80488a3: 83 ec 10 sub $0x10,%esp
80488a6: 68 a4 92 04 08 push $0x80492a4
80488ab: ff 75 08 pushl 0x8(%ebp)
80488ae: e8 27 05 00 00 call 8048dda <strings_not_equal>
80488b3: 83 c4 10 add $0x10,%esp
80488b6: 85 c0 test %eax,%eax
80488b8: 74 05 je 80488bf <phase_1+0x1f>
80488ba: e8 1e 06 00 00 call 8048edd <explode_bomb>
80488bf: c9 leave
80488c0: c3 ret
關鍵在于8048b36: 68 44 a2 04 08 push $0x80492a4
把這個壓堆疊的地址拿出來看看就行,需要用到gdb工具,自行百度安裝,命令依次輸入 1.bomb-test
2. b main
3. r
4.x /s 0x80492a4
我的是這樣的,每個人應該不一樣
回傳的字串:
Crikey! I have lost my mojo!就是答案,

bomb-2

找phase_2函式,但是每個人的題目應該是不一樣,
我見過是:斐波拉契數列,加序號增,程式員數列
我的是斐波拉契數列:
080488c1 <phase_2>:
80488c1: 55 push %ebp
80488c2: 89 e5 mov %esp,%ebp
80488c4: 56 push %esi
80488c5: 53 push %ebx
80488c6: 83 ec 28 sub $0x28,%esp
80488c9: 65 a1 14 00 00 00 mov %gs:0x14,%eax
80488cf: 89 45 f4 mov %eax,-0xc(%ebp)
80488d2: 31 c0 xor %eax,%eax
80488d4: 8d 45 dc lea -0x24(%ebp),%eax
80488d7: 50 push %eax
80488d8: ff 75 08 pushl 0x8(%ebp)
80488db: e8 25 06 00 00 call 8048f05 <read_six_numbers>
80488e0: 83 c4 10 add $0x10,%esp
80488e3: 83 7d dc 00 cmpl $0x0,-0x24(%ebp)
80488e7: 75 06 jne 80488ef <phase_2+0x2e>
80488e9: 83 7d e0 01 cmpl $0x1,-0x20(%ebp)
80488ed: 74 05 je 80488f4 <phase_2+0x33>
80488ef: e8 e9 05 00 00 call 8048edd <explode_bomb>
80488f4: 8d 5d dc lea -0x24(%ebp),%ebx
80488f7: 8d 75 ec lea -0x14(%ebp),%esi
80488fa: 8b 43 04 mov 0x4(%ebx),%eax
80488fd: 03 03 add (%ebx),%eax
80488ff: 39 43 08 cmp %eax,0x8(%ebx)
8048902: 74 05 je 8048909 <phase_2+0x48>
8048904: e8 d4 05 00 00 call 8048edd <explode_bomb>
8048909: 83 c3 04 add $0x4,%ebx
804890c: 39 f3 cmp %esi,%ebx
804890e: 75 ea jne 80488fa <phase_2+0x39>
8048910: 8b 45 f4 mov -0xc(%ebp),%eax
8048913: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
804891a: 74 05 je 8048921 <phase_2+0x60>
804891c: e8 7f fc ff ff call 80485a0 __stack_chk_fail@plt
8048921: 8d 65 f8 lea -0x8(%ebp),%esp
8048924: 5b pop %ebx
8048925: 5e pop %esi
8048926: 5d pop %ebp
8048927: c3 ret
具體的匯編代碼不分析了,有時間有需求就慢慢分析一遍,
自行判別是哪種情況:
斐波拉契數列:
0 1 1 2 3 5
加序號增:
0 1 3 6 10 15
程式員數列:
1 2 4 8 16 32

bomb-3

總體思路:switch陳述句,第一個輸入0—7,根據你的第一個輸入,得到后面的結果,
我見過二種,一種輸入是“%d %d”
另一種是“%d %c %d ”
第一種網上資料比較全,很常見,建議先看看那些
我剛好遇到 了第二種,
8048928: 55 push %ebp
8048929: 89 e5 mov %esp,%ebp
804892b: 83 ec 24 sub $0x24,%esp
804892e: 65 a1 14 00 00 00 mov %gs:0x14,%eax
8048934: 89 45 f4 mov %eax,-0xc(%ebp)
8048937: 31 c0 xor %eax,%eax
8048939: 8d 45 f0 lea -0x10(%ebp),%eax
804893c: 50 push %eax
804893d: 8d 45 eb lea -0x15(%ebp),%eax
8048940: 50 push %eax
8048941: 8d 45 ec lea -0x14(%ebp),%eax
8048944: 50 push %eax
8048945: 68 c1 92 04 08 push $0x80492c1
804894a: ff 75 08 pushl 0x8(%ebp)
804894d: e8 9e fc ff ff call 80485f0 <__isoc99_sscanf@plt>

在呼叫函式 call 80485f0 <__isoc99_sscanf@plt>
之前有一個壓堆疊操作 push $0x80492c1
根據這個地址push $0x80492c1
通過命令列查看到底你的實驗屬于哪種情況:

我的是一個int 一個char 一個int,
看如下重點代碼:
804895f: 83 7d ec 07 cmpl $0x7,-0x14(%ebp)
8048963: 0f 87 ec 00 00 00 ja 8048a55 <phase_3+0x12d>
8048969: 8b 45 ec mov -0x14(%ebp),%eax
804896c: ff 24 85 e0 92 04 08 jmp *0x80492e0(,%eax,4)
8048973: b8 66 00 00 00 mov $0x66,%eax
8048978: 81 7d f0 c2 00 00 00 cmpl $0xc2,-0x10(%ebp)
804897f: 0f 84 da 00 00 00 je 8048a5f <phase_3+0x137>
8048985: e8 53 05 00 00 call 8048edd <explode_bomb>
804898a: b8 66 00 00 00 mov $0x66,%eax
804898f: e9 cb 00 00 00 jmp 8048a5f <phase_3+0x137>
8048994: b8 63 00 00 00 mov $0x63,%eax
8048999: 83 7d f0 43 cmpl $0x43,-0x10(%ebp)
804899d: 0f 84 bc 00 00 00 je 8048a5f <phase_3+0x137>
80489a3: e8 35 05 00 00 call 8048edd <explode_bomb>

決議:
804895f: 83 7d ec 07 cmpl $0x7,-0x14(%ebp)
8048963: 0f 87 ec 00 00 00 ja 8048a55 <phase_3+0x12d>
;第一個int在大于7,就會bomb,
mov -0x14(%ebp),%eax
;將第一個輸入傳給eax,我輸的是1,
804896c: ff 24 85 e0 92 04 08 jmp *0x80492e0(,%eax,4)
;根據你的選擇給你跳轉到不同位置, *0x80492e0反匯編代碼里面沒有這個地址,我猜是在別處參考的宏?或者由其他程式操作好了的記憶體空間?我第一個數是1,所以到第二個分支,
8048994: b8 63 00 00 00 mov $0x63,%eax
8048999: 83 7d f0 43 cmpl $0x43,-0x10(%ebp)
804899d: 0f 84 bc 00 00 00 je 8048a5f <phase_3+0x137>
80489a3: e8 35 05 00 00 call 8048edd <explode_bomb>
;第一句把0x63給eax
;第二句,比較第三個int型別的數是否為0x43,即67
;第三句,如果是,就跳轉到 0x8048a5f處執行
;第四句,如果第三個數不等于67繼續執行,召喚雷暴(天空龍的召雷彈,沒玩過游戲王的小伙伴忽略),call 8048edd <explode_bomb>,
所以第一個數是1.第三個就是67,接下來,跳轉到 0x8048a5f處執行:
8048a5f: 3a 45 eb cmp -0x15(%ebp),%al
8048a62: 74 05 je 8048a69 <phase_3+0x141>
8048a64: e8 74 04 00 00 call 8048edd <explode_bomb>
;比較第二個char字符是不是等于eax的第八位,之前賦值了,mov $0x63,%eax(自行往上看看代碼),那就是看看ASCII是不是ox63,即99,即c
;是c,就跳轉
;不是,召雷彈,bomb
所以答案是 1 c 67;
不唯一,你可以試試第一個數是其他,把代碼過一遍,

bomb-4

我見過二種情況的代碼,一種特別簡單出答案,還有一種需要看代碼,二種情況都是輸入2 個數,
第一種:
主要找到這段代碼:
8048ce4: e8 6a ff ff ff 8048c53 call func4
8048ce9: 83 c4 10 add $0x10,%esp
8048cec: 3b 45 f0 cmp -0x10(%ebp),%eax
8048cef: 74 05 je 8048cf6 <phase_4+0x58>
;呼叫了函式func4,回傳結果存在eax,
;esp堆疊指標加0x10,忽略
;第三句把函式回傳的eax和輸入的第一個數相比,相等就跳轉,意味著成功,
其實你可以,先輸入1 3,然后,運行到這里設定斷點,
在gdb下,設定斷點的技巧如下,
1.用b +地址/label,設定斷點
2.已經ni +num代表 從當前往走num步
3.stepi,走一步
設定 b 0x 8048cec斷點(上面字體加重處),然后使用
print $eax
查看eax的值,把第一個數設定為這個值就好,不用看func4,
第二種:
可以慢慢看func4函式,也可以通過上面的方法估算出來,現在看代碼的要求:
8048b01: 83 7d ec 0e cmpl $0xe,-0x14(%ebp)
8048b05: 76 05 jbe 8048b0c <phase_4+0x39>
這說明,第一個輸入不超過0xe,即14;
8048b0f: 6a 0e push $0xe
8048b11: 6a 00 push $0x0
8048b13: ff 75 ec pushl -0x14(%ebp)
;傳參給func4
8048b16: e8 61 ff ff ff call 8048a7c func4
8048b1b: 83 c4 10 add $0x10,%esp
8048b1e: 83 f8 1b cmp $0x1b,%eax
8048b21: 75 06 jne 8048b29 <phase_4+0x56>
8048b23: 83 7d f0 1b cmpl $0x1b,-0x10(%ebp)
8048b27: 74 05 je 8048b2e <phase_4+0x5b>
8048b29: e8 af 03 00 00 call 8048edd <explode_bomb>
;呼叫func4,回傳給eax
;看eax的值是不是0x1b即27,如果不是,召雷
;如果是,再判斷第二個引數是不是等于0x1b,即27
;否則召雷
;讀到這里,我們知道第一個引數是小于等于14
;第二個引數是27
;這時候,需要去讀func4,看看函式的邏輯,也可以不,就把第一個數從0到14遍歷的試一遍,也可以得到解,
;我的代碼算出來是 9 27,

bomb-5

主要就是陣列操作,
我見過二種情況,第一種情況網上的參考資料比較多,直接搜bomblab,基本上絕大多數講的都是一個字符尋找的故事,
我遇到的情況是第二種,這里講一下,

8048b4c: e8 67 02 00 00 call 8048db8 <string_length>
8048b51: 83 c4 10 add $0x10,%esp
8048b54: 83 f8 06 cmp $0x6,%eax
8048b57: 74 05 je 8048b5e <phase_5+0x1d>
8048b59: e8 7f 03 00 00 call 8048edd <explode_bomb>
;上面的代碼功能簡單自行閱讀,就是輸入六個字串,不允許多也不允許少,
8048b5e: 89 d8 mov %ebx,%eax
8048b60: 83 c3 06 add $0x6,%ebx
;ebx=eax+6,后面回圈每次eax加一,當ebx==eax時,回圈結束,遍歷了6個字符,
8048b63: b9 00 00 00 00 mov $0x0,%ecx
;ecx初始化,這是最關鍵的遍歷,
8048b68: 0f b6 10 movzbl (%eax),%edx
8048b6b: 83 e2 0f and $0xf,%edx
;依次取出eax的值,賦給edx,and操作是與操作,edx與0xf,只要字符所對應ASCII碼的二進制數的后四位,賦給edx,作為后面的偏移量
8048b6e: 03 0c 95 add 0x8049300(,%edx,4),%ecx
8048b75: 83 c0 01 add $0x1,%eax
8048b78: 39 d8 cmp %ebx,%eax
;0x8049300是陣列的第一個數字所在位置,0x8049300(,%edx,4)=0x8049300+edx*4,就是把edx作為偏移量,取出陣列中的值,加到ecx中
;然后,eax加一,遍歷下一個字符
;比較ebx和eax相等與否,相等結束回圈,
8048b7c: 83 f9 3f cmp $0x3f,%ecx
最后看ecx的累加和是不是0x3f,即63.
現在我們看看陣列里面有什么值吧,先再gdb中用
1.b phase_5
2.run answer(用一個檔案把前面的結果寫在一個名為answer的檔案中)
新建檔案,名為answer
answer里面的編輯
3.在 phase_5處產生了斷點停頓,再輸入
x /64w 0x8049300
如下圖:
運行結果

現在就是找6個字符,他們的二進制最后四位最為偏移(起始點為2,然后是10,6,1.,,,每個人的代碼可能不一樣),從陣列中取出6個數,其何為63(每個人的代碼不一樣,見上面代碼分析),

舉個例子,如果你的6個字母中有A,其ASCII碼值是0100 0001
取其后四位,0001,偏移是1,那就是相當于把10加入到了ecx中,再例如是B 0100 0010,其后四位是0010,偏移是2,就是陣列中的6,同理,其他字符,(注意如果偏移是0,就是陣列第一個)
陣列情況如下:

bomb-6

我的代碼是一個鏈表,然后讓你a[i]=7-a[i],最后降序排列,把排序順序輸出,
8048b8b: 55 push %ebp
8048b8c: 89 e5 mov %esp,%ebp
8048b8e: 56 push %esi
8048b8f: 53 push %ebx
8048b90: 83 ec 48 sub $0x48,%esp
8048b93: 65 a1 14 00 00 00 mov %gs:0x14,%eax
8048b99: 89 45 f4 mov %eax,-0xc(%ebp)
8048b9c: 31 c0 xor %eax,%eax
8048b9e: 8d 45 c4 lea -0x3c(%ebp),%eax
8048ba1: 50 push %eax
8048ba2: ff 75 08 pushl 0x8(%ebp)
8048ba5: e8 5b 03 00 00 call 8048f05 <read_six_numbers>
;有了前面5題基礎,很顯然,初始化堆疊幀,讀六個數
8048baa: 83 c4 10 add $0x10,%esp
8048bad: be 00 00 00 00 mov $0x0,%esi
8048bb2: 8b 44 b5 c4 mov -0x3c(%ebp,%esi,4),%eax
8048bb6: 83 e8 01 sub $0x1,%eax
8048bb9: 83 f8 05 cmp $0x5,%eax
8048bbc: 76 05 jbe 8048bc3 <phase_6+0x38>
8048bbe: e8 1a 03 00 00 call 8048edd <explode_bomb>
8048bc3: 83 c6 01 add $0x1,%esi;esi=0+1
8048bc6: 83 fe 06 cmp $0x6,%esi
8048bc9: 74 1b je 8048be6 <phase_6+0x5b>
8048bcb: 89 f3 mov %esi,%ebx
8048bcd: 8b 44 9d c4 mov -0x3c(%ebp,%ebx,4),%eax
8048bd1: 39 44 b5 c0 cmp %eax,-0x40(%ebp,%esi,4)
8048bd5: 75 05 jne 8048bdc <phase_6+0x51>
8048bd7: e8 01 03 00 00 call 8048edd <explode_bomb>
8048bdc: 83 c3 01 add $0x1,%ebx
8048bdf: 83 fb 05 cmp $0x5,%ebx
8048be2: 7e e9 jle 8048bcd <phase_6+0x42>
8048be4: eb cc jmp 8048bb2 <phase_6+0x27>
;輸入的數進行限制,不許大于6,有二個回圈嵌套,不許用值相同,

8048be6: 8d 45 c4 lea -0x3c(%ebp),%eax
8048be9: 8d 5d dc lea -0x24(%ebp),%ebx
8048bec: b9 07 00 00 00 mov $0x7,%ecx
8048bf1: 89 ca mov %ecx,%edx
8048bf3: 2b 10 sub (%eax),%edx
8048bf5: 89 10 mov %edx,(%eax)
8048bf7: 83 c0 04 add $0x4,%eax
8048bfa: 39 c3 cmp %eax,%ebx
8048bfc: 75 f3 jne 8048bf1 <phase_6+0x66>
;讓a[i]=7-a[i];
8048bfe: bb 00 00 00 00 mov $0x0,%ebx
8048c03: eb 16 jmp 8048c1b <phase_6+0x90>
8048c05: 8b 52 08 mov 0x8(%edx),%edx
8048c08: 83 c0 01 add $0x1,%eax
8048c0b: 39 c8 cmp %ecx,%eax
8048c0d: 75 f6 jne 8048c05 <phase_6+0x7a>
8048c0f: 89 54 b5 dc mov %edx,-0x24(%ebp,%esi,4)
8048c13: 83 c3 01 add $0x1,%ebx
8048c16: 83 fb 06 cmp $0x6,%ebx
8048c19: 74 17 je 8048c32 <phase_6+0xa7>
8048c1b: 89 de mov %ebx,%esi
8048c1d: 8b 4c 9d c4 mov -0x3c(%ebp,%ebx,4),%ecx
8048c21: b8 01 00 00 00 mov $0x1,%eax
8048c26: ba 34 b1 04 08 mov $0x804b134,%edx
8048c2b: 83 f9 01 cmp $0x1,%ecx
8048c2e: 7f d5 jg 8048c05 <phase_6+0x7a>
8048c30: eb dd jmp 8048c0f <phase_6+0x84>
8048c32: 8b 5d dc mov -0x24(%ebp),%ebx
8048c35: 8d 45 dc lea -0x24(%ebp),%eax
8048c38: 8d 75 f0 lea -0x10(%ebp),%esi
8048c3b: 89 d9 mov %ebx,%ecx
8048c3d: 8b 50 04 mov 0x4(%eax),%edx
8048c40: 89 51 08 mov %edx,0x8(%ecx)
8048c43: 83 c0 04 add $0x4,%eax
8048c46: 89 d1 mov %edx,%ecx
8048c48: 39 c6 cmp %eax,%esi
8048c4a: 75 f1 jne 8048c3d <phase_6+0xb2>
8048c4c: c7 42 08 00 00 00 00 movl $0x0,0x8(%edx)
8048c53: be 05 00 00 00 mov $0x5,%esi
8048c58: 8b 43 08 mov 0x8(%ebx),%eax
8048c5b: 8b 00 mov (%eax),%eax
8048c5d: 39 03 cmp %eax,(%ebx)
8048c5f: 7d 05 jge 8048c66 <phase_6+0xdb>
8048c61: e8 77 02 00 00 call 8048edd <explode_bomb>
8048c66: 8b 5b 08 mov 0x8(%ebx),%ebx
8048c69: 83 ee 01 sub $0x1,%esi
8048c6c: 75 ea jne 8048c58 <phase_6+0xcd>
8048c6e: 8b 45 f4 mov -0xc(%ebp),%eax
8048c71: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
8048c78: 74 05 je 8048c7f <phase_6+0xf4>
;根據每個序號下的數值,進行倒序排列
那數值是多少?它是事先寫好在程式中的,可以查看,其地址為:
0x804b134,可以理解它為鏈表的頭指標
我們通過gdb查看:
鏈表
查看步驟還是設斷點,run answer,再用x /20dw 0x804b134,

需要我們輸入的就是這個排列的順序:
996 6
934 1
529 2
345 3
211 4
133 5
別忘了,a[i]=7-a[i],所以結果是:
1 6 5 4 3 2

secret

打開匯編程式,找到函式phase_defused
08049042 <phase_defused>:
8049042: 55 push %ebp
8049043: 89 e5 mov %esp,%ebp
8049045: 83 ec 68 sub $0x68,%esp
8049048: 65 a1 14 00 00 00 mov %gs:0x14,%eax
804904e: 89 45 f4 mov %eax,-0xc(%ebp)
8049051: 31 c0 xor %eax,%eax
8049053: 83 3d ac b7 04 08 06 cmpl $0x6,0x804b7ac
804905a: 75 6f jne 80490cb <phase_defused+0x89>
804905c: 83 ec 0c sub $0xc,%esp
804905f: 8d 45 a4 lea -0x5c(%ebp),%eax
8049062: 50 push %eax
8049063: 8d 45 a0 lea -0x60(%ebp),%eax
8049066: 50 push %eax
8049067: 8d 45 9c lea -0x64(%ebp),%eax
804906a: 50 push %eax
804906b: 68 d3 94 04 08 push $0x80494d3
8049070: 68 b0 b8 04 08 push $0x804b8b0
8049075: e8 76 f5 ff ff call 80485f0 __isoc99_sscanf@plt
804907a: 83 c4 20 add $0x20,%esp
804907d: 83 f8 03 cmp $0x3,%eax
8049080: 75 39 jne 80490bb <phase_defused+0x79>
8049082: 83 ec 08 sub $0x8,%esp
8049085: 68 dc 94 04 08 push $0x80494dc
804908a: 8d 45 a4 lea -0x5c(%ebp),%eax
804908d: 50 push %eax
804908e: e8 47 fd ff ff call 8048dda <strings_not_equal>
8049093: 83 c4 10 add $0x10,%esp
8049096: 85 c0 test %eax,%eax
8049098: 75 21 jne 80490bb <phase_defused+0x79>
804909a: 83 ec 0c sub $0xc,%esp
804909d: 68 a0 93 04 08 push $0x80493a0
80490a2: e8 19 f5 ff ff call 80485c0 puts@plt
80490a7: c7 04 24 c8 93 04 08 movl $0x80493c8,(%esp)
80490ae: e8 0d f5 ff ff call 80485c0 puts@plt
80490b3: e8 20 fc ff ff call 8048cd8 <secret_phase>
80490b8: 83 c4 10 add $0x10,%esp
80490bb: 83 ec 0c sub $0xc,%esp
80490be: 68 00 94 04 08 push $0x8049400
80490c3: e8 f8 f4 ff ff call 80485c0 puts@plt
80490c8: 83 c4 10 add $0x10,%esp
80490cb: 8b 45 f4 mov -0xc(%ebp),%eax
80490ce: 65 33 05 14 00 00 00 xor %gs:0x14,%eax
80490d5: 74 05 je 80490dc <phase_defused+0x9a>
80490d7: e8 c4 f4 ff ff call 80485a0 __stack_chk_fail@plt
80490dc: c9 leave
80490dd: c3 ret
80490de: 66 90 xchg %ax,%ax
;把加粗的字串列印出來 x /s 地址

有第一個可知,在輸入為 %d %d后有一個%s,然而有連續二個int輸入就是第四關,而%s的字串就是密碼,這個密碼是最后一個,我的是hamster,(每個人可能不同),
因此在回答第四關結果的時候,輸入:9 27 hamster
hmaster為開啟秘密關卡的鑰匙,沒有這個,第六關結束后不會秘密關卡不會爆出,加上這個口令才會觸發秘密關卡,是不是很有趣呢?

秘密關卡,根據上面6個實驗g觀賞匯編的經驗,自己去做吧,不會的話可以求助互聯網,也可以問我,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/238114.html

標籤:其他

上一篇:跟我一起學資料結構(2)從陣列 到 鏈表

下一篇:玩轉資料結構(2)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more