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

緩沖區溢出漏洞那些事:C -gets函數

安全 漏洞
攻擊者通過覆蓋應用程序的內存來利用緩沖區溢出問題。這會改變程序的執行路徑,觸發損壞文件或暴露私人信息的響應。例如,攻擊者可能會引入額外的代碼,向應用程序發送新指令以訪問 IT 系統。

基本概念

緩沖區是在數據從一個位置傳輸到另一個位置時臨時保存數據的內存存儲區域。當數據量超過內存緩沖區的存儲容量時,就會發生緩沖區溢出(或緩沖區溢出)。結果,試圖將數據寫入緩沖區的程序會覆蓋相鄰的內存位置。

緩沖區溢出原指當某個數據超過了處理程序回傳堆棧地址限制的范圍時,程序出現的異常操作。造成此現象的原因有:

  • 存在缺陷的程序設計
  • 尤其是C語言?,不像其他一些高級語言?會自動進行數組或者指針的堆棧區塊邊界檢查,增加溢出風險。
  • C語言中的C標準庫還具有一些非常危險的操作函數,使用不當也為溢出創造條件。

什么是緩沖區溢出攻擊

攻擊者通過覆蓋應用程序的內存來利用緩沖區溢出問題。這會改變程序的執行路徑,觸發損壞文件或暴露私人信息的響應。例如,攻擊者可能會引入額外的代碼,向應用程序發送新指令以訪問 IT 系統。

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

緩沖區溢出攻擊的類型

基于堆棧的緩沖區溢出更為常見,并利用僅在函數執行期間存在的堆棧內存。

基于堆的攻擊更難執行,并且涉及將分配給程序的內存空間泛濫到超出用于當前運行時操作的內存。

哪些編程語言更容易受到攻擊?

C 和 C++ 是兩種極易受到緩沖區溢出攻擊的語言,因為它們沒有內置的保護措施來防止覆蓋或訪問內存中的數據。Mac OSX、Windows 和 Linux 都使用用 C 和 C++ 編寫的代碼。

PERL、Java、JavaScript 和 C# 等語言使用內置的安全機制來最大限度地減少緩沖區溢出的可能性。

如何防止緩沖區溢出

開發人員可以通過代碼中的安全措施或使用提供內置保護的語言來防止緩沖區溢出漏洞。

此外,現代操作系統具有運行時保護。三種常見的保護措施是:

  • 地址空間隨機化 (ASLR)— 隨機移動數據區域的地址空間位置。通常,緩沖區溢出攻擊需要知道可執行代碼的位置,而隨機化地址空間使得這幾乎不可能。
  • 數據執行預防——將某些內存區域標記為不可執行或可執行,從而阻止攻擊在不可執行區域中運行代碼。
  • 結構化異常處理程序覆蓋保護 (SEHOP)— 幫助阻止惡意代碼攻擊結構化異常處理 (SEH),這是一種用于管理硬件和軟件異常的內置系統。因此,它可以防止攻擊者利用 SEH 覆蓋利用技術。在功能級別上,使用基于堆棧的緩沖區溢出來覆蓋存儲在線程堆棧中的異常注冊記錄來實現 SEH 覆蓋。

代碼和操作系統保護中的安全措施是不夠的。當組織發現緩沖區溢出漏洞時,它必須迅速做出反應以修補受影響的軟件,并確保軟件用戶可以訪問補丁。

示例代碼展示

根據STACK1_VS_2017.cpp代碼進行修改;

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

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

MessageBoxA((HWND)-0, (LPCSTR) "緩沖區溢出測試\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("兩變量內存地址之差=%d\n",p);
gets(buf);
if (cookie == 0x41424344)
printf("緩沖區溢出成功!\n");

}

運行效果展示;

使用MessageBoxA函數檢測程序是否正常運行,點擊確定開始測試

wKg0C2IwIImAY91jAAB9EzCoh4828.png

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

wKg0C2IwIJGADUrOAABMpCrQIDY351.png

任意輸入兩個數值,不滿足條件,程序運行完畢;

wKg0C2IwIJmAJWkAAAZaFsoQo579.png

代碼分析漏洞成因

誘因:char buf[2]; 代碼部分解析---使用char 將變量buf聲明成了一個擁有2個元素數組其中元素類型為字符.buf有了兩個自己長度,

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

隱患:使用gets()函數獲取輸入數據,因gets()函數無限讀取數據并不檢查緩沖區的大小限制,會將超出緩沖區的數據繼續寫入堆棧,導致存在溢出隱患。

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

#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

在運行效果上可以看到超出堆棧空間的值繼續寫入堆棧導致覆蓋了test在堆棧內對應的值,導致其數值進行了改變:test1-3456

反匯編分析其運行過程堆棧是如何變化的

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

可通過此關鍵詞,在反匯編程序快速定位到程序相關函數運行區域。

wKg0C2IwIMyAfBnHAABrtxJyzFA893.png

在入口指令處下斷點方便分析。

并在實際運行發現運行到此處為顯示相關特征字符信息,初步判斷正確。

wKg0C2IwINiAH4TLAAEQCr4st3Q702.png

將此區域字符串進行反編譯與源碼對照進一步驗證。

wKg0C2IwIOWASGExAACaSBEask4495.png

沒匯編指令對照不太直觀換個插件與工具,進行展示。

wKg0C2IwIPSAfjGdAACo1BRcXs791.png

wKg0C2IwIQGAIhgvAACUQXGZPyU103.png

未輸入st值時test對應數據堆棧情況。

000000000061FDE8 000000000061FE0A "test1"。

wKg0C2IwIQAD9VmAADWK6KdrVk399.png

輸入后查看。

