成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

緩沖區(qū)溢出漏洞那些事:C -gets函數(shù)

安全 漏洞
攻擊者通過(guò)覆蓋應(yīng)用程序的內(nèi)存來(lái)利用緩沖區(qū)溢出問(wèn)題。這會(huì)改變程序的執(zhí)行路徑,觸發(fā)損壞文件或暴露私人信息的響應(yīng)。例如,攻擊者可能會(huì)引入額外的代碼,向應(yīng)用程序發(fā)送新指令以訪(fǎng)問(wèn) IT 系統(tǒng)。

基本概念

緩沖區(qū)是在數(shù)據(jù)從一個(gè)位置傳輸?shù)搅硪粋€(gè)位置時(shí)臨時(shí)保存數(shù)據(jù)的內(nèi)存存儲(chǔ)區(qū)域。當(dāng)數(shù)據(jù)量超過(guò)內(nèi)存緩沖區(qū)的存儲(chǔ)容量時(shí),就會(huì)發(fā)生緩沖區(qū)溢出(或緩沖區(qū)溢出)。結(jié)果,試圖將數(shù)據(jù)寫(xiě)入緩沖區(qū)的程序會(huì)覆蓋相鄰的內(nèi)存位置。

緩沖區(qū)溢出原指當(dāng)某個(gè)數(shù)據(jù)超過(guò)了處理程序回傳堆棧地址限制的范圍時(shí),程序出現(xiàn)的異常操作。造成此現(xiàn)象的原因有:

  • 存在缺陷的程序設(shè)計(jì)
  • 尤其是C語(yǔ)言?,不像其他一些高級(jí)語(yǔ)言?會(huì)自動(dòng)進(jìn)行數(shù)組或者指針的堆棧區(qū)塊邊界檢查,增加溢出風(fēng)險(xiǎn)。
  • C語(yǔ)言中的C標(biāo)準(zhǔn)庫(kù)還具有一些非常危險(xiǎn)的操作函數(shù),使用不當(dāng)也為溢出創(chuàng)造條件。

什么是緩沖區(qū)溢出攻擊

攻擊者通過(guò)覆蓋應(yīng)用程序的內(nèi)存來(lái)利用緩沖區(qū)溢出問(wèn)題。這會(huì)改變程序的執(zhí)行路徑,觸發(fā)損壞文件或暴露私人信息的響應(yīng)。例如,攻擊者可能會(huì)引入額外的代碼,向應(yīng)用程序發(fā)送新指令以訪(fǎng)問(wèn) IT 系統(tǒng)。

如果攻擊者知道程序的內(nèi)存布局,他們可以故意提供緩沖區(qū)無(wú)法存儲(chǔ)的輸入,并覆蓋保存可執(zhí)行代碼的區(qū)域,用他們自己的代碼替換它。例如,攻擊者可以覆蓋指針(指向內(nèi)存中另一個(gè)區(qū)域的對(duì)象)并將其指向漏洞利用負(fù)載,從而獲得對(duì)程序的控制權(quán)。

緩沖區(qū)溢出攻擊的類(lèi)型

基于堆棧的緩沖區(qū)溢出更為常見(jiàn),并利用僅在函數(shù)執(zhí)行期間存在的堆棧內(nèi)存。

基于堆的攻擊更難執(zhí)行,并且涉及將分配給程序的內(nèi)存空間泛濫到超出用于當(dāng)前運(yùn)行時(shí)操作的內(nèi)存。

哪些編程語(yǔ)言更容易受到攻擊?

C 和 C++ 是兩種極易受到緩沖區(qū)溢出攻擊的語(yǔ)言,因?yàn)樗鼈儧](méi)有內(nèi)置的保護(hù)措施來(lái)防止覆蓋或訪(fǎng)問(wèn)內(nèi)存中的數(shù)據(jù)。Mac OSX、Windows 和 Linux 都使用用 C 和 C++ 編寫(xiě)的代碼。

PERL、Java、JavaScript 和 C# 等語(yǔ)言使用內(nèi)置的安全機(jī)制來(lái)最大限度地減少緩沖區(qū)溢出的可能性。

