1. 程式人生 > >CSAPP Lab:Attack Lab——手把手教你寫病毒(大誤

CSAPP Lab:Attack Lab——手把手教你寫病毒(大誤

png -o spa 字符 寄存器 產生 方法 函數返回 發現

這個實驗要求在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

:目標“gadget farm”的源代碼,用於產生return-oriented programming攻擊。
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——手把手教你寫病毒(大誤