學(xué)習(xí)中級ROP:
__libc_csu_init 函數(shù)實現(xiàn)對libc的初始化操作,在 libc_csu_init 中我們主要利用了以下寄存器:利用尾部代碼控制了 rbx姨伟,rbp夺荒,r12技扼,r13剿吻,r14和橙,r15魔招。
利用中間部分的代碼控制了 rdx办斑,rsi乡翅,edi蠕蚜。
image.png
那一道題實踐下:ret2csu
image.png
image.png
棧溢出漏洞癣疟,棧大小為40:
一開始的思路是puts那么多,泄露got表直接剛邪蛔,后來發(fā)現(xiàn)不行,got表地址都是0淤击,原因在這里:
image.png
這里直接設(shè)置為0遭贸,就是不讓你用got表著蛙,沒辦法了猎唁,題目是中級ROP技術(shù)顷蟆,去學(xué)了一波帐偎,回來自己做了下:
image.png
但是發(fā)現(xiàn)get不到shell削樊,就很佛了甸箱,迷......
image.png
下面是看大佬博客才悟到的!查找了一波發(fā)現(xiàn)是setbuf搞的鬼谴蔑?围小!
image.png
這里直接用初始化的函數(shù)代替了,試了下树碱,ok!
image.png
要么是0x600E10肯适,要么是0x600E18,二選一成榜,其他的不行~
image.png
總結(jié):
這道題難在got無法直接用的情況下用中級ROP技術(shù)框舔,找__libc_csu_init中的ROP鏈,R12是關(guān)鍵J昊椤(關(guān)系到函數(shù)調(diào)用)刘绣,這里由于R12的參數(shù)會受setbuf的影響,所以用初始化的參數(shù)去代替纬凤,程序便正常運行了,相當(dāng)于用替身繞過阻攔拇舀,先把參數(shù)放好薄辅,然后再回去找替身調(diào)用就OK了源请。
這里學(xué)到一個技巧良蛮,查看一堆內(nèi)存:tel 0xxxxx
下面上一道中級ROP+mprotect的OJ皮胡,level5:
這里假設(shè)system和execve被禁用甩栈,實際上這種情況很常見殴蹄,利用mprotect和mmap來解決
簡單來說mmap函數(shù)創(chuàng)建一塊內(nèi)存區(qū)域妓蛮,將一個文件映射到該區(qū)域,進程可以像操作內(nèi)存一樣操作文件筋现。mprotect函數(shù)可以改變一塊內(nèi)存區(qū)域的權(quán)限(以頁為單位),這里通常把bss的權(quán)限改為可讀可寫可執(zhí)行,一般來說64位下mprotect(0x600000,0x1000,7)(起始地址,長度,權(quán)限)32位下mprotect(0x804A000烁落,0x400,7)绑洛,長度都是對齊的绑蔫。
一開始檢查程序的保護機制:
image.png
只有堆棧不可執(zhí)行的權(quán)限亡资,可以改got表,沒有棧溢出保護(可能有棧溢出漏洞)
ida分析:
image.png
image.png
明顯的棧溢出漏洞坡垫,通過爆破可以檢測出棧大懈茸俊:136(覆蓋ebp)
image.png
image.png
思路:
這里假設(shè)不能使用system和execve函數(shù)的話代赁,想到是自己生成shellcode兽掰,放在bss段中窖壕,然而bss是不可執(zhí)行的,要改寫那個權(quán)限烦磁,就要用到mprotect和mmap珍逸,64位下我們優(yōu)先使用mprotcet叭爱,需要先求出這個mprotect函數(shù)的真實地址,然后在got表中調(diào)用胧砰,然而原本的got表是沒有的古掏,所以我們要覆蓋已有函數(shù)A的got表地址,這樣下一次調(diào)用A函數(shù)就直接調(diào)用mprotect函數(shù)炼吴。然后我們再覆蓋B函數(shù)的got為bss段的地址,調(diào)用B函數(shù)就可以運行bss段中的shellcode了荣德。還有一個問題童芹,64位下的ROP gadget
發(fā)現(xiàn)沒有三個參數(shù)同時滿足的假褪,想到可以使用__libc_csu_init里面的那個rop鏈(如不懂請看中級ROP技術(shù)),這樣搞清楚了生音,接下來就是敲代碼的事了久锥。
image.png
沒有合適的ROP
image.png
有合適的ROP瑟由,接下來就是寫腳本了:
image.png
中級ROP技術(shù)我們用一個函數(shù)來整理(因為會多次用到)
image.png
最后實現(xiàn)各種操作:
image.png
先本地測試:
image.png
最后遠程getsehll:
image.png
總結(jié):中級ROP適用于64位下的需要3位參數(shù)的函數(shù)青伤,一般在ROPGadget中很難找齊殴瘦,就可以這么用,方便丰歌,同時掌握改寫內(nèi)存權(quán)限和覆蓋got表的能力屉凯,一舉三得!能力得到提升悠砚,繼續(xù)加油。
這里介紹下Brop:
BROP 是沒有對應(yīng)應(yīng)用程序的源代碼或者二進制文件下绑咱,對程序進行攻擊,劫持程序的執(zhí)行流描融。
攻擊條件 :
- 源程序必須存在棧溢出漏洞,以便于攻擊者可以控制程序流程薄榛。
- 服務(wù)器端的進程在崩潰之后會重新啟動让歼,并且重新啟動的進程的地址與先前的地址一樣(這也就是說即使程序有 ASLR 保護,但是其只是在程序最初啟動的時候有效果)硬猫。目前 nginx, MySQL, Apache, OpenSSH 等服務(wù)器應(yīng)用都是符合這種特性的改执。
基本思路
在 BROP 中,基本的遵循的思路如下:
- 判斷棧溢出長度
- 暴力枚舉
- Stack Reading
- 獲取棧上的數(shù)據(jù)來泄露 canaries衬横,以及 ebp 和返回地址终蒂。
- Blind ROP
- 找到足夠多的 gadgets 來控制輸出函數(shù)的參數(shù),并且對其進行調(diào)用噪叙,比如說常見的 write 函數(shù)以及 puts 函數(shù)霉翔。
- Build the exploit
- 利用輸出函數(shù)來 dump 出程序以便于來找到更多的 gadgets,從而可以寫出最后的 exploit子眶。
具體的操作和詳細說明:http://www.reibang.com/p/2bd323e7e97f
- 利用輸出函數(shù)來 dump 出程序以便于來找到更多的 gadgets,從而可以寫出最后的 exploit子眶。