如何防止緩沖區(qū)溢出

開(kāi)發(fā)人員可以通過(guò)代碼中的安全措施或使用提供內(nèi)置保護(hù)的語(yǔ)言來(lái)防止緩沖區(qū)溢出漏洞。

此外,現(xiàn)代操作系統(tǒng)具有運(yùn)行時(shí)保護(hù)。三種常見(jiàn)的保護(hù)措施是:

  • 地址空間隨機(jī)化 (ASLR)— 隨機(jī)移動(dòng)數(shù)據(jù)區(qū)域的地址空間位置。通常,緩沖區(qū)溢出攻擊需要知道可執(zhí)行代碼的位置,而隨機(jī)化地址空間使得這幾乎不可能。
  • 數(shù)據(jù)執(zhí)行預(yù)防——將某些內(nèi)存區(qū)域標(biāo)記為不可執(zhí)行或可執(zhí)行,從而阻止攻擊在不可執(zhí)行區(qū)域中運(yùn)行代碼。
  • 結(jié)構(gòu)化異常處理程序覆蓋保護(hù) (SEHOP)— 幫助阻止惡意代碼攻擊結(jié)構(gòu)化異常處理 (SEH),這是一種用于管理硬件和軟件異常的內(nèi)置系統(tǒng)。因此,它可以防止攻擊者利用 SEH 覆蓋利用技術(shù)。在功能級(jí)別上,使用基于堆棧的緩沖區(qū)溢出來(lái)覆蓋存儲(chǔ)在線(xiàn)程堆棧中的異常注冊(cè)記錄來(lái)實(shí)現(xiàn) SEH 覆蓋。

代碼和操作系統(tǒng)保護(hù)中的安全措施是不夠的。當(dāng)組織發(fā)現(xiàn)緩沖區(qū)溢出漏洞時(shí),它必須迅速做出反應(yīng)以修補(bǔ)受影響的軟件,并確保軟件用戶(hù)可以訪(fǎng)問(wèn)補(bǔ)丁。

示例代碼展示

根據(jù)STACK1_VS_2017.cpp代碼進(jìn)行修改;

#include <stdlib.h>
#include <stdio.h>
#include "Windows.h"

int main(int argc, char **argv) {

MessageBoxA((HWND)-0, (LPCSTR) "緩沖區(qū)溢出測(cè)試\n", (LPCSTR)"功能", (UINT)0);

int cookie;
char buf[2];
int *a = &cookie;
char * b = buf;
printf("buf: %08x cookie: %08x\n", b, a);
u_int64 p =(u_int64)a-(u_int64)b;
printf("兩變量?jī)?nèi)存地址之差=%d\n",p);
gets(buf);
if (cookie == 0x41424344)
printf("緩沖區(qū)溢出成功!\n");

}

運(yùn)行效果展示;

使用MessageBoxA函數(shù)檢測(cè)程序是否正常運(yùn)行,點(diǎn)擊確定開(kāi)始測(cè)試

wKg0C2IwIImAY91jAAB9EzCoh4828.png

使用printf()函數(shù)輸出提示信息,使用gets()函數(shù)獲取用戶(hù)輸入信息;

wKg0C2IwIJGADUrOAABMpCrQIDY351.png

任意輸入兩個(gè)數(shù)值,不滿(mǎn)足條件,程序運(yùn)行完畢;

wKg0C2IwIJmAJWkAAAZaFsoQo579.png

代碼分析漏洞成因

誘因:char buf[2]; 代碼部分解析---使用char 將變量buf聲明成了一個(gè)擁有2個(gè)元素?cái)?shù)組其中元素類(lèi)型為字符.buf有了兩個(gè)自己長(zhǎng)度,

提示:u_int64 p =(u_int64)a-(u_int64)b; 代碼部分對(duì)程序涉及變量了內(nèi)存地址進(jìn)行了一個(gè)減分計(jì)算并對(duì)賦值給變量 p,(為使其運(yùn)算成立還對(duì)其進(jìn)行了類(lèi)型轉(zhuǎn)義),結(jié)果可告知兩個(gè)變量?jī)?nèi)存地址距離,方便溢出利用

