NX机制及绕过策略-ret2libc
程序:
1.c
0x01 NX介紹
溢出攻擊的本質在于馮·諾依曼計算機模型對數據和代碼沒有明確區(qū)分這一先天性缺陷。因為攻擊者可以將代碼放置于數據區(qū)段,轉而讓系統(tǒng)去執(zhí)行。
NX緩解機制開啟后,使某些內存區(qū)域不可執(zhí)行,并使可執(zhí)行區(qū)域不可寫。示例:使數據,堆棧和堆段不可執(zhí)行,而代碼段不可寫。
2. 編譯
gcc -Wall -g -o nx 1.c -fno-stack-protector -m32沒有使用 -z execstack ,所以數據所在內存頁標識為不可執(zhí)行,當程序溢出成功轉入shellcode時,程序會嘗試在數據頁面上執(zhí)行指令,此時CPU就會拋出異常,而不是去執(zhí)行惡意指令。
關閉ASLR
echo 0 > /proc/sys/kernel/randomize_va_space
我們用下面的程序執(zhí)行獲取權限,將會報錯(我試了,這里就不貼圖了),因為開啟了NX保護機制。這是關閉NX獲取權限的,我寫在這篇文章上了:
https://blog.csdn.net/qq_41683305/article/details/105014197
0x03 原因
運行起nx,并保持運行狀態(tài),新打開一個終端,輸入ps -a,查看nx的pid,然后執(zhí)行cat /proc/52799/maps
發(fā)現stack不可以執(zhí)行,我們的shellcode不可以執(zhí)行了
0x04 ret2libc
ret2libc即控制函數執(zhí)行l(wèi)ibc中的函數,通常是返回至某個函數的plt處或者函數的具體位置(即函數對應的got表項的內容)。
一般情況下,我們會選擇執(zhí)行system("/bin/sh"),在不存在ASLR(地址隨機化)的情況下,可以直接通過調試獲得system的函數地址以及“/bin/sh”的地址 。
布局完成后,返回地址return_addr被覆蓋為libc文件里的system函數地址,當運行到esp位置時,會跳轉到system中執(zhí)行,同時,esp指向esp+4,這時對system來說,它內部的ret(返回地址)執(zhí)行時esp指針還是指向esp+4的,也就是esp + 4(0xdeadbeef)就是system函數的返回地址,而esp+8則是它的參數
注:對于不想使程序崩潰,可以將esp+4的覆蓋為exit函數的地址
0x06 找地址
先執(zhí)行start,運行我們的程序,然后輸入下圖內容,找到system和exit地址
接著找/bin/sh地址
我用的是第一個地址,成功了,后面兩個我沒有嘗試
三個地址都找到了,修改我們的poc程序:
1.py
接著執(zhí)行,成功獲取權限
0x08 總結
Ret2Libc雖然把數據放在了不具備可執(zhí)行權限的棧上,但成功執(zhí)行了shellcode,這是因為只是把輸入數據當做純數據來間接劫持程序的執(zhí)行流。
這個程序的成功執(zhí)行得利于關閉ASLR,system和exit函數的地址才能固定下來。我們構造poc才方便很多。
ret2libc的精髓之處在于,把ret addr修改成libc庫中的函數地址,并且構造了system函數的參數。對于DEP防御來說,你不讓我執(zhí)行我的代碼,我就利用你的函數達到我的目的。這邊是面向返回編程的設計思路。
參考:
https://www.jianshu.com/p/c90530c910b0
https://blog.csdn.net/counsellor/article/details/81986052?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
總結
以上是生活随笔為你收集整理的NX机制及绕过策略-ret2libc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加菲猫一只多少钱啊?
- 下一篇: C和汇编---sizeof运算符和str