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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

20169210《Linux内核原理与分析》第十二周作业

發(fā)布時(shí)間:2023/11/29 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 20169210《Linux内核原理与分析》第十二周作业 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Return-to-libc 攻擊實(shí)驗(yàn)

緩沖區(qū)溢出的常用攻擊方法是用 shellcode 的地址來覆蓋漏洞程序的返回地址,使得漏洞程序去執(zhí)行存放在棧中 shellcode。為了阻止這種類型的攻擊,一些操作系統(tǒng)使得系統(tǒng)管理員具有使棧不可執(zhí)行的能力。這樣的話,一旦程序執(zhí)行存放在棧中的 shellcode 就會(huì)崩潰,從而阻止了攻擊。

不幸的是上面的保護(hù)方式并不是完全有效的,現(xiàn)在存在一種緩沖區(qū)溢出的變體攻擊,叫做 return-to-libc 攻擊。這種攻擊不需要一個(gè)棧可以執(zhí)行,甚至不需要一個(gè) shellcode。取而代之的是我們讓漏洞程序調(diào)轉(zhuǎn)到現(xiàn)存的代碼(比如已經(jīng)載入內(nèi)存的 libc 庫中的 system()函數(shù)等)來實(shí)現(xiàn)我們的攻擊。

實(shí)驗(yàn)準(zhǔn)備:

輸入命令安裝一些用于編譯 32 位 C 程序的東西:

sudo apt-get update sudo apt-get install lib32z1 libc6-dev-i386 sudo apt-get install lib32readline-gplv2-dev

輸入命令“l(fā)inux32”進(jìn)入 32 位 linux 環(huán)境。輸入“/bin/bash”使用 bash:

實(shí)驗(yàn)步驟

初始設(shè)置

Ubuntu 和其他一些 Linux 系統(tǒng)中,使用地址空間隨機(jī)化來隨機(jī)堆(heap)和棧(stack)的初始地址,這使得猜測準(zhǔn)確的內(nèi)存地址變得十分困難,而猜測內(nèi)存地址是緩沖區(qū)溢出攻擊的關(guān)鍵。因此本次實(shí)驗(yàn)中,我們使用以下命令關(guān)閉這一功能:

sudo sysctl -w kernel.randomize_va_space=0

此外,為了進(jìn)一步防范緩沖區(qū)溢出攻擊及其它利用 shell 程序的攻擊,許多 shell 程序在被調(diào)用時(shí)自動(dòng)放棄它們的特權(quán)。因此,即使你能欺騙一個(gè) Set-UID 程序調(diào)用一個(gè) shell,也不能在這個(gè) shell 中保持 root 權(quán)限,這個(gè)防護(hù)措施在/bin/bash 中實(shí)現(xiàn)。

linux 系統(tǒng)中,/bin/sh 實(shí)際是指向/bin/bash 或/bin/dash 的一個(gè)符號(hào)鏈接。為了重現(xiàn)這一防護(hù)措施被實(shí)現(xiàn)之前的情形,我們使用另一個(gè) shell 程序(zsh)代替/bin/bash。下面的指令描述了如何設(shè)置 zsh 程序:

sudo su cd /bin rm sh ln -s zsh sh exit

為了防止緩沖區(qū)溢出攻擊,最近版本的 gcc 編譯器默認(rèn)將程序編譯設(shè)置為棧不可執(zhí)行,而你可以在編譯的時(shí)候手動(dòng)設(shè)置是否使棧不可執(zhí)行:

gcc -z execstack -o test test.c #棧可執(zhí)行 gcc -z noexecstack -o test test.c #棧不可執(zhí)行

本次實(shí)驗(yàn)的目的,就是展示這個(gè)“棧不可執(zhí)行”的保護(hù)措施并不是完全有效,所以我們使用“-z noexecstack”,或者不手動(dòng)指定而使用編譯器的默認(rèn)設(shè)置。

漏洞程序

把以下代碼保存為“retlib.c”文件,保存到 /tmp 目錄下。代碼如下:

這個(gè)程序有緩沖區(qū)溢出漏洞,我們的任務(wù)是利用這個(gè)漏洞。
上述程序有一個(gè)緩沖區(qū)溢出漏洞,它先從一個(gè)叫“badfile”的文件里把 40 字節(jié)的數(shù)據(jù)讀取到 12 字節(jié)的 buffer,引起溢出。fread()函數(shù)不檢查邊界所以會(huì)發(fā)生溢出。應(yīng)該注意到此程序是從一個(gè)叫做“bad?le”的文件獲得輸入的,這個(gè)文件受用戶控制。現(xiàn)在我們的目標(biāo)是為“bad?le”創(chuàng)建內(nèi)容,這樣當(dāng)這段漏洞程序?qū)⒋藘?nèi)容復(fù)制進(jìn)它的緩沖區(qū),便產(chǎn)生了一個(gè) root shell 。
編譯該程序,并設(shè)置 SET-UID。命令如下:

sudo sugcc -m32 -g -z noexecstack -fno-stack-protector -o retlib retlib.cchmod u+s retlibexit


-z noexecstack是棧不可執(zhí)行。GCC 編譯器有一種棧保護(hù)機(jī)制來阻止緩沖區(qū)溢出,所以我們?cè)诰幾g代碼時(shí)需要用 –fno-stack-protector 關(guān)閉這種機(jī)制。“為了方便普通用戶執(zhí)行一些特權(quán)命令,SUID/SGID程序允許普通用戶以root身份暫時(shí)執(zhí)行該程序,并在執(zhí)行結(jié)束后再恢復(fù)身份。”chmod u+s 就是給某個(gè)程序的所有者以suid權(quán)限,可以像root用戶一樣操作。

我們還需要用到一個(gè)讀取環(huán)境變量的程序:

攻擊程序

把以下代碼保存為“exploit.c”文件,保存到 /tmp 目錄下。代碼如下:

獲取內(nèi)存地址

gdb 獲得 system 和 exit 地址:

修改 exploit.c 文件,填上剛才找到的內(nèi)存地址:

刪除剛才調(diào)試編譯的 exploit 程序和 badfile 文件,重新編譯修改后的 exploit.c:

rm exploit rm badfile gcc -m32 -o exploit exploit.c

攻擊

先運(yùn)行攻擊程序 exploit,再運(yùn)行漏洞程序 retlib,可見攻擊成功,獲得了 root 權(quán)限:

至此實(shí)驗(yàn)結(jié)束。

轉(zhuǎn)載于:https://www.cnblogs.com/crisgy/p/6160302.html

總結(jié)

以上是生活随笔為你收集整理的20169210《Linux内核原理与分析》第十二周作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。