隱患:使用gets()函數(shù)獲取輸入數(shù)據(jù),因gets()函數(shù)無(wú)限讀取數(shù)據(jù)并不檢查緩沖區(qū)的大小限制,會(huì)將超出緩沖區(qū)的數(shù)據(jù)繼續(xù)寫(xiě)入堆棧,導(dǎo)致存在溢出隱患。

為方便理解此處代碼演示下:

#include <stdlib.h>
#include <stdio.h>
#include "Windows.h"

int main() {
char test[] = "test1";
printf("test1初始值為%s\n清輸入st值:",test);
char st[2];
gets(st);
printf("輸出test:%s\n",test);
printf("輸出st:%s\n",st);
}

wKg0C2IwIMCAJatAABLI3cbCUs118.png

在運(yùn)行效果上可以看到超出堆棧空間的值繼續(xù)寫(xiě)入堆棧導(dǎo)致覆蓋了test在堆棧內(nèi)對(duì)應(yīng)的值,導(dǎo)致其數(shù)值進(jìn)行了改變:test1-3456

反匯編分析其運(yùn)行過(guò)程堆棧是如何變化的

有運(yùn)行得知(外加源代碼)程序初始關(guān)鍵詞:test1初始值為test1。

可通過(guò)此關(guān)鍵詞,在反匯編程序快速定位到程序相關(guān)函數(shù)運(yùn)行區(qū)域。

wKg0C2IwIMyAfBnHAABrtxJyzFA893.png

在入口指令處下斷點(diǎn)方便分析。

并在實(shí)際運(yùn)行發(fā)現(xiàn)運(yùn)行到此處為顯示相關(guān)特征字符信息,初步判斷正確。

wKg0C2IwINiAH4TLAAEQCr4st3Q702.png

將此區(qū)域字符串進(jìn)行反編譯與源碼對(duì)照進(jìn)一步驗(yàn)證。

wKg0C2IwIOWASGExAACaSBEask4495.png

沒(méi)匯編指令對(duì)照不太直觀(guān)換個(gè)插件與工具,進(jìn)行展示。

wKg0C2IwIPSAfjGdAACo1BRcXs791.png

wKg0C2IwIQGAIhgvAACUQXGZPyU103.png

未輸入st值時(shí)test對(duì)應(yīng)數(shù)據(jù)堆棧情況。

000000000061FDE8 000000000061FE0A "test1"。

wKg0C2IwIQAD9VmAADWK6KdrVk399.png

輸入后查看。

000000000061FDE8 000000000061FE08 "123456"。

000000000061FDF0 000000000061FE0A "3456" //之前為test1。

wKg0C2IwISCASaz1AAC9UG2mxaw712.png

根據(jù)此思路分析之前的示例程序。

反匯編分析

根據(jù)之前的思路定位關(guān)閉區(qū)域。

定位特征代碼:

wKg0C2IwITOAIHcgAAANIXtRFIs118.png

根據(jù)特征代碼搜索;

wKg0C2IwIAKAJ6UYAAD3kDYuoE396.png

在入口指令處下斷點(diǎn);

wKg0C2IwHOAQj0nAAEq4M6Dmdk039.png

運(yùn)行看到一個(gè)變量的對(duì)應(yīng)地址;

wKg0C2IwH8aAQLUYAAE2PnHHwyU883.png

繼續(xù)運(yùn)行看到另一個(gè)變量的地址;

wKg0C2IwH6CAXEyAAFBzEOzcI729.png

因剩下的只是運(yùn)行用就不展示了。

輸入數(shù)值后可看到由之前空白數(shù)據(jù)已被輸入的數(shù)據(jù)覆蓋;

wKg0C2IwH4GAHe7dAAFRlEJ2DQ556.png

擴(kuò)展知識(shí):發(fā)現(xiàn)棧中對(duì)應(yīng)的值與內(nèi)存對(duì)應(yīng)的值是相反的,因?yàn)槎褩V械闹底裱冗M(jìn)后出原則故是相反的。

擴(kuò)展分析

