pwn和逆向的区别_Pwn之简单patch
9/27
文章共計1389個詞
圖片xue微有點多
注意流量哦
預計閱讀7分鐘
來和我一起閱讀吧
1
引言
在攻防的時候不僅僅需要break,還需要fix將漏洞patch上。
2
工具?
這里我使用的是keypatch這個ida腳本
下載地址:https://github.com/keystone-engine/keypatch/blob/master/keypatch.py3
棧溢出的patch
漏洞原理
由于輸入函數的輸入長度超過了局部變量所開辟的空間,因此使得輸入能夠覆蓋到返回地址
patch
簡單了解原理之后,我們可以知道,棧溢出起始就是輸入的長度過大,那么我們將輸入長度修改到局部變量開辟空間的范圍內即可
例子
32為情況下
我們可以看到,buf距離ebp(棧底)距離0x28,但是輸入卻能夠輸入0x100,很明顯的棧溢出漏洞
可以看到這里參數為0x100,因為32位程序是通過棧傳參的。
再裝好keypatch之后,會在Edit選項欄中出現keypatch的選項,接著選中參數0x100,點擊patch
將長度改成小于0x28即可,這里需要注意輸入長度要為16進制。這里輸入輸入3個nop指令是因為這條指令本身Size為5,然后push 0x20為2,因此需要填充三個nop與原本的Size一致。
修改完畢后,保存即可
64位情況下
我們知道64位下是通過寄存器傳參數的,因此我們再找長度的參數時,找到相應的寄存器即可
例如read函數的長度參數是通過rdx(edx)傳入的,找到相應的寄存器按照上面方法修改即可。
4
格式化字符串的patch
漏洞原理
格式化字符串的漏洞是因為,程序中存在著格式化字符串輸出函數,典型的printf,但是printf,只有格式化字符串參數,而沒有后續的參數一,參數二,并且格式化字符串參數由我們所控制,從而導致了任意地址讀寫的漏洞觸發。
例子
題目中存在著典型的格式化字符串漏洞,那么修改漏洞有幾種方法,例如將printf函數修改為puts函數或者添加%s的參數。
方法一
若程序中即存在printf函數,又存在puts函數,那么我們可以將printf函數修改為puts函數
我們找到puts函數的plt表地址,因為puts函數也是帶一個參數,并且puts函數與printf函數的plt表地址長度一致,因此直接修改不會造成程序down掉
修改成puts函數的地址
修改成功后的效果,但是puts函數與printf函數還是有一點點區別的,因為puts函數是自動在輸出的字符串尾部加入一個回車符,在有些比賽的check腳本中是通過比較兩次輸入與輸出是否全等,就會導致這種patch方法不能過關。
方法二
加入一個%s參數
可以看到除了傳遞格式化字符串參數以為,程序還存在mov eax,0,我們可以利用該指令修改,但是想要修改為%s還有一個問題,程序中不存在%s這個字符,就需要我們手動添加進去
我們可以在.eh_frame這個段中填入%s這個字符串,這個段中的信息不會影響程序的正常運行。
記住填入的地址0x400c01
mov edi, offset 0x400c01;mov rsi,offset format;完成參數修改
修改完成
堆之uaf漏洞
堆中較為常見的漏洞use after free
漏洞原理
由于堆塊釋放后沒有給指針置空,使得被釋放的堆塊能夠被修改或者重復使用,導致漏洞
例子
free完之后沒有將指針置空,很明顯的uaf漏洞,想要修補uaf漏洞,則將free之后的指針置空即可
可以看到在調用完free之后,沒有多少空間可以寫下新的匯編代碼,因此需要與上一個方法一致,跳轉到.eh_frame段上
將call free指令修改為跳轉指令,在.eh_frame段上寫匯編代碼
call 0x900; ? ? ? ? ? #調用free函數mov ? ? eax, [rbp-0xc]; #取出下標值cdqe;lea ? ? rdx, ds:0[rax*8];lea rax, qword ptr [heap];mov r8,0; #段地址不能直接賦予立即數mov [rdx+rax],r8;jmp 0xD56;patch效果
5
總結
對于棧溢出來說,patch比較簡單,只需要修改輸入長度即可
對于格式化字符串漏洞來說,若有puts函數則將printf函數修改為puts函數,若沒有則在.eh_frame段上創造%s
對于堆的uaf來說,漏洞patch思路很簡單,只需要將指針置空即可,但是需要了解匯編代碼。
6
參考文章
https://xz.aliyun.com/t/58687
相關實驗
CTF-PWN練習?
https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014103116591300001PWN是CTF競賽中的主要題型之一,主要考查參賽選手的逆向分析、漏洞挖掘以及Exploit編寫能力。通過由淺入深的方式,一步一步講解棧溢出攻擊原理與實踐,同時詳細介紹了Linux下GDB調試器的基本使用方法。
9/27
歡迎投稿至qq:3200599554
有才能的你快來投稿吧!
投稿細則都在里面了,點擊查看哦
重金懸賞 | 合天原創投稿漲稿費啦!
戳總結
以上是生活随笔為你收集整理的pwn和逆向的区别_Pwn之简单patch的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Packet Tracer 通过配置静态
- 下一篇: MongoDb 大数据查询优化、 Mon