000000000061FDE8 000000000061FE08 "123456"。

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

wKg0C2IwISCASaz1AAC9UG2mxaw712.png

根據此思路分析之前的示例程序。

反匯編分析

根據之前的思路定位關閉區域。

定位特征代碼:

wKg0C2IwITOAIHcgAAANIXtRFIs118.png

根據特征代碼搜索;

wKg0C2IwIAKAJ6UYAAD3kDYuoE396.png

在入口指令處下斷點;

wKg0C2IwHOAQj0nAAEq4M6Dmdk039.png

運行看到一個變量的對應地址;

wKg0C2IwH8aAQLUYAAE2PnHHwyU883.png

繼續運行看到另一個變量的地址;

wKg0C2IwH6CAXEyAAFBzEOzcI729.png

因剩下的只是運行用就不展示了。

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

wKg0C2IwH4GAHe7dAAFRlEJ2DQ556.png

擴展知識:發現棧中對應的值與內存對應的值是相反的,因為堆棧中的值遵循先進后出原則故是相反的。

擴展分析

看到此區域有個je跳轉指令,其上方有個cmp指令(功能是用來比較),其中有一值被固定為:41424344。

wKg0C2IwH2WAE1azAAAxNrDjjlQ399.png

wKg0C2IwH0aAd9NmAAECFJTnaAY975.png

可以看到明顯不滿足跳轉故跳轉不會執行,不顯示隱藏的信息。

wKg0C2IwHx6ACj4IAAE5f2KqfgU914.png

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

12DCBA;

wKg0C2IwHvCANkWnAAEWqte210U206.png

跳轉成立;

wKg0C2IwHtyAJmwnAAEpsUVyZwE919.png

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

wKg0C2IwHsqAK5FJAAGhigqV9ws113.png

擴展知識

RSP+2C = rsp對應的地址+2c 即000000000061FDE0+2C=61FE0C;

wKg0C2IwHruAC54AAD5u8hqUY982.png

將16進制轉10進制計算;

wKg0C2IwHqqAa2wmAAAXY6n2JQQ895.png

IDA調試分析使其跟清晰地去查看變化;

為方便分析可在關鍵函數處下斷點單步執行看執行效果;

wKg0C2IwHpmAMv3AAADjdjcfBWw834.png

由之前可知MesssageBoxA后才開始正式運行,故可在此call后下斷點;

wKg0C2IwHoGABZboAACUINIMXw415.png

運行,直到到斷點暫停;

wKg0C2IwHnWAKDfAAExrmSlVzs815.png

運行后發現rsi對應數值無變化,正常因除了初始賦值后無其它賦值給rsi的指令;

wKg0C2IwHmuAAr4JAADD9dE8YY0670.png

gets函數執行前rsi對應數據仍未變化;

wKg0C2IwHmGABsEvAACtqsDa08027.png

gets函數執行后rsi對應數據發生改變;

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

根據此區域匯編代碼分析得知,除了初始運行對rsi進行賦值后均無對其賦值的指令,故可得知存在溢出漏洞,覆蓋了rsi原始數據,導致其值改變,根據單步跟蹤執行流程可值執行完gets函數后其值發生變化,故可判斷使用gets函數獲取的數據導致堆棧數據溢出。

修復

可使用fgets或gets_s函數替換gets函數。

wKg0C2IwHjOAdpGtAABeb3hRP8E836.png

函數解析:

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

IDA附加進程并單步執行查看執行流程;

wKg0C2IwHeaAHpSxAAECiV3YlbI236.png

fgets執行前rsi對應數據;

wKg0C2IwHdqAeFAHAAChI9BNCoQ977.png

fgets執行后rsi對應數據

wKg0C2IwHdGANyKiAACJf9a4P1c201.png

可以看到數據未溢出,分析到此告一段落。

責任編輯:武曉燕 來源: FreeBuf.COM
相關推薦

2017-01-09 17:03:34

2020-08-10 08:37:32

漏洞安全數據

2018-11-01 08:31:05

2011-11-15 16:00:42

2019-02-27 13:58:29

漏洞緩沖區溢出系統安全

2010-12-27 10:21:21

2014-07-30 11:21:46

2015-09-02 09:01:03

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

漏洞網絡安全網絡攻擊

2017-08-30 20:49:15

2015-03-06 17:09:10

2010-10-09 14:45:48

2022-05-07 08:27:42

緩沖區溢出堆棧

2010-09-08 15:43:18

2011-03-23 12:39:44

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美片网站免费 | 国产成人精品免费视频大全最热 | 神马久久av | 97av视频| 国产精品一区二区在线 | 91资源在线| 五月天婷婷综合 | 超碰在线免费 | 91国内外精品自在线播放 | 日本在线你懂的 | 国产视频一区二区 | 日韩精品一区二区三区中文字幕 | 日韩av福利在线观看 | 91精品久久 | 国产一级片免费看 | 日本午夜免费福利视频 | 正在播放国产精品 | 久久99精品久久久久久国产越南 | 国产精品高潮呻吟久久 | 亚洲成人精品国产 | 久久在线免费 | 中文字幕亚洲国产 | av播播 | 美女日批免费视频 | 亚洲高清一区二区三区 | 国产亚洲一区二区三区在线观看 | 国产一区二区精华 | 亚洲av毛片成人精品 | 欧美日韩18 | 99免费看 | 久久久久国产一区二区三区 | 久久九| 在线视频日韩 | 国产午夜精品一区二区三区嫩草 | 久久久免费观看视频 | 欧美二区在线 | 99精品一区二区三区 | va精品 | 日日夜夜天天干 | www亚洲精品 | 亚洲国产精品一区二区www |