看到此區(qū)域有個(gè)je跳轉(zhuǎn)指令,其上方有個(gè)cmp指令(功能是用來(lái)比較),其中有一值被固定為:41424344。

wKg0C2IwH2WAE1azAAAxNrDjjlQ399.png

wKg0C2IwH0aAd9NmAAECFJTnaAY975.png

可以看到明顯不滿(mǎn)足跳轉(zhuǎn)故跳轉(zhuǎn)不會(huì)執(zhí)行,不顯示隱藏的信息。

wKg0C2IwHx6ACj4IAAE5f2KqfgU914.png

根據(jù)此思路:輸入兩值將緩沖區(qū)堆滿(mǎn),之后數(shù)據(jù)溢出覆蓋思路,并且根據(jù)提示計(jì)算出兩變量相距離為2與堆棧數(shù)據(jù)先進(jìn)后出原則,故輸入如下條件即可使跳轉(zhuǎn)成立,進(jìn)而輸出隱藏信息

12DCBA;

wKg0C2IwHvCANkWnAAEWqte210U206.png

跳轉(zhuǎn)成立;

wKg0C2IwHtyAJmwnAAEpsUVyZwE919.png

可以看到隱藏信息已顯示;

wKg0C2IwHsqAK5FJAAGhigqV9ws113.png

擴(kuò)展知識(shí)

RSP+2C = rsp對(duì)應(yīng)的地址+2c 即000000000061FDE0+2C=61FE0C;

wKg0C2IwHruAC54AAD5u8hqUY982.png

將16進(jìn)制轉(zhuǎn)10進(jìn)制計(jì)算;

wKg0C2IwHqqAa2wmAAAXY6n2JQQ895.png

IDA調(diào)試分析使其跟清晰地去查看變化;

為方便分析可在關(guān)鍵函數(shù)處下斷點(diǎn)單步執(zhí)行看執(zhí)行效果;

wKg0C2IwHpmAMv3AAADjdjcfBWw834.png

由之前可知MesssageBoxA后才開(kāi)始正式運(yùn)行,故可在此call后下斷點(diǎn);

wKg0C2IwHoGABZboAACUINIMXw415.png

運(yùn)行,直到到斷點(diǎn)暫停;

wKg0C2IwHnWAKDfAAExrmSlVzs815.png

運(yùn)行后發(fā)現(xiàn)rsi對(duì)應(yīng)數(shù)值無(wú)變化,正常因除了初始賦值后無(wú)其它賦值給rsi的指令;

wKg0C2IwHmuAAr4JAADD9dE8YY0670.png

gets函數(shù)執(zhí)行前rsi對(duì)應(yīng)數(shù)據(jù)仍未變化;

wKg0C2IwHmGABsEvAACtqsDa08027.png

gets函數(shù)執(zhí)行后rsi對(duì)應(yīng)數(shù)據(jù)發(fā)生改變;

wKg0C2IwHleAX8q7AADvkHXbdfY163.png

ush    rsi
.text:00000000004078D1 push rbx
.text:00000000004078D2 sub rsp, 38h
.text:00000000004078D6 call __main
.text:00000000004078DB lea rsi, [rsp+48h+var_1E] 初始rsi值
.text:00000000004078E0 xor r9d, r9d ; uType
.text:00000000004078E3 xor ecx, ecx ; hWnd
.text:00000000004078E5 lea rbx, [rsp+48h+var_1C]
.text:00000000004078EA lea r8, Caption ; lpCaption
.text:00000000004078F1 lea rdx, Text ; lpText
.text:00000000004078F8 call cs:__imp_MessageBoxA
.text:00000000004078FE mov r8, rbx
.text:0000000000407901 mov rdx, rsi
.text:0000000000407904 sub rbx, rsi
.text:0000000000407907 lea rcx, aBuf08xCookie08 ; "buf: %08x cookie: %08x\n"
.text:000000000040790E call _Z6printfPKcz ; printf(char const*,...)
.text:0000000000407913 lea rcx, byte_40902D ; char *
.text:000000000040791A mov rdx, rbx
.text:000000000040791D call _Z6printfPKcz ; printf(char const*,...)
.text:0000000000407922 mov rcx, rsi
.text:0000000000407925 call gets
.text:000000000040792A cmp [rsp+48h+var_1C], 41424344h
.text:0000000000407932 jz short loc_40793D

