CSAPP Lab:Attack Lab——手把手教你寫病毒(大誤
這個實驗要求在5個有不同安全漏洞的代碼上進行攻擊,攻擊分為兩部分:
Part 1:Code Injection Attacks(緩沖區溢出攻擊)
Part 2:Return-Oriented Programming(ROP攻擊)
做題之前一定要仔細閱讀write up:http://csapp.cs.cmu.edu/3e/attacklab.pdf,跟著實驗說明做會明朗很多。
文件說明
ctarget
:一個容易遭受code injection攻擊的可執行程序。 rtarget
:一個容易遭受return-oriented programming攻擊的可執行程序。 cookie.txt
:一個8位的十六進制碼,用於驗證身份的唯一標識符。 farm.c
hex2raw
:一個生成攻擊字符串的工具。
Part 1:Code Injection Attacks
Level 1
第一題是要我們攻擊一個叫test的方法,這個方法中有個getbuf方法,要求從getbuf返回時不讓它返回到test,而是返回到touch方法。
我們可以發現getbuf是一個輸入字符串的方法,那麽我們只要將此方法開辟的棧給填滿,然後再填上touch方法的地址,那麽就能實現跳轉到touch的效果了!
所以我們要做兩步:
首先確定getbuf方法的緩沖區大小,反匯編gets方法查看:
得到此方法的緩沖區為40個字節。
其次我們看下touch方法的地址:
地址是4017c0,那麽我們需要輸入的字符串就得到了:
前面的40個字節都是假的,隨意填,關鍵在於最後8位,填的時候需要註意按照小端的排列順序。
然後用hex2raw來生成字節碼,成功入侵垃圾代碼!
Level 2
根據題目指示,這一題我們要做的同樣是跳轉,這次我們跳轉的是touch2函數,看下touch2函數長什麽樣,發現這裏需要我們傳入一個參數,根據實驗說明我們知道這個參數的位置在%rdi。所以我們需要註入一段自己的入侵代碼了。
這題我的思路是這樣的:
1.寫一段代碼將參數(也就是每個人不同的cookie),放入寄存器%rip中,然後將touch2的地址壓棧,為的是通過ret返回時可以跳轉到ret。
2.然後通過第一題的方式如法炮制利用緩沖區溢出的漏洞將getbuf函數返回到上述的代碼起始位置,也就是緩沖區的起始位置執行攻擊代碼。
我寫的匯編,第一個立即數是我的cookie,第二個是touch2的地址:
利用gcc和objdump命令得到機器代碼:
然後需要找到緩沖區的其實地址,我們需要gdb在getbuf打斷點查看%rsp的值,但這裏我碰到了個小問題,我前後兩次執行程序查看%rsp的值是不一樣的,導致我第一次實驗始終不通過,沒有能夠理解這裏為什麽會變化,有讀者如果知道可以留言給我。
這裏用最新的rsp值即可再次入侵垃圾代碼!
Level 3
這一題和上面一題很像,要求是跳轉到touch3,同樣需要傳入一個參數,不過這次是傳入一個地址,而不是直接的cookie:
可以看到touch3裏又調用了hexmatch,這裏需要註意了,我們存放cookie的地址,不能在緩沖區隨便放,因為hexmatch裏的數組還會把我們的cookie給覆蓋掉,我的想法是可以講cookie放到緩沖區之上,也就是返回地址再上面8個字節,也就是%rsp+30。
匯編代碼:
字節碼::
結果:
Part 2:Return-Oriented Programming
我們之前幾題都是圍繞著緩沖區溢出的話題,但是從這裏開始,rtarget文件中對於上述攻擊有了防禦措施,比如棧地址隨機化或者緩沖區的代碼直接被設置成為不可執行,這樣就斷絕這種攻擊的可能性,也是現在許多系統所采取的方式,但是攻擊者並不會止步於此,於是ROP就誕生了。ROP攻擊的大致意思就是利用現有的代碼,通過不斷的跳轉,拼湊出自己想要的結果來進行攻擊的方式。
下面是實驗手冊給出的部分指令所對應的字節碼,我們需要在rtarget文件中挑選這些指令去執行之前level2和level3的攻擊。
Level 2:
按照題目提示,第一題的代碼可以在這段代碼裏找:
我的思路是先將cookie pop到rax,然後用mov指令將rax移動到rdi,最後通過覆蓋返回地址來執行touch2。
通過觀察我們要的命令在這裏:
分別是58(pop %rax),48 89 c7(movq %rax,%rdi)
地址分別是0x4019ab,0x4019c5,touch2的地址是0x4017ec。
於是我們拼湊的代碼就出來了:
Bingo!
Level 3:
這題略有難度,最近大病一場,等恢復後再挑戰這一題。
CSAPP Lab:Attack Lab——手把手教你寫病毒(大誤