根據(jù)此區(qū)域匯編代碼分析得知,除了初始運(yùn)行對(duì)rsi進(jìn)行賦值后均無(wú)對(duì)其賦值的指令,故可得知存在溢出漏洞,覆蓋了rsi原始數(shù)據(jù),導(dǎo)致其值改變,根據(jù)單步跟蹤執(zhí)行流程可值執(zhí)行完gets函數(shù)后其值發(fā)生變化,故可判斷使用gets函數(shù)獲取的數(shù)據(jù)導(dǎo)致堆棧數(shù)據(jù)溢出。

修復(fù)

可使用fgets或gets_s函數(shù)替換gets函數(shù)。

wKg0C2IwHjOAdpGtAABeb3hRP8E836.png

函數(shù)解析:

fgets()函數(shù)的第2個(gè)參數(shù)指明了讀入字符的最大數(shù)量。如果該參數(shù)的值是n,那么fgets()將讀入n-1個(gè)字符,或者讀到遇到的第一個(gè)換行符為止;
這里為3,故獲取的數(shù)值為12,共輸入6個(gè)數(shù)讀取到第2個(gè)結(jié)束

IDA附加進(jìn)程并單步執(zhí)行查看執(zhí)行流程;

wKg0C2IwHeaAHpSxAAECiV3YlbI236.png

fgets執(zhí)行前rsi對(duì)應(yīng)數(shù)據(jù);

wKg0C2IwHdqAeFAHAAChI9BNCoQ977.png

fgets執(zhí)行后rsi對(duì)應(yīng)數(shù)據(jù)

wKg0C2IwHdGANyKiAACJf9a4P1c201.png

可以看到數(shù)據(jù)未溢出,分析到此告一段落。

責(zé)任編輯:武曉燕 來(lái)源: FreeBuf.COM
相關(guān)推薦

2017-01-09 17:03:34

2020-08-10 08:37:32

漏洞安全數(shù)據(jù)

2018-11-01 08:31:05

2011-11-15 16:00:42

2019-02-27 13:58:29

漏洞緩沖區(qū)溢出系統(tǒng)安全

2010-12-27 10:21:21

2015-09-02 09:01:03

2014-07-30 11:21:46

2018-01-26 14:52:43

2020-10-27 09:51:18

漏洞

2009-09-24 18:16:40

2010-09-29 15:59:04

2011-02-24 09:21:31

2021-01-27 18:03:52

漏洞網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2017-08-30 20:49:15

2015-03-06 17:09:10

2022-05-07 08:27:42

緩沖區(qū)溢出堆棧

2010-10-09 14:45:48

2010-09-08 15:43:18

2011-03-23 12:39:44

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕视频在线观看 | 国产精品视频一区二区三区四蜜臂 | 中文字幕精品一区二区三区在线 | 国产欧美精品一区二区三区 | 狠狠亚洲 | 国产精品福利在线观看 | 视频在线观看一区 | 91视频精选| 国外成人免费视频 | av天天干 | 欧美成视频 | 秋霞国产 | 精品久久久久久久人人人人传媒 | 久久久久久999 | 欧美日韩淫片 | 精品国产精品三级精品av网址 | 欧美激情精品久久久久久 | 久久精品久久久久久 | 在线一区 | 久久久久久国产精品久久 | 99国产精品99久久久久久 | 亚洲成av人片在线观看无码 | 久色激情 | 成人欧美一区二区三区 | 精品国产31久久久久久 | 国产精品日韩欧美一区二区三区 | 美日韩精品 | 亚洲高清成人在线 | 国产97碰免费视频 | 亚洲福利一区二区 | 国产目拍亚洲精品99久久精品 | 777毛片| 丁香一区二区 | 中文视频在线 | 韩国av一区二区 | 久久99这里只有精品 | 久久伊人影院 | 亚洲最新网址 | 成人免费观看男女羞羞视频 | 国产成人一区二区三区精 | 99久久成人 |