国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

這篇具有很好參考價(jià)值的文章主要介紹了【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

關(guān)于課程

西電網(wǎng)信院 網(wǎng)安實(shí)驗(yàn)班 軟件與系統(tǒng)安全

  • 學(xué)時(shí): 48 (講授40 + 線上8)
  • 期末考試: 60%
  • 棧溢出利用作業(yè): 15%
  • AFL的使用作業(yè): 15%
  • 線上學(xué)習(xí)成績: 10%

筆記列表

【軟件與系統(tǒng)安全筆記】一、引入_框架主義者的博客-CSDN博客

【軟件與系統(tǒng)安全筆記】二、軟件與系統(tǒng)安全基礎(chǔ)_框架主義者的博客-CSDN博客

【軟件與系統(tǒng)安全筆記】三、基礎(chǔ)技術(shù)_框架主義者的博客-CSDN博客

【軟件與系統(tǒng)安全筆記】四、內(nèi)存破壞漏洞_框架主義者的博客-CSDN博客

【軟件與系統(tǒng)安全筆記】五、內(nèi)存破壞防御_框架主義者的博客-CSDN博客

【軟件與系統(tǒng)安全筆記】六、惡意代碼的機(jī)理及其防護(hù)_框架主義者的博客-CSDN博客

【軟件與系統(tǒng)安全筆記】七、模糊測試_框架主義者的博客-CSDN博客

【軟件與系統(tǒng)安全筆記】八、軟件自我保護(hù)_框架主義者的博客-CSDN博客

課程資料

【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)
?

  • intro.pdf 課程概述
  • intro-companion.pdf 軟件安全現(xiàn)狀(思政內(nèi)容)
  • sec-basics.pdf 軟件與系統(tǒng)安全基礎(chǔ):信任、威脅模型、安全策略與策略執(zhí)行、通用的安全設(shè)計(jì)原則
  • tech_basics.pdf 基礎(chǔ)技術(shù):x86、內(nèi)存、寄存器、數(shù)據(jù)類型、指令集、調(diào)用慣例、ELF
  • attack-surface.pdf
  • mem-vul-part.pdf 內(nèi)存破壞漏洞

?

復(fù)習(xí)重點(diǎn)

簡答題(70分)+綜合題(30分)

淺灰色不重要:

【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

  • 概述

  • 軟件與系統(tǒng)安全基礎(chǔ)

    • “威脅模型”1, 可信計(jì)算基(Trusted computing base),

    • “安全策略與策略執(zhí)行”2, 通用的安全設(shè)計(jì)原則, 攻擊面

    • 軟件逆向基礎(chǔ):

      • X86與x64體系結(jié)構(gòu), “x86 概念與內(nèi)存模型”3
      • 二進(jìn)制文件格式
  • 軟件漏洞利用與防護(hù)

    • 內(nèi)存破壞漏洞與防御: “四、內(nèi)存破壞漏洞”4

      • “緩沖區(qū)溢出:棧溢出(stack smashing)”5

      • 整數(shù)溢出,

      • “堆溢出”6

        • “Use After Free”7
      • Double free, Type Confusion,

      • “格式化字符串攻擊”8

    • 高級(jí)防御與攻擊: “五、內(nèi)存破壞防御”9

      • “Stack Canaries 棧 金絲雀”10
      • “數(shù)據(jù)執(zhí)行保護(hù)(DEP)”11
      • 代碼注入、代碼重用 “代碼注入 vs 代碼重用”12
      • return-to-libc
      • “ASLR Linux 的地址空間布局隨機(jī)化”13
      • “ROP 面向返回的編程”14
  • 惡意代碼的機(jī)理及其防護(hù) “六、惡意代碼的機(jī)理及其防護(hù)”15

    • 病毒, 蠕蟲, 木馬, (側(cè)重:差異, 共性, 如何隱藏

      • “病毒”16
      • “木馬”17
      • “蠕蟲”18
  • 模糊測試技術(shù)

    • 模糊測試(只考偏原理的), “模糊測試”19
    • AFL簡介,
  • 軟件保護(hù)技術(shù) “軟件保護(hù)技術(shù)”20

    • “代碼混淆”21
    • “軟件防篡改”22
    • “軟件水印,”23
  • 滲透測試及其他高級(jí)技術(shù)(線上)“九、Web 安全”24

    • Web安全
    • SQL注入 “輸入驗(yàn)證: SQL注入攻擊”25
    • XSS “輸入驗(yàn)證: 跨站腳本 (XSS, Cross‐Site Scripting)”26
    • 滲透測試原理,

?

信安班重點(diǎn)

  • 3

變量存儲(chǔ)位置

棧的工作原理

棧溢出、防護(hù)技術(shù)、DEP,金絲雀

  • 4

堆的工作原理

堆溢出

  • 5

整數(shù)溢出

格式化字符串漏洞

  • 6

SQL注入

數(shù)組越界訪問漏洞

  • 7

釋放重引用漏洞

  • 8

繞過DEP “數(shù)據(jù)執(zhí)行保護(hù)(DEP)”11

return to libc “代碼重用攻擊: Return to libc”27

返回導(dǎo)向編程 “ROP 面向返回的編程”14

  • 9

*返回導(dǎo)向編程:*地址空間隨機(jī)化 “ASLR Linux 的地址空間布局隨機(jī)化”13

  • 10

Fuzzing 定義、原理、特點(diǎn)

  • 11

木馬實(shí)現(xiàn)原理 “木馬的實(shí)現(xiàn)原理與攻擊步驟”28

  • 12

病毒

分類"計(jì)算機(jī)病毒的分類"29

感染目標(biāo)、過程

隱藏技術(shù) “病毒的隱藏技術(shù)”30

花指令

多態(tài) “病毒的多態(tài)”31

  • 15

軟件自我保護(hù)

mate 模型 “Man-At-The-End 攻擊 (MATE)”32

?


?

?

?

#### 代碼重用攻擊: Return to libc

危險(xiǎn)庫函數(shù)如 `system()`

攻擊者構(gòu)造合適的參數(shù)(在棧上, 返回指令指針的上方)

* 在x64架構(gòu)上,還需要更多的工作:設(shè)置參數(shù)傳遞寄存器的值

函數(shù)返回,庫函數(shù)得到執(zhí)行

* 例如:`execve(“/bin/sh”)`

甚至可以鏈接兩個(gè)庫函數(shù)調(diào)用

【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

?

==**具體地**==

* 攻擊者用一個(gè)溢出填充buffer:

  * 更改棧上保存的ebp為一個(gè)合適地址
  * 更改返回指令指針為一個(gè)欲執(zhí)行的庫函數(shù)的地址
  * 寫一個(gè)占位符值(庫函數(shù)會(huì)認(rèn)為其是返回地址,如果想利用它調(diào)用第二個(gè)庫函數(shù), 應(yīng)寫入第二個(gè)庫函數(shù)的地址)
  * 寫一個(gè)或多個(gè)要傳遞給此庫函數(shù)的參數(shù)
* 當(dāng)被攻擊的函數(shù)返回時(shí), 恢復(fù)(更改過的)ebp, 然后pop更改后的返回地址到eip, 從而開始執(zhí)行庫函數(shù)代碼
* 因?yàn)閹旌瘮?shù)相信它已被調(diào)用, 故會(huì)將棧頂當(dāng)前值(占位符)作為它自己棧幀的返回指令指針, 之上是參數(shù)
* 最終會(huì)在占位符位置的下方創(chuàng)建起一個(gè)新的棧幀 (對(duì)應(yīng)于庫函數(shù)的執(zhí)行)
* 根據(jù)庫函數(shù)參數(shù)類型以及庫函數(shù)對(duì)參數(shù)的解釋方式, 攻擊者可能需要準(zhǔn)確地知道參數(shù)地址以做溢出寫

?

### 代碼注入 vs 代碼重用

【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

**代碼重用與代碼注入的協(xié)同**

在很多攻擊中, 代碼重用攻擊用來作為禁用DEP的第一步

* 目標(biāo)是允許對(duì)棧內(nèi)存進(jìn)行執(zhí)行
* 有一個(gè)系統(tǒng)調(diào)用可以更改棧的讀/寫/執(zhí)行屬性

  * int mprotect(void *addr, size_t len, int prot);
* 設(shè)置對(duì)于起始于addr的內(nèi)存區(qū)域的保護(hù)
* 調(diào)用此系統(tǒng)調(diào)用, 允許在棧上的“執(zhí)行”屬性, 然后開始執(zhí)行被注入的代碼

?

?

  1. 威脅模型

    威脅模型(Attack model):對(duì)于影響系統(tǒng)安全的所有信息的結(jié)構(gòu)化表示

    本質(zhì)上, 是從安全的視角解讀系統(tǒng)與其環(huán)境

    用于理解攻擊者

    • 什么可信、什么不可信
    • 攻擊者的動(dòng)機(jī)、資源、能力; 攻擊造成的影響

    威脅建模

    捕獲、組織和分析這些影響系統(tǒng)安全的信息的過程

    威脅模型使得 結(jié)構(gòu)化地推理 攻擊面 成為可能

    • 確定入口點(diǎn)

    • 從攻擊者的視角審視系統(tǒng)

      • 分解、識(shí)別系統(tǒng)結(jié)構(gòu)
      • 確定各種威脅及其嚴(yán)重程度
      • 確定對(duì)策和緩解措施

    漏洞、攻擊與危害

    漏洞(vulnerability):可以被對(duì)缺陷具有利用能力的攻擊者訪問利用缺陷, 要素:

    • 缺陷 (flaw)
    • 攻擊者能訪問缺陷
    • 攻擊者有利用缺陷的能力

    攻擊(attack): 指攻擊者嘗試?yán)寐┒?,例?主動(dòng)、被動(dòng)、DoS…

    危害(compromise):攻擊成功則危害發(fā)生 ??

  2. 安全策略與策略執(zhí)行

    安全策略

    • 允許什么/不允許什么
    • 誰被允許做什么

    策略執(zhí)行

    • 為了安全策略被遵循, 我們要做什么

    • 策略執(zhí)行的方法:利用某些“機(jī)制”(mechanism)

      • 說服
      • 監(jiān)控和威懾
      • 技術(shù)上禁止 (這是我們最感興趣的)
      • 激勵(lì)管理

    安全策略是一個(gè)系統(tǒng)所應(yīng)具備的 安全屬性 的高層次規(guī)約

    安全策略模型是安全策略的簡明(規(guī)范化)描述

    安全目標(biāo)是用戶希望通過執(zhí)行安全策略而獲得的東西

    安全屬性與安全目標(biāo)有時(shí)不做嚴(yán)格區(qū)分

    ?

    安全策略的 CIA 模型

    參照 網(wǎng)絡(luò)與協(xié)議安全 中的 CIA 概念

    • 機(jī)密性Confidentiality)
    • 完整性Integrity)
    • 可用性Availability)

    其他安全目標(biāo):

    隱私(Privacy)

    可以歸類到機(jī)密性下

    非否認(rèn)性(Non-repudiation), 或可追責(zé)性(accountability):防止對(duì)消息傳送或接收的否認(rèn)

    也叫可計(jì)量性

    網(wǎng)絡(luò)與協(xié)議安全 中還有 真實(shí)性

    安全屬性的另一種分類方法:

    • Safety 屬性:“壞事”不會(huì)發(fā)生
    • Liveness 屬性:“好事”終會(huì)發(fā)生

    任何安全屬性都可以被分解為一個(gè) safety 屬性和一個(gè) liveness 屬性

    注意:實(shí)際上有一些安全策略無法用 safety 屬性或 liveness 屬性表示, 如信息流策略(2-safety 屬性[2])——是“非屬性”(Non-Property) ??

  3. x86 概念與內(nèi)存模型

    基本概念

    x86: 基于 Intel 8086/8088 CPU 的一系列向后兼容的 ISA 的總稱

    • IA-32: 32 位版本的 x86 指令集體系結(jié)構(gòu)

      • 三種主要操作模式:

        • 實(shí)模式 (Real Mode)
        • 保護(hù)模式 (Protected Mode)
        • 系統(tǒng)管理模式 (System Management Mode) (大概就是 BIOS 下,對(duì)操作系統(tǒng)透明)
    • CISC(Complex Instruction Set Computer)體系結(jié)構(gòu)

    • x64: 又稱 x86-64, 是 x86 的擴(kuò)展, 是與 x86 兼容的 64 位 ISA

    ?

    字節(jié)序:多字節(jié)數(shù)據(jù)在內(nèi)存中存儲(chǔ)或在網(wǎng)絡(luò)上傳輸時(shí)各字節(jié)的存儲(chǔ)/傳輸順序

    小端序(little endian):低位字節(jié)存儲(chǔ)在內(nèi)存中低位地址, 效率較高(Intel CPU 使用)

    大端序(big endian):低位字節(jié)存儲(chǔ)在內(nèi)存中高位地址, 符合思維邏輯。RISC 架構(gòu)處理器(如 MIPS, PowerPC)采用

    ?

    IA-32 內(nèi)存模型

    分段內(nèi)存模型

    程序內(nèi)存由一系列獨(dú)立的地址空間(稱為“段”)組成。代碼、數(shù)據(jù)和棧在不同的段中

    邏輯地址=段選擇器 + 偏移量

    保護(hù)模式下的內(nèi)存管理:分段(必須)+ 分頁(可選)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    程序線性地址空間 ≤4GB, 物理地址空間 ≤64GB

    每個(gè)段最大 232 字節(jié), IA-32 程序最多使用 16383 個(gè)段

    ?

    x86 Linux 系統(tǒng)的線性地址空間分層

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    • 最大 3G ?

    ? ??

  4. 四、內(nèi)存破壞漏洞

    2022-03-21 第四次課后半部分

    mem-vul-part.pdf 內(nèi)存破壞漏洞

    ?

    ?

    與安全相關(guān)的語言問題(C 與 Java 比較)

    回顧:

    漏洞、攻擊與危害

    漏洞(vulnerability):可以被對(duì)缺陷具有利用能力的攻擊者訪問利用缺陷, 要素:

    • 缺陷 (flaw)
    • 攻擊者能訪問缺陷
    • 攻擊者有利用缺陷的能力

    攻擊(attack): 指攻擊者嘗試?yán)寐┒?,例?主動(dòng)、被動(dòng)、DoS…

    危害(compromise):攻擊成功則危害發(fā)生

    ?

    • 軟件錯(cuò)誤(Software error):會(huì)導(dǎo)致軟件無法滿足預(yù)期的編程錯(cuò)誤
    • 軟件漏洞(Software vulnerability):可能導(dǎo)致攻擊的軟件錯(cuò)誤

    ?

    C 字符串的用法與陷阱

    在 C/C++ 程序中, 用 C 語言字符串編程時(shí), 容易出現(xiàn)的錯(cuò)誤

    • 緩沖區(qū)溢出(Buffer overflows)
    • Null 終止錯(cuò)誤(null-termination errors)
    • 差一錯(cuò)誤(off-by-one errors)

    差一錯(cuò)誤 是在計(jì)數(shù)時(shí)由于邊界條件判斷失誤導(dǎo)致結(jié)果多了一或少了一的錯(cuò)誤

    gets:無邊界的字符串復(fù)制

    strcpy 和 strcat

    ?

    緩沖區(qū)溢出:棧溢出(stack smashing)

    “x86 Linux 系統(tǒng)的線性地址空間分層”33

    “System V AMD64 ABI 調(diào)用慣例”34

    緩沖區(qū)溢出可被利用于修改:

    • 棧上的: 返回指令指針, 函數(shù)指針, 局部變量. . .
    • 堆數(shù)據(jù)結(jié)構(gòu)

    覆寫返回指令指針

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    代碼注入

    將 ret 設(shè)置為被注入代碼的起始地址, 被注入代碼可以做任何事情,如下載和安裝蠕蟲

    注入 Shell Code

    shellcode: 注入的 payload 代碼會(huì)執(zhí)行起來一個(gè) shell
    在該 shell 中, 攻擊者可以執(zhí)行任何命令
    該 shell 與當(dāng)前進(jìn)程具有相同的特權(quán)級(jí)
    通常具有 root 權(quán)限的進(jìn)程會(huì)被攻擊

    如何使用被注入的代碼調(diào)用“execve”?

    • 將函數(shù)“execve”的地址注入棧上

    • “execve”是一個(gè) libc 中的函數(shù), 動(dòng)態(tài)鏈接到進(jìn)程地址空間中

    • 為了使得我們的可執(zhí)行程序能夠調(diào)用 libc 中的函數(shù),可執(zhí)行程序必須能找到被調(diào)用函數(shù)的地址

      • 如何做到? 當(dāng)前程序通過一個(gè) stub(PLT, Procedure Linkage Table )調(diào)用“execve”, PLT 在鏈接時(shí)檢索 GOT (Global Offset Table)中的地址集合(請(qǐng)回憶動(dòng)態(tài)鏈接過程)
        “劫持全局偏移量表(GOT)中的函數(shù)指針, 被動(dòng)態(tài)鏈接函數(shù)所使用”35

    ?

    ?

    整數(shù)溢出

    ?

    堆溢出

    【NOTES.0x04】簡易 Glibc heap exploit 筆記 - arttnba3’s blog

    堆溢出: 在堆上開辟的緩沖區(qū)中的緩沖區(qū)溢出漏洞

    溢出發(fā)生在堆緩沖區(qū)

    ?

    溢出堆上的元數(shù)據(jù)

    Heap allocators (又稱內(nèi)存管理器)

    • 哪些內(nèi)存區(qū)域已被開辟,它們的大小
    • 哪些內(nèi)存區(qū)域可以被開辟

    Heap allocators 維護(hù)了元數(shù)據(jù) (前塊大小, 本塊大小, previous 指針, next 指針)

    • 堆元數(shù)據(jù)與堆數(shù)據(jù)是內(nèi)聯(lián)關(guān)系
    • 內(nèi)存管理函數(shù)(如 malloc()和 free())內(nèi)部,會(huì)修改元數(shù)據(jù)

    堆溢出攻擊會(huì)篡改元數(shù)據(jù),并等待內(nèi)存管理函數(shù)把被篡改的元數(shù)據(jù)寫入目標(biāo)地址

    ?

    Heap Allocator

    • 維護(hù)一個(gè)已開辟的塊的雙向鏈表,以及一個(gè)空閑塊的雙向鏈表
    • malloc()和 free()會(huì)修改雙向鏈表

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    移除一個(gè)塊

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    攻擊 Heap Allocator

    • 通過溢出 chunk2, 攻擊者控制 chunk2 的 bk 和 fd 指針

      • 實(shí)際上就控制了“向哪兒寫數(shù)據(jù)”(where)以及 “寫入什么數(shù)據(jù)”(what), 可以隨意修改堆, 因此又稱 “write-what-where” 漏洞
    • 假設(shè)攻擊者想將 value 寫入內(nèi)存地址 addr

      • 攻擊者將 chunk2->fd 設(shè)為 value
      • 攻擊者將 chunk2->bk 設(shè)為 addr - offset,其中 offset 為 fd 字段在 chuck 結(jié)構(gòu)體內(nèi)的偏移量

    free():

    • chunk2->bk->fd = chunk2->fd
    • chunk2->fd->bk = chunk2->bk

    變?yōu)?/p>

    • “(addr - offset)->fd = value”, 等同于(*addr)=value
    • “value->bk = addr - offset” (應(yīng)確保value->bk有可寫權(quán)限)

    第一個(gè)寫操作實(shí)現(xiàn)了攻擊者的目標(biāo), 實(shí)現(xiàn)了任意的內(nèi)存寫操作

    ?

    write-what-where 操作由free()完成, 故需從free()向上尋找潛在溢出

    當(dāng)溢出與代碼注入/代碼重用結(jié)合時(shí),

    • *(addr)=value”的addr是預(yù)先選擇的函數(shù)指針、返回指令指針、影響控制流的變量地址等, value是惡意的跳轉(zhuǎn)目標(biāo)
    • fd字段在chunk結(jié)構(gòu)體中的偏移量固定
    • 因此, 決定被 free 的 chunk2 的元數(shù)據(jù) (chunk2->fd, chunk2->bk) 應(yīng)該被溢出修改的取值, 是可計(jì)算的

    ?

    ?

    ?

    Use After Free

    定義: 程序在堆上釋放內(nèi)存, 然后引用該內(nèi)存, 就好像該內(nèi)存位置仍然合法:攻擊者可以控制使用已釋放的指針進(jìn)行的數(shù)據(jù)寫入

    又稱作懸掛指針使用,也是一個(gè) write-what-where 漏洞

    大多數(shù)有效的 use-after-free 攻擊利用另一類型的數(shù)據(jù)

    struct A {
        void (*fnptr)(char *arg);
        char *buf;
    };
        struct B {
        int B1;
        int B2;
        char info[32];
    };
    
    // 釋放A, 開辟B, 實(shí)際做了什么?
    x = (struct A *)malloc(sizeof(struct A));
    free(x);
    y = (struct B *)malloc(sizeof(struct B));
    
    // 如何利用此漏洞?
    y->B1 = 0xDEADBEEF;
    x->fnptr(x->buf);
    

    Use-after-free 是類型混淆的一個(gè)實(shí)例

    ?

    ?

    禁止 Use After Free

    如何以較簡單的方式禁止use-after-free?

    設(shè)置所有被釋放的堆空間為NULL

    這時(shí)在使用被釋放的堆空間時(shí)產(chǎn)生一個(gè) null-pointer dereference

    目前, 操作系統(tǒng)對(duì) null-pointer deference 有內(nèi)建的防護(hù)機(jī)制

    復(fù)雜度: 需要設(shè)置所有別名指針(aliased pointers)為NULL

    ?

    ?

    Double Free

    類型混淆

    格式化字符串攻擊

    能夠?qū)е潞莒`活的惡意利用

    • 代碼注入: 被注入代碼直接放入字符串
    • 各種代碼重用

    int i; printf (“i = %d with address %08x\n", i, &i);

    將格式化字符串的地址指針, i&i 分別通過寄存器 rdi, rsi 和 rdx 傳遞, 并調(diào)用 printf

    當(dāng)程序運(yùn)行至printf內(nèi)部, 會(huì)在這些寄存器中查找參數(shù);如果參數(shù)超過6個(gè),還會(huì)在棧上查找參數(shù)

    格式指示符字母的含義: printf - C++ Reference (cplusplus.com)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    格式化字符串中的“%n

    能夠?qū)⒌健?n”位置為止已經(jīng)由printf打印出的字節(jié)數(shù)寫到一個(gè)我們選定的變量中

    int i;
    printf ("foobar%n\n", (int *) &i);
    printf ("i = %d\n", i);
    // i 的值最終為6
    

    對(duì)于“format-string.c”程序, 如果用戶輸入“foobar%n”會(huì)怎樣?

    • 從rsi獲得一個(gè)地址, 且向該地址上的內(nèi)存單元中寫入整數(shù)6
    • 如果輸入的是“foobar%10u%n”呢? 可能會(huì)向該內(nèi)存位置寫入16
    • 如何向一個(gè)任意地址寫? 將該地址放在正確的位置 (寄存器或棧單元, 以作為printf的參數(shù))

    因此, 攻擊者可以用任意內(nèi)容更新任意內(nèi)存??煞窀矊懸粋€(gè)函數(shù)指針并劫持控制流(且安裝某些蠕蟲代碼)?

    int main(int argc, char *argv[]) {
        char buf[512];
        fgets(buf, sizeof(buf), stdin); // no buffer overflow here
        printf("The input is:");
        printf(buf); // format string attacks here
        return 0
    }
    

    攻擊者可以

    • 查看/修改內(nèi)存的任意部分
    • 執(zhí)行任意代碼, 只需要把代碼也放入buf

    ?

    格式化字符串攻擊的修復(fù)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    通過提供一個(gè)特殊的格式化字符串, 可以規(guī)避“%400s”的限制:

    %497d\x3c\xd3\xff\xbf<nops><shellcode>”。創(chuàng)建一個(gè)497字符長的字符串,加上錯(cuò)誤字符串(“ERR Wrong command: ”),超過了outbuf的長度4字節(jié)。雖然“user”字符串只允許 400字節(jié),可以通過濫用格式化字符串參數(shù)擴(kuò)展其長度。因?yàn)榈诙€(gè)sprintf不檢查長度, 它可以用來突破outbuf的長度界限。此時(shí)我們寫入了一個(gè)返回地址 (0xbfffd33c), 并可以以之前棧溢出的利用方式進(jìn)行攻擊

    ?

    防止格式化字符串漏洞

    即限制攻擊者控制格式化字符串的能力

    • 如果有可能,硬編碼字符串;且不用包含“%*”的格式化字符串
    • 如果必須要用格式化字符串,至少不要用“printf(arg)
    • 不要使用 %n
    • 小心其他的引用: %ssprintf 能夠被用于構(gòu)造棧內(nèi)容披露攻擊
    • 編譯器支持printf參數(shù)與格式化字符串的匹配檢查

    ? ??

  5. 緩沖區(qū)溢出:棧溢出(stack smashing)

    “x86 Linux 系統(tǒng)的線性地址空間分層”33

    “System V AMD64 ABI 調(diào)用慣例”34

    緩沖區(qū)溢出可被利用于修改:

    • 棧上的: 返回指令指針, 函數(shù)指針, 局部變量. . .
    • 堆數(shù)據(jù)結(jié)構(gòu)

    覆寫返回指令指針

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    代碼注入

    將 ret 設(shè)置為被注入代碼的起始地址, 被注入代碼可以做任何事情,如下載和安裝蠕蟲

    注入 Shell Code

    shellcode: 注入的 payload 代碼會(huì)執(zhí)行起來一個(gè) shell
    在該 shell 中, 攻擊者可以執(zhí)行任何命令
    該 shell 與當(dāng)前進(jìn)程具有相同的特權(quán)級(jí)
    通常具有 root 權(quán)限的進(jìn)程會(huì)被攻擊

    如何使用被注入的代碼調(diào)用“execve”?

    • 將函數(shù)“execve”的地址注入棧上

    • “execve”是一個(gè) libc 中的函數(shù), 動(dòng)態(tài)鏈接到進(jìn)程地址空間中

    • 為了使得我們的可執(zhí)行程序能夠調(diào)用 libc 中的函數(shù),可執(zhí)行程序必須能找到被調(diào)用函數(shù)的地址

      • 如何做到? 當(dāng)前程序通過一個(gè) stub(PLT, Procedure Linkage Table )調(diào)用“execve”, PLT 在鏈接時(shí)檢索 GOT (Global Offset Table)中的地址集合(請(qǐng)回憶動(dòng)態(tài)鏈接過程)
        “劫持全局偏移量表(GOT)中的函數(shù)指針, 被動(dòng)態(tài)鏈接函數(shù)所使用”35

    ?

    ? ??

  6. 堆溢出

    【NOTES.0x04】簡易 Glibc heap exploit 筆記 - arttnba3’s blog

    堆溢出: 在堆上開辟的緩沖區(qū)中的緩沖區(qū)溢出漏洞

    溢出發(fā)生在堆緩沖區(qū)

    ?

    溢出堆上的元數(shù)據(jù)

    Heap allocators (又稱內(nèi)存管理器)

    • 哪些內(nèi)存區(qū)域已被開辟,它們的大小
    • 哪些內(nèi)存區(qū)域可以被開辟

    Heap allocators 維護(hù)了元數(shù)據(jù) (前塊大小, 本塊大小, previous 指針, next 指針)

    • 堆元數(shù)據(jù)與堆數(shù)據(jù)是內(nèi)聯(lián)關(guān)系
    • 內(nèi)存管理函數(shù)(如 malloc()和 free())內(nèi)部,會(huì)修改元數(shù)據(jù)

    堆溢出攻擊會(huì)篡改元數(shù)據(jù),并等待內(nèi)存管理函數(shù)把被篡改的元數(shù)據(jù)寫入目標(biāo)地址

    ?

    Heap Allocator

    • 維護(hù)一個(gè)已開辟的塊的雙向鏈表,以及一個(gè)空閑塊的雙向鏈表
    • malloc()和 free()會(huì)修改雙向鏈表

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    移除一個(gè)塊

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    攻擊 Heap Allocator

    • 通過溢出 chunk2, 攻擊者控制 chunk2 的 bk 和 fd 指針

      • 實(shí)際上就控制了“向哪兒寫數(shù)據(jù)”(where)以及 “寫入什么數(shù)據(jù)”(what), 可以隨意修改堆, 因此又稱 “write-what-where” 漏洞
    • 假設(shè)攻擊者想將 value 寫入內(nèi)存地址 addr

      • 攻擊者將 chunk2->fd 設(shè)為 value
      • 攻擊者將 chunk2->bk 設(shè)為 addr - offset,其中 offset 為 fd 字段在 chuck 結(jié)構(gòu)體內(nèi)的偏移量

    free():

    • chunk2->bk->fd = chunk2->fd
    • chunk2->fd->bk = chunk2->bk

    變?yōu)?/p>

    • “(addr - offset)->fd = value”, 等同于(*addr)=value
    • “value->bk = addr - offset” (應(yīng)確保value->bk有可寫權(quán)限)

    第一個(gè)寫操作實(shí)現(xiàn)了攻擊者的目標(biāo), 實(shí)現(xiàn)了任意的內(nèi)存寫操作

    ?

    write-what-where 操作由free()完成, 故需從free()向上尋找潛在溢出

    當(dāng)溢出與代碼注入/代碼重用結(jié)合時(shí),

    • *(addr)=value”的addr是預(yù)先選擇的函數(shù)指針、返回指令指針、影響控制流的變量地址等, value是惡意的跳轉(zhuǎn)目標(biāo)
    • fd字段在chunk結(jié)構(gòu)體中的偏移量固定
    • 因此, 決定被 free 的 chunk2 的元數(shù)據(jù) (chunk2->fd, chunk2->bk) 應(yīng)該被溢出修改的取值, 是可計(jì)算的

    ?

    ?

    ? ??

  7. Use After Free

    定義: 程序在堆上釋放內(nèi)存, 然后引用該內(nèi)存, 就好像該內(nèi)存位置仍然合法:攻擊者可以控制使用已釋放的指針進(jìn)行的數(shù)據(jù)寫入

    又稱作懸掛指針使用,也是一個(gè) write-what-where 漏洞

    大多數(shù)有效的 use-after-free 攻擊利用另一類型的數(shù)據(jù)

    struct A {
        void (*fnptr)(char *arg);
        char *buf;
    };
        struct B {
        int B1;
        int B2;
        char info[32];
    };
    
    // 釋放A, 開辟B, 實(shí)際做了什么?
    x = (struct A *)malloc(sizeof(struct A));
    free(x);
    y = (struct B *)malloc(sizeof(struct B));
    
    // 如何利用此漏洞?
    y->B1 = 0xDEADBEEF;
    x->fnptr(x->buf);
    

    Use-after-free 是類型混淆的一個(gè)實(shí)例

    ?

    ?

    禁止 Use After Free

    如何以較簡單的方式禁止use-after-free?

    設(shè)置所有被釋放的堆空間為NULL

    這時(shí)在使用被釋放的堆空間時(shí)產(chǎn)生一個(gè) null-pointer dereference

    目前, 操作系統(tǒng)對(duì) null-pointer deference 有內(nèi)建的防護(hù)機(jī)制

    復(fù)雜度: 需要設(shè)置所有別名指針(aliased pointers)為NULL

    ?

    ? ??

  8. 格式化字符串攻擊

    能夠?qū)е潞莒`活的惡意利用

    • 代碼注入: 被注入代碼直接放入字符串
    • 各種代碼重用

    int i; printf (“i = %d with address %08x\n", i, &i);

    將格式化字符串的地址指針, i&i 分別通過寄存器 rdi, rsi 和 rdx 傳遞, 并調(diào)用 printf

    當(dāng)程序運(yùn)行至printf內(nèi)部, 會(huì)在這些寄存器中查找參數(shù);如果參數(shù)超過6個(gè),還會(huì)在棧上查找參數(shù)

    格式指示符字母的含義: printf - C++ Reference (cplusplus.com)

    格式化字符串中的“%n

    能夠?qū)⒌健?n”位置為止已經(jīng)由printf打印出的字節(jié)數(shù)寫到一個(gè)我們選定的變量中

    int i;
    printf ("foobar%n\n", (int *) &i);
    printf ("i = %d\n", i);
    // i 的值最終為6
    

    對(duì)于“format-string.c”程序, 如果用戶輸入“foobar%n”會(huì)怎樣?

    • 從rsi獲得一個(gè)地址, 且向該地址上的內(nèi)存單元中寫入整數(shù)6
    • 如果輸入的是“foobar%10u%n”呢? 可能會(huì)向該內(nèi)存位置寫入16
    • 如何向一個(gè)任意地址寫? 將該地址放在正確的位置 (寄存器或棧單元, 以作為printf的參數(shù))

    因此, 攻擊者可以用任意內(nèi)容更新任意內(nèi)存??煞窀矊懸粋€(gè)函數(shù)指針并劫持控制流(且安裝某些蠕蟲代碼)?

    int main(int argc, char *argv[]) {
        char buf[512];
        fgets(buf, sizeof(buf), stdin); // no buffer overflow here
        printf("The input is:");
        printf(buf); // format string attacks here
        return 0
    }
    

    攻擊者可以

    • 查看/修改內(nèi)存的任意部分
    • 執(zhí)行任意代碼, 只需要把代碼也放入buf

    ?

    格式化字符串攻擊的修復(fù)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    通過提供一個(gè)特殊的格式化字符串, 可以規(guī)避“%400s”的限制:

    %497d\x3c\xd3\xff\xbf<nops><shellcode>”。創(chuàng)建一個(gè)497字符長的字符串,加上錯(cuò)誤字符串(“ERR Wrong command: ”),超過了outbuf的長度4字節(jié)。雖然“user”字符串只允許 400字節(jié),可以通過濫用格式化字符串參數(shù)擴(kuò)展其長度。因?yàn)榈诙€(gè)sprintf不檢查長度, 它可以用來突破outbuf的長度界限。此時(shí)我們寫入了一個(gè)返回地址 (0xbfffd33c), 并可以以之前棧溢出的利用方式進(jìn)行攻擊

    ?

    防止格式化字符串漏洞

    即限制攻擊者控制格式化字符串的能力

    • 如果有可能,硬編碼字符串;且不用包含“%*”的格式化字符串
    • 如果必須要用格式化字符串,至少不要用“printf(arg)
    • 不要使用 %n
    • 小心其他的引用: %ssprintf 能夠被用于構(gòu)造棧內(nèi)容披露攻擊
    • 編譯器支持printf參數(shù)與格式化字符串的匹配檢查

    ? ??

  9. 五、內(nèi)存破壞防御

    雖然對(duì)緩沖區(qū)溢出的認(rèn)知已超過 40 年之久, 但緩沖區(qū)溢出仍未被消除。部分原因在于存在大量的利用選項(xiàng):

    • 多樣的目標(biāo): 不僅僅可以利用返回地址, 實(shí)際上可以利用任意代碼地址或數(shù)據(jù)
    • 多樣的使用: 可以利用“讀”或“寫”操作
    • 多樣的利用方式: 對(duì)代碼可以“注入”或“重用”
    • 當(dāng)前對(duì)溢出的防御措施多樣, 但不完全

    防御可以在不同的時(shí)機(jī)進(jìn)行

    • 編程前
    • 開發(fā)過程中 (防御性編程)
    • 測試時(shí) (fuzzing, . . .)
    • 代碼運(yùn)行時(shí) (檢測和緩解: stack canaries, DEP, . . .)

    ?

    Stack Canaries 棧 金絲雀

    是棧溢出的檢測機(jī)制, 又稱“棧 cookies”,由 gcc 的 StackGuard 實(shí)現(xiàn)

    原理:將一個(gè) dummy 值(或隨機(jī)值)寫到棧上的返回地址之前,并在函數(shù)返回時(shí)檢查該值。不小心構(gòu)造的棧溢出(假定是順序棧粉碎)會(huì)覆寫該“canary”單元, 該行為將被探測到。

    攻破 StackGuard 的基本方法

    對(duì) canary 單元, 用正確的值覆寫

    • 如果 canary 所使用的隨機(jī)值范圍很小, 則枚舉每種可能性
    • 或先實(shí)施一個(gè) memory disclosure 攻擊, 獲知 canary 的值

    無法抵御 disclosure 攻擊是 StackGuard 的最大局限性

    • disclosure 攻擊通過對(duì)緩沖區(qū)的“overread”實(shí)現(xiàn)

    • 著名例子: 對(duì) SSL 的 Heartbleed 攻擊

    • 以下程序?yàn)槭裁磿?huì)對(duì) Stackguard 的 canaries 造成威脅?

      • 通過對(duì)緩沖區(qū)的“overread”, 攻擊者讀取超出棧緩沖區(qū)之外的值, 從而獲取 canary 的值
    char packet[10];// suppose len is adversary controlled
    strncpy(buf, packet, len);
    send(fd, buf, len);
    

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    有時(shí)不需要覆寫返回地址, 可以溢出:

    • 安全敏感的局部變量
    • 堆數(shù)據(jù)
    • 全局?jǐn)?shù)據(jù)
    • · · ·
    • 本質(zhì)上, 攻擊者只需要劫持一個(gè)函數(shù)指針

    劫持函數(shù)指針

    void foo () {...}
    void bar () {...}
    int main() {
        char buf [16];
        void (*f) () = &foo;
        gets(buf);
        f();
    }
    

    假定我們沒有機(jī)會(huì)溢出返回地址

    可溢出緩沖區(qū), 使得函數(shù)指針被修改為 bar 的地址, 然后函數(shù)調(diào)用將調(diào)用 bar 而非 foo

    劫持函數(shù)指針的其他方法

    • 使用堆溢出,對(duì)堆上的函數(shù)指針進(jìn)行劫持
    • 劫持全局函數(shù)指針
    • 劫持全局偏移量表(GOT)中的函數(shù)指針, 被動(dòng)態(tài)鏈接函數(shù)所使用

    ?

    攻破 StackGuard 的其他方法

    有時(shí)不需要覆寫返回地址, 可以溢出:

    • 安全敏感的局部變量

    • 堆數(shù)據(jù)

    • 全局?jǐn)?shù)據(jù)

      • 全局?jǐn)?shù)據(jù)溢出: 攻擊位于全局?jǐn)?shù)據(jù)區(qū)的緩沖區(qū)
    • · · ·

    如何防御?

    • 讓函數(shù)指針位于其他類型數(shù)據(jù)的下方(更低地址)
    • 在全局?jǐn)?shù)據(jù)區(qū)和其他管理表結(jié)構(gòu)之間使用守衛(wèi)頁

    守衛(wèi)頁(Guard Pages)

    也是一種運(yùn)行時(shí)檢測方法, 可以看作StackGuard的擴(kuò)展

    在一個(gè)進(jìn)程地址空間中關(guān)鍵內(nèi)存區(qū)域之間放置守衛(wèi)頁 (像一些gaps)

    • 需借助CPU內(nèi)存管理單元(MMU)的管理功能將它們標(biāo)記為非法地址
    • 任何對(duì)其的訪問嘗試都導(dǎo)致進(jìn)程被終止

    效果: 能失效緩沖區(qū)溢出攻擊, 特別是對(duì)全局?jǐn)?shù)據(jù)區(qū)的溢出攻擊

    甚至可以在棧幀之間、或者堆緩沖區(qū)之間放置守衛(wèi)頁

    • 可以提供更進(jìn)一步的保護(hù), 防止棧溢出和堆溢出攻擊
    • 會(huì)導(dǎo)致執(zhí)行時(shí)間和內(nèi)存的很大開銷, 因?yàn)橐С执罅宽撚成?/li>

    ?

    ?

    數(shù)據(jù)執(zhí)行保護(hù)(DEP)

    馮諾依曼體系結(jié)構(gòu)

    • 將代碼作為數(shù)據(jù)存儲(chǔ)
    • 使得攻擊者可以向?;蚨炎⑷氪a, 而棧和堆原本只應(yīng)該存儲(chǔ)數(shù)據(jù)

    哈佛架構(gòu)

    • 虛擬地址空間切分為一個(gè)數(shù)據(jù)區(qū)和一個(gè)代碼區(qū)
    • 代碼區(qū)可讀且可執(zhí)行
    • 數(shù)據(jù)區(qū)可讀且可寫
    • 沒有區(qū)域是既可寫又可執(zhí)行的

    Data Execution Prevention (數(shù)據(jù)執(zhí)行保護(hù)): 是一種運(yùn)行時(shí)緩解技術(shù)

    DEP又稱作Nx-bit (non executable bit), WX

    能夠阻止代碼注入攻擊

    很多緩沖區(qū)溢出攻擊涉及將機(jī)器碼復(fù)制到目標(biāo)緩沖區(qū), 然后將執(zhí)行轉(zhuǎn)移到這些緩沖區(qū)

    • 一種防御方法就是阻止在棧/堆/全局?jǐn)?shù)據(jù)區(qū)中執(zhí)行代碼, 并假定可執(zhí)行代碼只能出現(xiàn)在進(jìn)程地址空間中除這些位置外的其他位置需要CPU內(nèi)存管理單元(MMU)提供支持, 將虛擬內(nèi)存的對(duì)應(yīng)頁標(biāo)記為不可執(zhí)行
    • 對(duì)于每一個(gè)被映射的虛擬內(nèi)存頁, 都有這樣額外的1個(gè)no-executebit, 置位時(shí), 表示該頁的數(shù)據(jù)不能作為代碼執(zhí)行, 一旦程序控制流到達(dá)該頁, CPU會(huì)產(chǎn)生陷入

    DEP 被絕大多數(shù)操作系統(tǒng)和指令集體系結(jié)構(gòu)支持

    • 一些CPU早有支持(如Solaris的SPARC), 只需修改Solaris內(nèi)核參數(shù)即可啟用
    • x86系列后來才向MMU中加入no-execute位
    • Linux/Unix類系統(tǒng), Windows均已提供相應(yīng)擴(kuò)展, 支持使用DEP特性

    對(duì) Nx-bit 的不同叫法

    • Intel: XD (eXecute Disable)
    • AMD: Enhanced Virus Protection
    • ARM: XN (eXecute Never)

    如果CPU硬件支持, DEP可作為操作系統(tǒng)更新, 通過更改對(duì)進(jìn)程虛擬地址空間的內(nèi)存管理, 提供對(duì)現(xiàn)有漏洞程序的保護(hù)

    DEP將棧和堆置為不可執(zhí)行, 對(duì)多種緩沖區(qū)溢出攻擊提供了一種高度的保護(hù)

    但有一些合法程序需要將可執(zhí)行代碼放在棧上:

    • 如Java運(yùn)行時(shí)系統(tǒng)、運(yùn)行時(shí)代碼生成、Linux信號(hào)處理程序等
    • 需要針對(duì)這些需求制定一些專門條款(Special provisions)

    ?

    攻擊 DEP——代碼重用攻擊

    思路: 重用程序自身的代碼

    Return-to-libc: 用危險(xiǎn)的庫函數(shù)的地址替換返回地址

    代碼重用攻擊: Return to libc

    危險(xiǎn)庫函數(shù)如 system()

    攻擊者構(gòu)造合適的參數(shù)(在棧上, 返回指令指針的上方)

    • 在x64架構(gòu)上,還需要更多的工作:設(shè)置參數(shù)傳遞寄存器的值

    函數(shù)返回,庫函數(shù)得到執(zhí)行

    • 例如:execve(“/bin/sh”)

    甚至可以鏈接兩個(gè)庫函數(shù)調(diào)用

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    ?

    具體地

    • 攻擊者用一個(gè)溢出填充buffer:

      • 更改棧上保存的ebp為一個(gè)合適地址
      • 更改返回指令指針為一個(gè)欲執(zhí)行的庫函數(shù)的地址
      • 寫一個(gè)占位符值(庫函數(shù)會(huì)認(rèn)為其是返回地址,如果想利用它調(diào)用第二個(gè)庫函數(shù), 應(yīng)寫入第二個(gè)庫函數(shù)的地址)
      • 寫一個(gè)或多個(gè)要傳遞給此庫函數(shù)的參數(shù)
    • 當(dāng)被攻擊的函數(shù)返回時(shí), 恢復(fù)(更改過的)ebp, 然后pop更改后的返回地址到eip, 從而開始執(zhí)行庫函數(shù)代碼

    • 因?yàn)閹旌瘮?shù)相信它已被調(diào)用, 故會(huì)將棧頂當(dāng)前值(占位符)作為它自己棧幀的返回指令指針, 之上是參數(shù)

    • 最終會(huì)在占位符位置的下方創(chuàng)建起一個(gè)新的棧幀 (對(duì)應(yīng)于庫函數(shù)的執(zhí)行)

    • 根據(jù)庫函數(shù)參數(shù)類型以及庫函數(shù)對(duì)參數(shù)的解釋方式, 攻擊者可能需要準(zhǔn)確地知道參數(shù)地址以做溢出寫

    ?

    代碼注入 vs 代碼重用

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    代碼重用與代碼注入的協(xié)同

    在很多攻擊中, 代碼重用攻擊用來作為禁用DEP的第一步

    • 目標(biāo)是允許對(duì)棧內(nèi)存進(jìn)行執(zhí)行

    • 有一個(gè)系統(tǒng)調(diào)用可以更改棧的讀/寫/執(zhí)行屬性

      • int mprotect(void *addr, size_t len, int prot);
    • 設(shè)置對(duì)于起始于addr的內(nèi)存區(qū)域的保護(hù)

    • 調(diào)用此系統(tǒng)調(diào)用, 允許在棧上的“執(zhí)行”屬性, 然后開始執(zhí)行被注入的代碼

    ROP 面向返回的編程

    面向返回的編程

    • 執(zhí)行任意行為, 不需要注入代碼
    • 聯(lián)合現(xiàn)有的代碼片段 (gadgets)
    • 一系列圖靈完全的 gadgets, 及一種串聯(lián)這些 gadgets 的方法
    • 現(xiàn)有的展示已能針對(duì)小程序(如16KB)找到圖靈完全的 gadgets 集合

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    正常機(jī)器指令序列

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    ROP執(zhí)行

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    TODO

    用ROP我們能做什么?

    Turing completeness

    一種語言是Turing complete的,如果其具有

    • 條件分支(Conditional branching)
    • 可以任意修改內(nèi)存

    這兩點(diǎn)在ROP中均能實(shí)現(xiàn)

    針對(duì)ROP的保護(hù)

    ROP的工作基于對(duì)程序控制流的修改

    控制流完整性 (Control-flow integrity, CFI)

    • 預(yù)先決定被攻擊程序的控制流圖

    • 向該程序中插入檢測, 使得在程序運(yùn)行時(shí)發(fā)生非法控制流跳轉(zhuǎn)時(shí),終止程序

      • 通過編譯器或二進(jìn)制重寫進(jìn)行插入

    ?

    ROP 的運(yùn)行時(shí)緩解: 隨機(jī)化

    ROP利用要求攻擊者對(duì)代碼/數(shù)據(jù)地址的知識(shí),例如

    • 緩沖區(qū)的起始地址
    • 庫函數(shù)的地址

    思路: 引入人為的多樣性(隨機(jī)化)

    • 使得地址對(duì)于攻擊者而言難以預(yù)測
    • 如果攻擊者不知道一段代碼(或數(shù)據(jù))在內(nèi)存的什么位置,
    • 他就沒辦法在攻擊中重用它們

    有很多方法能夠?qū)崿F(xiàn)隨機(jī)化

    • 對(duì)棧的位置進(jìn)行隨機(jī)化, 對(duì)堆上的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)進(jìn)行隨機(jī)化,
    • 對(duì)庫函數(shù)的位置進(jìn)行隨機(jī)化
    • 隨機(jī)地填充棧幀
    • 在編譯時(shí), 隨機(jī)化代碼生成, 以抵御 ROP

    實(shí)現(xiàn)隨機(jī)化的時(shí)機(jī)

    • 編譯時(shí)
    • 鏈接時(shí)
    • 運(yùn)行時(shí)(通過動(dòng)態(tài)二進(jìn)制重寫, dynamic binary rewriting)

    地址空間隨機(jī)化的挑戰(zhàn)

    • 信息泄露(如通過邊信道)
    • 暴力破解秘密值
    • 對(duì)于長時(shí)間運(yùn)行的進(jìn)程, 如何“再次隨機(jī)化”

    地址空間隨機(jī)化的有效性取決于

    • 每個(gè)被隨機(jī)出的位置的熵值
    • 隨機(jī)化的完備性(completeness), 例如是否所有的對(duì)象都被隨機(jī)化?
    • 信息泄露的避免程度

    ?

    ?

    ASLR Linux 的地址空間布局隨機(jī)化

    ASLR(Address space layout randomization)

    • 對(duì)于位置無關(guān)的可執(zhí)行程序(PIE), 隨機(jī)化該可執(zhí)行程序的基地址

      • 所有庫都是 PIE, 因此它們的基地址被隨機(jī)化
      • 主可執(zhí)行程序可能不是 PIE, 故可能無法被 ASLR 保護(hù)
    • 關(guān)注的是內(nèi)存塊的隨機(jī)化

    • ASLR 是一種粗粒度的隨機(jī)化形式

      • 只有基地址被隨機(jī)化
      • 在內(nèi)存對(duì)象之間的相對(duì)距離不變

    攻破 ASLR 的方法

    • 如果隨機(jī)地址空間很小, 可以進(jìn)行一個(gè)窮舉搜索

      • 例如, Linux 提供 16 位的隨機(jī)化強(qiáng)度, 可以在約 200 秒以內(nèi)被窮舉搜索攻破
    • ASLR 經(jīng)常被 memory disclosure (內(nèi)存泄漏) 攻破

      • 例如, 如果攻擊者可以讀取指向棧的指針值, 他就可以使用該指針值發(fā)現(xiàn)棧在哪里

    ?

    ?

    防御性編程

    使用更安全的編程語言

    代碼評(píng)審

    ?

    費(fèi)根檢查(fagan inspection)

    檢查表

    編譯時(shí)防御

    ?

    編寫時(shí)

    危險(xiǎn)的 C 庫函數(shù)

    ?

    輸入驗(yàn)證

    所有輸入都是惡意的

    最小化攻擊面

    識(shí)別攻擊面

    ?

    防御性編程總結(jié)

    • 好的實(shí)踐

      • 使用更安全的編程語言

      • 進(jìn)行代碼評(píng)審

      • 使用編譯器的機(jī)制, 如 StackGuard

      • 編寫內(nèi)存安全的代碼

        • 使用邊界檢查庫函數(shù),使用更安全的庫
    • 輸入驗(yàn)證

      • 識(shí)別攻擊面: 程序從信道獲得輸入
      • 最小化攻擊面
      • 將所有輸入都看作潛在惡意的

    ? ??

  10. Stack Canaries 棧 金絲雀

    是棧溢出的檢測機(jī)制, 又稱“棧 cookies”,由 gcc 的 StackGuard 實(shí)現(xiàn)

    原理:將一個(gè) dummy 值(或隨機(jī)值)寫到棧上的返回地址之前,并在函數(shù)返回時(shí)檢查該值。不小心構(gòu)造的棧溢出(假定是順序棧粉碎)會(huì)覆寫該“canary”單元, 該行為將被探測到。

    攻破 StackGuard 的基本方法

    對(duì) canary 單元, 用正確的值覆寫

    • 如果 canary 所使用的隨機(jī)值范圍很小, 則枚舉每種可能性
    • 或先實(shí)施一個(gè) memory disclosure 攻擊, 獲知 canary 的值

    無法抵御 disclosure 攻擊是 StackGuard 的最大局限性

    • disclosure 攻擊通過對(duì)緩沖區(qū)的“overread”實(shí)現(xiàn)

    • 著名例子: 對(duì) SSL 的 Heartbleed 攻擊

    • 以下程序?yàn)槭裁磿?huì)對(duì) Stackguard 的 canaries 造成威脅?

      • 通過對(duì)緩沖區(qū)的“overread”, 攻擊者讀取超出棧緩沖區(qū)之外的值, 從而獲取 canary 的值
    char packet[10];// suppose len is adversary controlled
    strncpy(buf, packet, len);
    send(fd, buf, len);
    

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    有時(shí)不需要覆寫返回地址, 可以溢出:

    • 安全敏感的局部變量
    • 堆數(shù)據(jù)
    • 全局?jǐn)?shù)據(jù)
    • · · ·
    • 本質(zhì)上, 攻擊者只需要劫持一個(gè)函數(shù)指針

    劫持函數(shù)指針

    void foo () {...}
    void bar () {...}
    int main() {
        char buf [16];
        void (*f) () = &foo;
        gets(buf);
        f();
    }
    

    假定我們沒有機(jī)會(huì)溢出返回地址

    可溢出緩沖區(qū), 使得函數(shù)指針被修改為 bar 的地址, 然后函數(shù)調(diào)用將調(diào)用 bar 而非 foo

    劫持函數(shù)指針的其他方法

    • 使用堆溢出,對(duì)堆上的函數(shù)指針進(jìn)行劫持
    • 劫持全局函數(shù)指針
    • 劫持全局偏移量表(GOT)中的函數(shù)指針, 被動(dòng)態(tài)鏈接函數(shù)所使用

    ?

    攻破 StackGuard 的其他方法

    有時(shí)不需要覆寫返回地址, 可以溢出:

    • 安全敏感的局部變量

    • 堆數(shù)據(jù)

    • 全局?jǐn)?shù)據(jù)

      • 全局?jǐn)?shù)據(jù)溢出: 攻擊位于全局?jǐn)?shù)據(jù)區(qū)的緩沖區(qū)
    • · · ·

    如何防御?

    • 讓函數(shù)指針位于其他類型數(shù)據(jù)的下方(更低地址)
    • 在全局?jǐn)?shù)據(jù)區(qū)和其他管理表結(jié)構(gòu)之間使用守衛(wèi)頁

    守衛(wèi)頁(Guard Pages)

    也是一種運(yùn)行時(shí)檢測方法, 可以看作StackGuard的擴(kuò)展

    在一個(gè)進(jìn)程地址空間中關(guān)鍵內(nèi)存區(qū)域之間放置守衛(wèi)頁 (像一些gaps)

    • 需借助CPU內(nèi)存管理單元(MMU)的管理功能將它們標(biāo)記為非法地址
    • 任何對(duì)其的訪問嘗試都導(dǎo)致進(jìn)程被終止

    效果: 能失效緩沖區(qū)溢出攻擊, 特別是對(duì)全局?jǐn)?shù)據(jù)區(qū)的溢出攻擊

    甚至可以在棧幀之間、或者堆緩沖區(qū)之間放置守衛(wèi)頁

    • 可以提供更進(jìn)一步的保護(hù), 防止棧溢出和堆溢出攻擊
    • 會(huì)導(dǎo)致執(zhí)行時(shí)間和內(nèi)存的很大開銷, 因?yàn)橐С执罅宽撚成?/li>

    ?

    ? ??

  11. 數(shù)據(jù)執(zhí)行保護(hù)(DEP)

    馮諾依曼體系結(jié)構(gòu)

    • 將代碼作為數(shù)據(jù)存儲(chǔ)
    • 使得攻擊者可以向棧或堆注入代碼, 而棧和堆原本只應(yīng)該存儲(chǔ)數(shù)據(jù)

    哈佛架構(gòu)

    • 虛擬地址空間切分為一個(gè)數(shù)據(jù)區(qū)和一個(gè)代碼區(qū)
    • 代碼區(qū)可讀且可執(zhí)行
    • 數(shù)據(jù)區(qū)可讀且可寫
    • 沒有區(qū)域是既可寫又可執(zhí)行的

    Data Execution Prevention (數(shù)據(jù)執(zhí)行保護(hù)): 是一種運(yùn)行時(shí)緩解技術(shù)

    DEP又稱作Nx-bit (non executable bit), WX

    能夠阻止代碼注入攻擊

    很多緩沖區(qū)溢出攻擊涉及將機(jī)器碼復(fù)制到目標(biāo)緩沖區(qū), 然后將執(zhí)行轉(zhuǎn)移到這些緩沖區(qū)

    • 一種防御方法就是阻止在棧/堆/全局?jǐn)?shù)據(jù)區(qū)中執(zhí)行代碼, 并假定可執(zhí)行代碼只能出現(xiàn)在進(jìn)程地址空間中除這些位置外的其他位置需要CPU內(nèi)存管理單元(MMU)提供支持, 將虛擬內(nèi)存的對(duì)應(yīng)頁標(biāo)記為不可執(zhí)行
    • 對(duì)于每一個(gè)被映射的虛擬內(nèi)存頁, 都有這樣額外的1個(gè)no-executebit, 置位時(shí), 表示該頁的數(shù)據(jù)不能作為代碼執(zhí)行, 一旦程序控制流到達(dá)該頁, CPU會(huì)產(chǎn)生陷入

    DEP 被絕大多數(shù)操作系統(tǒng)和指令集體系結(jié)構(gòu)支持

    • 一些CPU早有支持(如Solaris的SPARC), 只需修改Solaris內(nèi)核參數(shù)即可啟用
    • x86系列后來才向MMU中加入no-execute位
    • Linux/Unix類系統(tǒng), Windows均已提供相應(yīng)擴(kuò)展, 支持使用DEP特性

    對(duì) Nx-bit 的不同叫法

    • Intel: XD (eXecute Disable)
    • AMD: Enhanced Virus Protection
    • ARM: XN (eXecute Never)

    如果CPU硬件支持, DEP可作為操作系統(tǒng)更新, 通過更改對(duì)進(jìn)程虛擬地址空間的內(nèi)存管理, 提供對(duì)現(xiàn)有漏洞程序的保護(hù)

    DEP將棧和堆置為不可執(zhí)行, 對(duì)多種緩沖區(qū)溢出攻擊提供了一種高度的保護(hù)

    但有一些合法程序需要將可執(zhí)行代碼放在棧上:

    • 如Java運(yùn)行時(shí)系統(tǒng)、運(yùn)行時(shí)代碼生成、Linux信號(hào)處理程序等
    • 需要針對(duì)這些需求制定一些專門條款(Special provisions)

    ?

    攻擊 DEP——代碼重用攻擊

    思路: 重用程序自身的代碼

    Return-to-libc: 用危險(xiǎn)的庫函數(shù)的地址替換返回地址 ?? ??

  12. 代碼注入 vs 代碼重用

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    代碼重用與代碼注入的協(xié)同

    在很多攻擊中, 代碼重用攻擊用來作為禁用DEP的第一步

    • 目標(biāo)是允許對(duì)棧內(nèi)存進(jìn)行執(zhí)行

    • 有一個(gè)系統(tǒng)調(diào)用可以更改棧的讀/寫/執(zhí)行屬性

      • int mprotect(void *addr, size_t len, int prot);
    • 設(shè)置對(duì)于起始于addr的內(nèi)存區(qū)域的保護(hù)

    • 調(diào)用此系統(tǒng)調(diào)用, 允許在棧上的“執(zhí)行”屬性, 然后開始執(zhí)行被注入的代碼

    ?

    ? ??

  13. ASLR Linux 的地址空間布局隨機(jī)化

    ASLR(Address space layout randomization)

    • 對(duì)于位置無關(guān)的可執(zhí)行程序(PIE), 隨機(jī)化該可執(zhí)行程序的基地址

      • 所有庫都是 PIE, 因此它們的基地址被隨機(jī)化
      • 主可執(zhí)行程序可能不是 PIE, 故可能無法被 ASLR 保護(hù)
    • 關(guān)注的是內(nèi)存塊的隨機(jī)化

    • ASLR 是一種粗粒度的隨機(jī)化形式

      • 只有基地址被隨機(jī)化
      • 在內(nèi)存對(duì)象之間的相對(duì)距離不變

    攻破 ASLR 的方法

    • 如果隨機(jī)地址空間很小, 可以進(jìn)行一個(gè)窮舉搜索

      • 例如, Linux 提供 16 位的隨機(jī)化強(qiáng)度, 可以在約 200 秒以內(nèi)被窮舉搜索攻破
    • ASLR 經(jīng)常被 memory disclosure (內(nèi)存泄漏) 攻破

      • 例如, 如果攻擊者可以讀取指向棧的指針值, 他就可以使用該指針值發(fā)現(xiàn)棧在哪里

    ?

    ? ?? ??

  14. ROP 面向返回的編程

    面向返回的編程

    • 執(zhí)行任意行為, 不需要注入代碼
    • 聯(lián)合現(xiàn)有的代碼片段 (gadgets)
    • 一系列圖靈完全的 gadgets, 及一種串聯(lián)這些 gadgets 的方法
    • 現(xiàn)有的展示已能針對(duì)小程序(如16KB)找到圖靈完全的 gadgets 集合

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    正常機(jī)器指令序列

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    ROP執(zhí)行

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    TODO

    用ROP我們能做什么?

    Turing completeness

    一種語言是Turing complete的,如果其具有

    • 條件分支(Conditional branching)
    • 可以任意修改內(nèi)存

    這兩點(diǎn)在ROP中均能實(shí)現(xiàn)

    針對(duì)ROP的保護(hù)

    ROP的工作基于對(duì)程序控制流的修改

    控制流完整性 (Control-flow integrity, CFI)

    • 預(yù)先決定被攻擊程序的控制流圖

    • 向該程序中插入檢測, 使得在程序運(yùn)行時(shí)發(fā)生非法控制流跳轉(zhuǎn)時(shí),終止程序

      • 通過編譯器或二進(jìn)制重寫進(jìn)行插入

    ?

    ROP 的運(yùn)行時(shí)緩解: 隨機(jī)化

    ROP利用要求攻擊者對(duì)代碼/數(shù)據(jù)地址的知識(shí),例如

    • 緩沖區(qū)的起始地址
    • 庫函數(shù)的地址

    思路: 引入人為的多樣性(隨機(jī)化)

    • 使得地址對(duì)于攻擊者而言難以預(yù)測
    • 如果攻擊者不知道一段代碼(或數(shù)據(jù))在內(nèi)存的什么位置,
    • 他就沒辦法在攻擊中重用它們

    有很多方法能夠?qū)崿F(xiàn)隨機(jī)化

    • 對(duì)棧的位置進(jìn)行隨機(jī)化, 對(duì)堆上的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)進(jìn)行隨機(jī)化,
    • 對(duì)庫函數(shù)的位置進(jìn)行隨機(jī)化
    • 隨機(jī)地填充棧幀
    • 在編譯時(shí), 隨機(jī)化代碼生成, 以抵御 ROP

    實(shí)現(xiàn)隨機(jī)化的時(shí)機(jī)

    • 編譯時(shí)
    • 鏈接時(shí)
    • 運(yùn)行時(shí)(通過動(dòng)態(tài)二進(jìn)制重寫, dynamic binary rewriting)

    地址空間隨機(jī)化的挑戰(zhàn)

    • 信息泄露(如通過邊信道)
    • 暴力破解秘密值
    • 對(duì)于長時(shí)間運(yùn)行的進(jìn)程, 如何“再次隨機(jī)化”

    地址空間隨機(jī)化的有效性取決于

    • 每個(gè)被隨機(jī)出的位置的熵值
    • 隨機(jī)化的完備性(completeness), 例如是否所有的對(duì)象都被隨機(jī)化?
    • 信息泄露的避免程度

    ?

    ?

    ASLR Linux 的地址空間布局隨機(jī)化

    ASLR(Address space layout randomization)

    • 對(duì)于位置無關(guān)的可執(zhí)行程序(PIE), 隨機(jī)化該可執(zhí)行程序的基地址

      • 所有庫都是 PIE, 因此它們的基地址被隨機(jī)化
      • 主可執(zhí)行程序可能不是 PIE, 故可能無法被 ASLR 保護(hù)
    • 關(guān)注的是內(nèi)存塊的隨機(jī)化

    • ASLR 是一種粗粒度的隨機(jī)化形式

      • 只有基地址被隨機(jī)化
      • 在內(nèi)存對(duì)象之間的相對(duì)距離不變

    攻破 ASLR 的方法

    • 如果隨機(jī)地址空間很小, 可以進(jìn)行一個(gè)窮舉搜索

      • 例如, Linux 提供 16 位的隨機(jī)化強(qiáng)度, 可以在約 200 秒以內(nèi)被窮舉搜索攻破
    • ASLR 經(jīng)常被 memory disclosure (內(nèi)存泄漏) 攻破

      • 例如, 如果攻擊者可以讀取指向棧的指針值, 他就可以使用該指針值發(fā)現(xiàn)棧在哪里

    ?

    ? ?? ??

  15. 六、惡意代碼的機(jī)理及其防護(hù)

    病毒, 蠕蟲, 木馬, (側(cè)重:差異, 共性, 如何隱藏

    8-木馬.pdf
    9-病毒.pdf

    木馬

    一個(gè)典型的特洛伊木馬(程序)通常具有以下四個(gè)特點(diǎn):

    • 有效性
    • 隱蔽性
    • 頑固性
    • 易植入性

    此外,木馬還具有以下輔助型特點(diǎn):

    • 自動(dòng)運(yùn)行
    • 欺騙性
    • 自動(dòng)恢復(fù)
    • 功能的特殊

    ?

    木馬的實(shí)現(xiàn)原理與攻擊步驟

    • 木馬實(shí)現(xiàn)原理

      • 本質(zhì)上說,木馬大多都是網(wǎng)絡(luò)客戶/服務(wù)(Client/Server)程序的組合。常由一個(gè)攻擊者控制的客戶端程序和一個(gè)運(yùn)行在被控計(jì)算機(jī)端的服務(wù)端程序組成

      • 當(dāng)攻擊者要利用“木馬”進(jìn)行網(wǎng)絡(luò)入侵,一般都需完成如下環(huán)節(jié):

        • 向目標(biāo)主機(jī)植入木馬
        • 啟動(dòng)和隱藏木馬
        • 服務(wù)器端(目標(biāo)主機(jī))和客戶端建立連接
        • 進(jìn)行遠(yuǎn)程控制
    • 植入技術(shù)

      • 主動(dòng)植入

        • 本地安裝

        • 遠(yuǎn)程安裝

          • 利用系統(tǒng)自身漏洞植入
          • 利用第三方軟件漏洞植入
      • 被動(dòng)植入

        • 網(wǎng)頁瀏覽植入
        • 利用電子郵件植入
        • 利用網(wǎng)絡(luò)下載植入
        • 利用即時(shí)通工具植入
        • 與其它程序捆綁
        • 利用移動(dòng)存儲(chǔ)設(shè)備植入
    • 自動(dòng)加載技術(shù)

      • 在Windows系統(tǒng)中木馬程序的自動(dòng)加載技術(shù)主要有:

        • 修改系統(tǒng)文件
        • 修改系統(tǒng)注冊(cè)表
        • 添加系統(tǒng)服務(wù)
        • 修改文件打開關(guān)聯(lián)屬性
        • 修改任務(wù)計(jì)劃
        • 修改組策略
        • 利用系統(tǒng)自動(dòng)運(yùn)行的程序
        • 修改啟動(dòng)文件夾
        • 替換系統(tǒng)DLL
    • 隱藏技術(shù)

      • 隱蔽性是木馬程序與其它程序的重要區(qū)別
      • 偽隱藏、真隱藏
      • 設(shè)置窗口不可見 (從任務(wù)欄中隱藏)
      • 把木馬程序注冊(cè)為服務(wù) (從進(jìn)程列表中隱藏)
      • 欺騙查看進(jìn)程的函數(shù) (從進(jìn)程列表中隱藏)
      • 使用可變的高端口 (端口隱藏技術(shù))
      • 使用系統(tǒng)服務(wù)端口 (端口隱藏技術(shù))
      • 替換系統(tǒng)驅(qū)動(dòng)或系統(tǒng)DLL (真隱藏技術(shù))
      • 動(dòng)態(tài)嵌入技術(shù) (真隱藏技術(shù))
    • 連接技術(shù)

      • 反彈窗口的連接技術(shù):更容易通過防火墻
    • 監(jiān)控技術(shù)

      木馬的遠(yuǎn)程監(jiān)控功能概括起來有以下幾點(diǎn):

      • 獲取目標(biāo)機(jī)器信息
      • 記錄用戶事件
      • 遠(yuǎn)程操作

    ?

    木馬的防御技術(shù)

    • 木馬的檢測

      • 端口掃描和連接檢查
      • 檢查系統(tǒng)進(jìn)程
      • 檢查ini文件、注冊(cè)表和服務(wù)
      • 監(jiān)視網(wǎng)絡(luò)通訊
    • 木馬的清除與善后

    • 木馬的防范

      • 及時(shí)修補(bǔ)漏洞,安裝補(bǔ)丁
      • 運(yùn)行實(shí)時(shí)監(jiān)控程序
      • 培養(yǎng)風(fēng)險(xiǎn)意識(shí),不使用來歷不明的軟件
      • 即時(shí)發(fā)現(xiàn),即時(shí)清除

    木馬的發(fā)展趨勢

    • 跨平臺(tái)
    • 模塊化設(shè)計(jì)
    • 無連接木馬
    • 主動(dòng)植入
    • 木馬與病毒的融合

    ?

    病毒

    計(jì)算機(jī)病毒的定義

    算機(jī)病毒一般依附于其他程序或文檔,是能夠自身復(fù)制,并且產(chǎn)生用戶不知情或不希望、甚至惡意的操作的非正常程

    計(jì)算機(jī)病毒的特點(diǎn)

    • 隱藏性
    • 傳染性
    • 潛伏性
    • 破壞性

    以上列舉的定義指的是狹義上的病毒。

    但是隨著黑客技術(shù)的發(fā)展,病毒、木馬、蠕蟲往往交叉在一起相互借鑒技術(shù),因此人們經(jīng)常說的計(jì)算機(jī)病毒往往是指廣義上的病毒,它是一切惡意程序的統(tǒng)稱。

    ?

    計(jì)算機(jī)病毒的破壞性

    • 破壞系統(tǒng)數(shù)據(jù)
    • 破壞目錄/文件
    • 修改內(nèi)存
    • 干擾系統(tǒng)運(yùn)行
    • 效率降低
    • 破壞顯示
    • 干擾鍵盤操作
    • 制造噪音
    • 修改CMOS參數(shù)
    • 影響打印

    計(jì)算機(jī)病毒引起的異常狀況

    • 計(jì)算機(jī)系統(tǒng)運(yùn)行速度明顯降低
    • 系統(tǒng)容易死機(jī)
    • 文件改變
    • 磁盤可用空間迅速減少
    • 系統(tǒng)參數(shù)被修改
    • 文件被破壞
    • 頻繁產(chǎn)生錯(cuò)誤信息
    • 系統(tǒng)異常頻繁重啟動(dòng)
    • Office宏病毒提

    ?

    計(jì)算機(jī)病毒的分類

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    我們針對(duì)狹義上的病毒,按照不同的標(biāo)準(zhǔn)對(duì)它進(jìn)行分類。

    • 按照計(jì)算機(jī)病毒攻擊的對(duì)象或系統(tǒng)平臺(tái)分類

      • 攻擊DOS系統(tǒng)的病毒
      • 攻擊WINDOWS系統(tǒng)的病毒
      • 攻擊UNIX 系統(tǒng)的病毒
      • 攻擊OS/2系統(tǒng)的病毒
      • 其它操作系統(tǒng)上的病毒:如手機(jī)病毒
    • 按照計(jì)算病毒的攻擊目標(biāo)機(jī)類型分類:

      • 攻擊微型計(jì)算機(jī)的病毒
      • 攻擊小型計(jì)算機(jī)的病毒
      • 攻擊工作站的病毒
    • 按照計(jì)算機(jī)病毒的鏈接方式分類

      • 源碼型病毒
      • 嵌入型病毒
      • 外殼型病毒:包圍在主程序的四周
      • 操作系統(tǒng)型病毒
    • 按照計(jì)算機(jī)病毒的破壞情況分類

      • 良性病毒:是不包含有對(duì)計(jì)算機(jī)系統(tǒng)產(chǎn)生直接破壞作用的代碼的計(jì)算機(jī)病毒。
      • 惡性病毒:指在代碼中包含有損傷和破壞計(jì)算機(jī)系統(tǒng)的操作
    • 按傳播媒介來分類

      • 單機(jī)病毒:單機(jī)病毒的載體是磁盤或光盤。常見的是通過從軟盤傳入硬盤,感染系統(tǒng)后,再傳染其它軟盤。軟盤又感染其它系統(tǒng)。
      • 網(wǎng)絡(luò)病毒:網(wǎng)絡(luò)為病毒提供了最好的傳播途徑。網(wǎng)絡(luò)病毒利用計(jì)算機(jī)網(wǎng)絡(luò)的協(xié)議或命令以及Email等進(jìn)行傳播,常見的是通過QQ、 BBS、Email、 FTP、 Web等傳播

    計(jì)算機(jī)病毒的命名

    雖然每個(gè)反病毒公司的命名規(guī)則都不太一樣,但大體都是采用一個(gè)統(tǒng)一的命名方法來命名的。?一般格式為: <病毒前綴>.<病毒名>.<病毒后綴>

    ?

    ?

    計(jì)算機(jī)病毒的工作機(jī)制

    • 計(jì)算機(jī)病毒程序模塊劃分

      • 感染模塊

        1. 尋找一個(gè)可執(zhí)行文件。
        2. 檢查該文件中是否有感染標(biāo)記。
        3. 如果沒有感染標(biāo)記,進(jìn)行感染,將病毒代碼放入宿主程序
      • 觸發(fā)模塊

        • 檢查預(yù)定觸發(fā)條件是否滿足。
        • 如果滿足,返回真值。
        • 如果不滿足,返回假值
      • 破壞模塊(表現(xiàn)模塊)

      • 主控模塊

        • 調(diào)用感染模塊,進(jìn)行感染。
        • 調(diào)用觸發(fā)模塊,接受其返回值。
        • 如果返回真值,執(zhí)行破壞模塊。
        • 如果返回假值,執(zhí)行后續(xù)程序。
    • 計(jì)算機(jī)病毒的生命周期

      • 感染
      • 潛伏
      • 繁殖
      • 發(fā)作
    • 計(jì)算機(jī)病毒的傳播機(jī)制

      • 病毒入侵宿主程序的基本方式有兩種: 替代方式鏈接方式。

      • 病毒的宿主程序可分為兩類: 操作系統(tǒng)應(yīng)用程序。

      • 交叉感染

      • 寄生感染

        • 插入感染
        • 逆插入感染
      • 沒有入口點(diǎn)的感染

      • 零長度感染

    • 計(jì)算機(jī)病毒的觸發(fā)機(jī)制

    • 計(jì)算機(jī)病毒的破壞機(jī)制

    典型的計(jì)算機(jī)病毒

    DOS病毒

    Win32 PE病毒

    宏病毒

    腳本病毒

    HTML病毒

    蠕蟲

    病毒的隱藏技術(shù)

    隱藏技術(shù)主要有:

    • 反跟蹤技術(shù)
    • 避開修改中斷向量
    • 請(qǐng)求在內(nèi)存中的合法身份
    • 維持宿主程序的外部特性
    • 不使用明顯的感染標(biāo)志

    花指令

    ?

    病毒的多態(tài)

    多態(tài)技術(shù)中的密鑰和解密代碼都變化多端,多態(tài)技術(shù)將對(duì)解密代碼進(jìn)行等價(jià)指令替換、寄存器替換、插入垃圾指令或者隨機(jī)調(diào)換指令的前后位置(有些指令的前后位置調(diào)換之后不影響代碼功能)等變化,以產(chǎn)生功能相同但是代碼截然不同的解密代碼

    多態(tài)引擎的組成:

    • 指令位置變換模塊
    • 寄存器變換模塊
    • 指令擴(kuò)展模塊
    • 指令收縮模塊
    • 等價(jià)指令替換模塊
    • 無用指令隨機(jī)插入
    • 垃圾指令插

    ?

    蠕蟲

    它與其他的病毒相比,具有傳染的主動(dòng)性

    計(jì)算機(jī)病毒是一段代碼,能把自身加到其它程序包括操作系統(tǒng)上。它不能獨(dú)立運(yùn)行,需要由它的宿主程序運(yùn)行來激活它”。

    Eugene H. Spafford對(duì)蠕蟲的定義:“計(jì)算機(jī)蠕蟲可以獨(dú)立運(yùn)行,并能把自身的一個(gè)包含所有功能的版本傳播到另外的計(jì)算機(jī)上”

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    ?【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    ?

    ? ??

  16. 病毒

    計(jì)算機(jī)病毒的定義

    算機(jī)病毒一般依附于其他程序或文檔,是能夠自身復(fù)制,并且產(chǎn)生用戶不知情或不希望、甚至惡意的操作的非正常程

    計(jì)算機(jī)病毒的特點(diǎn)

    • 隱藏性
    • 傳染性
    • 潛伏性
    • 破壞性

    以上列舉的定義指的是狹義上的病毒。

    但是隨著黑客技術(shù)的發(fā)展,病毒、木馬、蠕蟲往往交叉在一起相互借鑒技術(shù),因此人們經(jīng)常說的計(jì)算機(jī)病毒往往是指廣義上的病毒,它是一切惡意程序的統(tǒng)稱。

    ?

    計(jì)算機(jī)病毒的破壞性

    • 破壞系統(tǒng)數(shù)據(jù)
    • 破壞目錄/文件
    • 修改內(nèi)存
    • 干擾系統(tǒng)運(yùn)行
    • 效率降低
    • 破壞顯示
    • 干擾鍵盤操作
    • 制造噪音
    • 修改CMOS參數(shù)
    • 影響打印

    計(jì)算機(jī)病毒引起的異常狀況

    • 計(jì)算機(jī)系統(tǒng)運(yùn)行速度明顯降低
    • 系統(tǒng)容易死機(jī)
    • 文件改變
    • 磁盤可用空間迅速減少
    • 系統(tǒng)參數(shù)被修改
    • 文件被破壞
    • 頻繁產(chǎn)生錯(cuò)誤信息
    • 系統(tǒng)異常頻繁重啟動(dòng)
    • Office宏病毒提

    ?

    計(jì)算機(jī)病毒的分類

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    我們針對(duì)狹義上的病毒,按照不同的標(biāo)準(zhǔn)對(duì)它進(jìn)行分類。

    • 按照計(jì)算機(jī)病毒攻擊的對(duì)象或系統(tǒng)平臺(tái)分類

      • 攻擊DOS系統(tǒng)的病毒
      • 攻擊WINDOWS系統(tǒng)的病毒
      • 攻擊UNIX 系統(tǒng)的病毒
      • 攻擊OS/2系統(tǒng)的病毒
      • 其它操作系統(tǒng)上的病毒:如手機(jī)病毒
    • 按照計(jì)算病毒的攻擊目標(biāo)機(jī)類型分類:

      • 攻擊微型計(jì)算機(jī)的病毒
      • 攻擊小型計(jì)算機(jī)的病毒
      • 攻擊工作站的病毒
    • 按照計(jì)算機(jī)病毒的鏈接方式分類

      • 源碼型病毒
      • 嵌入型病毒
      • 外殼型病毒:包圍在主程序的四周
      • 操作系統(tǒng)型病毒
    • 按照計(jì)算機(jī)病毒的破壞情況分類

      • 良性病毒:是不包含有對(duì)計(jì)算機(jī)系統(tǒng)產(chǎn)生直接破壞作用的代碼的計(jì)算機(jī)病毒。
      • 惡性病毒:指在代碼中包含有損傷和破壞計(jì)算機(jī)系統(tǒng)的操作
    • 按傳播媒介來分類

      • 單機(jī)病毒:單機(jī)病毒的載體是磁盤或光盤。常見的是通過從軟盤傳入硬盤,感染系統(tǒng)后,再傳染其它軟盤。軟盤又感染其它系統(tǒng)。
      • 網(wǎng)絡(luò)病毒:網(wǎng)絡(luò)為病毒提供了最好的傳播途徑。網(wǎng)絡(luò)病毒利用計(jì)算機(jī)網(wǎng)絡(luò)的協(xié)議或命令以及Email等進(jìn)行傳播,常見的是通過QQ、 BBS、Email、 FTP、 Web等傳播

    計(jì)算機(jī)病毒的命名

    雖然每個(gè)反病毒公司的命名規(guī)則都不太一樣,但大體都是采用一個(gè)統(tǒng)一的命名方法來命名的。?一般格式為: <病毒前綴>.<病毒名>.<病毒后綴>

    ?

    ?

    計(jì)算機(jī)病毒的工作機(jī)制

    • 計(jì)算機(jī)病毒程序模塊劃分

      • 感染模塊

        1. 尋找一個(gè)可執(zhí)行文件。
        2. 檢查該文件中是否有感染標(biāo)記。
        3. 如果沒有感染標(biāo)記,進(jìn)行感染,將病毒代碼放入宿主程序
      • 觸發(fā)模塊

        • 檢查預(yù)定觸發(fā)條件是否滿足。
        • 如果滿足,返回真值。
        • 如果不滿足,返回假值
      • 破壞模塊(表現(xiàn)模塊)

      • 主控模塊

        • 調(diào)用感染模塊,進(jìn)行感染。
        • 調(diào)用觸發(fā)模塊,接受其返回值。
        • 如果返回真值,執(zhí)行破壞模塊。
        • 如果返回假值,執(zhí)行后續(xù)程序。
    • 計(jì)算機(jī)病毒的生命周期

      • 感染
      • 潛伏
      • 繁殖
      • 發(fā)作
    • 計(jì)算機(jī)病毒的傳播機(jī)制

      • 病毒入侵宿主程序的基本方式有兩種: 替代方式鏈接方式。

      • 病毒的宿主程序可分為兩類: 操作系統(tǒng)應(yīng)用程序

      • 交叉感染

      • 寄生感染

        • 插入感染
        • 逆插入感染
      • 沒有入口點(diǎn)的感染

      • 零長度感染

    • 計(jì)算機(jī)病毒的觸發(fā)機(jī)制

    • 計(jì)算機(jī)病毒的破壞機(jī)制

    典型的計(jì)算機(jī)病毒

    DOS病毒

    Win32 PE病毒

    宏病毒

    腳本病毒

    HTML病毒

    蠕蟲

    病毒的隱藏技術(shù)

    隱藏技術(shù)主要有:

    • 反跟蹤技術(shù)
    • 避開修改中斷向量
    • 請(qǐng)求在內(nèi)存中的合法身份
    • 維持宿主程序的外部特性
    • 不使用明顯的感染標(biāo)志

    花指令

    ?

    病毒的多態(tài)

    多態(tài)技術(shù)中的密鑰和解密代碼都變化多端,多態(tài)技術(shù)將對(duì)解密代碼進(jìn)行等價(jià)指令替換、寄存器替換、插入垃圾指令或者隨機(jī)調(diào)換指令的前后位置(有些指令的前后位置調(diào)換之后不影響代碼功能)等變化,以產(chǎn)生功能相同但是代碼截然不同的解密代碼

    多態(tài)引擎的組成:

    • 指令位置變換模塊
    • 寄存器變換模塊
    • 指令擴(kuò)展模塊
    • 指令收縮模塊
    • 等價(jià)指令替換模塊
    • 無用指令隨機(jī)插入
    • 垃圾指令插

    ? ??

  17. 木馬

    一個(gè)典型的特洛伊木馬(程序)通常具有以下四個(gè)特點(diǎn):

    • 有效性
    • 隱蔽性
    • 頑固性
    • 易植入性

    此外,木馬還具有以下輔助型特點(diǎn):

    • 自動(dòng)運(yùn)行
    • 欺騙性
    • 自動(dòng)恢復(fù)
    • 功能的特殊

    ?

    木馬的實(shí)現(xiàn)原理與攻擊步驟

    • 木馬實(shí)現(xiàn)原理

      • 本質(zhì)上說,木馬大多都是網(wǎng)絡(luò)客戶/服務(wù)(Client/Server)程序的組合。常由一個(gè)攻擊者控制的客戶端程序和一個(gè)運(yùn)行在被控計(jì)算機(jī)端的服務(wù)端程序組成

      • 當(dāng)攻擊者要利用“木馬”進(jìn)行網(wǎng)絡(luò)入侵,一般都需完成如下環(huán)節(jié):

        • 向目標(biāo)主機(jī)植入木馬
        • 啟動(dòng)和隱藏木馬
        • 服務(wù)器端(目標(biāo)主機(jī))和客戶端建立連接
        • 進(jìn)行遠(yuǎn)程控制
    • 植入技術(shù)

      • 主動(dòng)植入

        • 本地安裝

        • 遠(yuǎn)程安裝

          • 利用系統(tǒng)自身漏洞植入
          • 利用第三方軟件漏洞植入
      • 被動(dòng)植入

        • 網(wǎng)頁瀏覽植入
        • 利用電子郵件植入
        • 利用網(wǎng)絡(luò)下載植入
        • 利用即時(shí)通工具植入
        • 與其它程序捆綁
        • 利用移動(dòng)存儲(chǔ)設(shè)備植入
    • 自動(dòng)加載技術(shù)

      • 在Windows系統(tǒng)中木馬程序的自動(dòng)加載技術(shù)主要有:

        • 修改系統(tǒng)文件
        • 修改系統(tǒng)注冊(cè)表
        • 添加系統(tǒng)服務(wù)
        • 修改文件打開關(guān)聯(lián)屬性
        • 修改任務(wù)計(jì)劃
        • 修改組策略
        • 利用系統(tǒng)自動(dòng)運(yùn)行的程序
        • 修改啟動(dòng)文件夾
        • 替換系統(tǒng)DLL
    • 隱藏技術(shù)

      • 隱蔽性是木馬程序與其它程序的重要區(qū)別
      • 偽隱藏、真隱藏
      • 設(shè)置窗口不可見 (從任務(wù)欄中隱藏)
      • 把木馬程序注冊(cè)為服務(wù) (從進(jìn)程列表中隱藏)
      • 欺騙查看進(jìn)程的函數(shù) (從進(jìn)程列表中隱藏)
      • 使用可變的高端口 (端口隱藏技術(shù))
      • 使用系統(tǒng)服務(wù)端口 (端口隱藏技術(shù))
      • 替換系統(tǒng)驅(qū)動(dòng)或系統(tǒng)DLL (真隱藏技術(shù))
      • 動(dòng)態(tài)嵌入技術(shù) (真隱藏技術(shù))
    • 連接技術(shù)

      • 反彈窗口的連接技術(shù):更容易通過防火墻
    • 監(jiān)控技術(shù)

      木馬的遠(yuǎn)程監(jiān)控功能概括起來有以下幾點(diǎn):

      • 獲取目標(biāo)機(jī)器信息
      • 記錄用戶事件
      • 遠(yuǎn)程操作

    ?

    木馬的防御技術(shù)

    • 木馬的檢測

      • 端口掃描和連接檢查
      • 檢查系統(tǒng)進(jìn)程
      • 檢查ini文件、注冊(cè)表和服務(wù)
      • 監(jiān)視網(wǎng)絡(luò)通訊
    • 木馬的清除與善后

    • 木馬的防范

      • 及時(shí)修補(bǔ)漏洞,安裝補(bǔ)丁
      • 運(yùn)行實(shí)時(shí)監(jiān)控程序
      • 培養(yǎng)風(fēng)險(xiǎn)意識(shí),不使用來歷不明的軟件
      • 即時(shí)發(fā)現(xiàn),即時(shí)清除

    木馬的發(fā)展趨勢

    • 跨平臺(tái)
    • 模塊化設(shè)計(jì)
    • 無連接木馬
    • 主動(dòng)植入
    • 木馬與病毒的融合

    ? ??

  18. 蠕蟲

    它與其他的病毒相比,具有傳染的主動(dòng)性

    計(jì)算機(jī)病毒是一段代碼,能把自身加到其它程序包括操作系統(tǒng)上。它不能獨(dú)立運(yùn)行,需要由它的宿主程序運(yùn)行來激活它”。

    Eugene H. Spafford對(duì)蠕蟲的定義:“計(jì)算機(jī)蠕蟲可以獨(dú)立運(yùn)行,并能把自身的一個(gè)包含所有功能的版本傳播到另外的計(jì)算機(jī)上”

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    ?

    ? ??

  19. 模糊測試

    模糊測試:在很多隨機(jī)的、不正常的輸入上運(yùn)行程序,找出程序?qū)@些輸入進(jìn)行響應(yīng)時(shí)的錯(cuò)誤行為(如崩潰、掛起)

    黑盒 fuzzing
    基于突變(mutation)的 fuzzing

    ?

    基于生成的 Fuzzing

    ?

    基于覆蓋(Coverage)的Fuzzing
    AFL:
    白盒Fuzzing
    ??
  20. 軟件保護(hù)技術(shù) ??

  21. 代碼混淆

    目標(biāo):阻止對(duì)軟件實(shí)施非授權(quán)的逆向分析

    核心方法: 語義保留的程序變換

    ?

    代碼混淆的可能性

    借鑒密碼學(xué)算法的安全模型。目標(biāo):可證明安全性

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    然而,“虛擬黑盒”式的混淆器真的可以實(shí)現(xiàn)嗎?

    研究結(jié)論: 不可能

    核心因素: 程序執(zhí)行與Oracle訪問有著本質(zhì)區(qū)別

    • 程序是對(duì)函數(shù)的簡明描述
    • Oracle訪問只給出函數(shù)的輸入-輸出映射關(guān)系
    • 函數(shù)的功能往往無法通過Oracle訪問的方式予以精確學(xué)習(xí)

    ?

    代碼混淆的實(shí)際能力

    • 做不到: 讓程序的執(zhí)行邏輯變得不可知
    • 做得到: 使程序的執(zhí)行邏輯變得難以理

    ?

    代碼混淆的方法

    不透明謂詞( opaque predicate)

    較強(qiáng)的構(gòu)造方法:基于3SAT問題 通過3SAT證明支配集是NPC問題 | 騎士的個(gè)人主頁 (samjjx.github.io)

    • 問題:證明顯示不透明謂詞在計(jì)算上是不安全的

    ?

    條件分支混淆

    方法:

    • 單向函數(shù)

    • 利用分析技術(shù)弱點(diǎn)

    • 利用神經(jīng)網(wǎng)絡(luò)

    ??
  22. 軟件防篡改

    目標(biāo):

    • 使得軟件的內(nèi)部邏輯無法被篡改
    • 當(dāng)篡改發(fā)生時(shí),完成自我診斷/修復(fù)

    意義: 阻止對(duì)軟件的破解

    方法:

    • 內(nèi)省自檢(introspection)

    • Oblivious Hashing 未察覺的哈希

    新場景:對(duì)抗app重打包

    ? ??

  23. 軟件混淆

    軟件胎記

    胎記”的實(shí)際含義

    • 一類對(duì)象的本質(zhì)特征
    • 與生俱來
    • 獨(dú)一無二

    ?

    軟件胎記的廣義安全價(jià)值

    • 反代碼剽竊(未經(jīng)授權(quán)使用共享庫,或違反協(xié)議使用開源代碼)
    • 檢測惡意代碼(特別是經(jīng)過各種偽裝保護(hù)的)
    • 檢測移動(dòng)app的重包裝

    構(gòu)造形式分類

    • 靜態(tài)/動(dòng)態(tài)(取決于胎記所依賴的特征類型)

    ?

    靜態(tài)構(gòu)造舉例:基于JAVA的棧行為模式

    動(dòng)態(tài)構(gòu)造1:基于執(zhí)行路

    動(dòng)態(tài)構(gòu)造2:基于程序內(nèi)的系統(tǒng)調(diào)用

    不懂呀

    ?

    軟件水印

    目標(biāo):在軟件中嵌入用于標(biāo)識(shí)其版權(quán)歸屬的秘密信息

    軟件水印的應(yīng)用形式

    • 反盜版 – 通過聲明版權(quán)
    • 反盜版 – 通過追溯盜版母盤的來源

    軟件水印的形式分類

    • 靜態(tài)/動(dòng)態(tài)(取決于水印的構(gòu)造方式)

    靜態(tài)構(gòu)造舉例:基本塊重排序

    靜態(tài)構(gòu)造舉例:寄存器占用重分配

    傳統(tǒng)動(dòng)態(tài)構(gòu)造1:基于動(dòng)態(tài)生成的圖對(duì)象

    傳統(tǒng)動(dòng)態(tài)構(gòu)造2:基于執(zhí)行路徑上的分支行為

    傳統(tǒng)動(dòng)態(tài)構(gòu)造3:基于多線程的同步

    ?

    傳統(tǒng)動(dòng)態(tài)構(gòu)造的問題1:

    • 與主程序的關(guān)聯(lián)性很弱
    • 往往具有顯著的模式/特征
    • 很難予以隱藏或偽裝

    一個(gè)特別的設(shè)計(jì):基于抽象解釋的水印

    • 在正常維度上,水印組件服務(wù)于載體軟件的原本功能
    • 在預(yù)設(shè)的秘密維度上,水印組件展示出隱藏的信息

    改進(jìn)動(dòng)態(tài)構(gòu)造1:利用返回導(dǎo)向編程

    改進(jìn)動(dòng)態(tài)構(gòu)造2:利用代碼混淆

    傳統(tǒng)動(dòng)態(tài)構(gòu)造的問題2:

    改進(jìn)動(dòng)態(tài)構(gòu)造3:利用神經(jīng)網(wǎng)絡(luò)

    軟件水印仍然存在的不足之處

    • 沒有在真正意義上實(shí)現(xiàn)隱蔽性
    • 缺乏有效的定性/定量評(píng)估標(biāo)準(zhǔn)(特別是隱蔽性這一安全度量)
    • 數(shù)據(jù)嵌入率很差
    • 沒有解決工業(yè)化、自動(dòng)化實(shí)施的問題

    ?

    ? ??

  24. 九、Web 安全

    10-Web-sec.pdf

    10-web-sec-companion-pu.pptx

    輸入驗(yàn)證: SQL注入攻擊

    看PPT吧

    脆弱性: 任意編程語言實(shí)現(xiàn)的連接到SQL數(shù)據(jù)庫的應(yīng)用程序都可能存在

    ?

    輸入驗(yàn)證: 跨站腳本 (XSS, Cross‐Site Scripting)

    看PPT吧

    脆弱性:用戶輸入, 可能包含可執(zhí)行內(nèi)容 (JavaScript, VBscript, ActiveX, …)被彈回到一個(gè)web頁面

    ? ??

  25. 輸入驗(yàn)證: SQL注入攻擊

    看PPT吧

    脆弱性: 任意編程語言實(shí)現(xiàn)的連接到SQL數(shù)據(jù)庫的應(yīng)用程序都可能存在

    ? ??

  26. 輸入驗(yàn)證: 跨站腳本 (XSS, Cross‐Site Scripting)

    看PPT吧

    脆弱性:用戶輸入, 可能包含可執(zhí)行內(nèi)容 (JavaScript, VBscript, ActiveX, …)被彈回到一個(gè)web頁面

    ? ??

  27. 代碼重用攻擊: Return to libc

    危險(xiǎn)庫函數(shù)如 system()

    攻擊者構(gòu)造合適的參數(shù)(在棧上, 返回指令指針的上方)

    • 在x64架構(gòu)上,還需要更多的工作:設(shè)置參數(shù)傳遞寄存器的值

    函數(shù)返回,庫函數(shù)得到執(zhí)行

    • 例如:execve(“/bin/sh”)

    甚至可以鏈接兩個(gè)庫函數(shù)調(diào)用

    具體地

    • 攻擊者用一個(gè)溢出填充buffer:

      • 更改棧上保存的ebp為一個(gè)合適地址
      • 更改返回指令指針為一個(gè)欲執(zhí)行的庫函數(shù)的地址
      • 寫一個(gè)占位符值(庫函數(shù)會(huì)認(rèn)為其是返回地址,如果想利用它調(diào)用第二個(gè)庫函數(shù), 應(yīng)寫入第二個(gè)庫函數(shù)的地址)
      • 寫一個(gè)或多個(gè)要傳遞給此庫函數(shù)的參數(shù)
    • 當(dāng)被攻擊的函數(shù)返回時(shí), 恢復(fù)(更改過的)ebp, 然后pop更改后的返回地址到eip, 從而開始執(zhí)行庫函數(shù)代碼

    • 因?yàn)閹旌瘮?shù)相信它已被調(diào)用, 故會(huì)將棧頂當(dāng)前值(占位符)作為它自己棧幀的返回指令指針, 之上是參數(shù)

    • 最終會(huì)在占位符位置的下方創(chuàng)建起一個(gè)新的棧幀 (對(duì)應(yīng)于庫函數(shù)的執(zhí)行)

    • 根據(jù)庫函數(shù)參數(shù)類型以及庫函數(shù)對(duì)參數(shù)的解釋方式, 攻擊者可能需要準(zhǔn)確地知道參數(shù)地址以做溢出寫

    ? ??

  28. 木馬的實(shí)現(xiàn)原理與攻擊步驟

    • 木馬實(shí)現(xiàn)原理

      • 本質(zhì)上說,木馬大多都是網(wǎng)絡(luò)客戶/服務(wù)(Client/Server)程序的組合。常由一個(gè)攻擊者控制的客戶端程序和一個(gè)運(yùn)行在被控計(jì)算機(jī)端的服務(wù)端程序組成

      • 當(dāng)攻擊者要利用“木馬”進(jìn)行網(wǎng)絡(luò)入侵,一般都需完成如下環(huán)節(jié):

        • 向目標(biāo)主機(jī)植入木馬
        • 啟動(dòng)和隱藏木馬
        • 服務(wù)器端(目標(biāo)主機(jī))和客戶端建立連接
        • 進(jìn)行遠(yuǎn)程控制
    • 植入技術(shù)

      • 主動(dòng)植入

        • 本地安裝

        • 遠(yuǎn)程安裝

          • 利用系統(tǒng)自身漏洞植入
          • 利用第三方軟件漏洞植入
      • 被動(dòng)植入

        • 網(wǎng)頁瀏覽植入
        • 利用電子郵件植入
        • 利用網(wǎng)絡(luò)下載植入
        • 利用即時(shí)通工具植入
        • 與其它程序捆綁
        • 利用移動(dòng)存儲(chǔ)設(shè)備植入
    • 自動(dòng)加載技術(shù)

      • 在Windows系統(tǒng)中木馬程序的自動(dòng)加載技術(shù)主要有:

        • 修改系統(tǒng)文件
        • 修改系統(tǒng)注冊(cè)表
        • 添加系統(tǒng)服務(wù)
        • 修改文件打開關(guān)聯(lián)屬性
        • 修改任務(wù)計(jì)劃
        • 修改組策略
        • 利用系統(tǒng)自動(dòng)運(yùn)行的程序
        • 修改啟動(dòng)文件夾
        • 替換系統(tǒng)DLL
    • 隱藏技術(shù)

      • 隱蔽性是木馬程序與其它程序的重要區(qū)別
      • 偽隱藏、真隱藏
      • 設(shè)置窗口不可見 (從任務(wù)欄中隱藏)
      • 把木馬程序注冊(cè)為服務(wù) (從進(jìn)程列表中隱藏)
      • 欺騙查看進(jìn)程的函數(shù) (從進(jìn)程列表中隱藏)
      • 使用可變的高端口 (端口隱藏技術(shù))
      • 使用系統(tǒng)服務(wù)端口 (端口隱藏技術(shù))
      • 替換系統(tǒng)驅(qū)動(dòng)或系統(tǒng)DLL (真隱藏技術(shù))
      • 動(dòng)態(tài)嵌入技術(shù) (真隱藏技術(shù))
    • 連接技術(shù)

      • 反彈窗口的連接技術(shù):更容易通過防火墻
    • 監(jiān)控技術(shù)

      木馬的遠(yuǎn)程監(jiān)控功能概括起來有以下幾點(diǎn):

      • 獲取目標(biāo)機(jī)器信息
      • 記錄用戶事件
      • 遠(yuǎn)程操作

    ? ??

  29. 計(jì)算機(jī)病毒的分類

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    我們針對(duì)狹義上的病毒,按照不同的標(biāo)準(zhǔn)對(duì)它進(jìn)行分類。

    • 按照計(jì)算機(jī)病毒攻擊的對(duì)象或系統(tǒng)平臺(tái)分類

      • 攻擊DOS系統(tǒng)的病毒
      • 攻擊WINDOWS系統(tǒng)的病毒
      • 攻擊UNIX 系統(tǒng)的病毒
      • 攻擊OS/2系統(tǒng)的病毒
      • 其它操作系統(tǒng)上的病毒:如手機(jī)病毒
    • 按照計(jì)算病毒的攻擊目標(biāo)機(jī)類型分類:

      • 攻擊微型計(jì)算機(jī)的病毒
      • 攻擊小型計(jì)算機(jī)的病毒
      • 攻擊工作站的病毒
    • 按照計(jì)算機(jī)病毒的鏈接方式分類

      • 源碼型病毒
      • 嵌入型病毒
      • 外殼型病毒:包圍在主程序的四周
      • 操作系統(tǒng)型病毒
    • 按照計(jì)算機(jī)病毒的破壞情況分類

      • 良性病毒:是不包含有對(duì)計(jì)算機(jī)系統(tǒng)產(chǎn)生直接破壞作用的代碼的計(jì)算機(jī)病毒。
      • 惡性病毒:指在代碼中包含有損傷和破壞計(jì)算機(jī)系統(tǒng)的操作
    • 按傳播媒介來分類

      • 單機(jī)病毒:單機(jī)病毒的載體是磁盤或光盤。常見的是通過從軟盤傳入硬盤,感染系統(tǒng)后,再傳染其它軟盤。軟盤又感染其它系統(tǒng)。
      • 網(wǎng)絡(luò)病毒:網(wǎng)絡(luò)為病毒提供了最好的傳播途徑。網(wǎng)絡(luò)病毒利用計(jì)算機(jī)網(wǎng)絡(luò)的協(xié)議或命令以及Email等進(jìn)行傳播,常見的是通過QQ、 BBS、Email、 FTP、 Web等傳播

    計(jì)算機(jī)病毒的命名

    雖然每個(gè)反病毒公司的命名規(guī)則都不太一樣,但大體都是采用一個(gè)統(tǒng)一的命名方法來命名的。?一般格式為: <病毒前綴>.<病毒名>.<病毒后綴>

    ?

    ? ??

  30. 病毒的隱藏技術(shù)

    隱藏技術(shù)主要有:

    • 反跟蹤技術(shù)
    • 避開修改中斷向量
    • 請(qǐng)求在內(nèi)存中的合法身份
    • 維持宿主程序的外部特性
    • 不使用明顯的感染標(biāo)志
    ??
  31. 病毒的多態(tài)

    多態(tài)技術(shù)中的密鑰和解密代碼都變化多端,多態(tài)技術(shù)將對(duì)解密代碼進(jìn)行等價(jià)指令替換、寄存器替換、插入垃圾指令或者隨機(jī)調(diào)換指令的前后位置(有些指令的前后位置調(diào)換之后不影響代碼功能)等變化,以產(chǎn)生功能相同但是代碼截然不同的解密代碼

    多態(tài)引擎的組成:

    • 指令位置變換模塊
    • 寄存器變換模塊
    • 指令擴(kuò)展模塊
    • 指令收縮模塊
    • 等價(jià)指令替換模塊
    • 無用指令隨機(jī)插入
    • 垃圾指令插

    ? ??

  32. Man-At-The-End 攻擊 (MATE)

    攻擊者: 位于終端,對(duì)終端計(jì)算資源有最高控制權(quán)限

    攻擊對(duì)象:安裝在受控終端上的軟件程序

    攻擊目的: 獲悉、篡改軟件的內(nèi)部邏輯

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    ? ??

  33. x86 Linux 系統(tǒng)的線性地址空間分層

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)

    • 最大 3G ?

    ? ?? ??

  34. System V AMD64 ABI 調(diào)用慣例 ?? ??

  35. 劫持全局偏移量表(GOT)中的函數(shù)指針, 被動(dòng)態(tài)鏈接函數(shù)所使用 ?? ??文章來源地址http://www.zghlxwxcb.cn/news/detail-479445.html

到了這里,關(guān)于【軟件與系統(tǒng)安全】筆記與期末復(fù)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【信息系統(tǒng)安全/計(jì)算機(jī)系統(tǒng)安全】期末復(fù)習(xí)(HITWH)

    【信息系統(tǒng)安全/計(jì)算機(jī)系統(tǒng)安全】期末復(fù)習(xí)(HITWH)

    信息系統(tǒng)安全期末復(fù)習(xí)重點(diǎn)總結(jié): 目錄 第一章 緒論 第二章 安全認(rèn)證 填空題 第三章 訪問控制 填空題 第四章 安全審計(jì) 填空題 第五章 Windows操作系統(tǒng)安全 填空題 第六章 Linux操作系統(tǒng)安全 填空題 第七章 數(shù)據(jù)庫系統(tǒng)安全 填空題 第八章 信息系統(tǒng)安全測評(píng) 第九章 可信計(jì)算 ?

    2024年02月09日
    瀏覽(42)
  • 《Linux系統(tǒng)及應(yīng)用》期末重點(diǎn)復(fù)習(xí)筆記

    整理不容易,求點(diǎn)贊關(guān)注~ 1.Linux系統(tǒng)的特點(diǎn):多用戶多任務(wù)、開源、安全、穩(wěn)定 2.Linux內(nèi)核版本和發(fā)行版本的區(qū)別 (1)內(nèi)核版本只有Linux內(nèi)核部分,安裝完后,用戶界面、軟件都沒有 (2)發(fā)行版本是在內(nèi)核版本的基礎(chǔ)上,加入用戶界面,各種軟件,比如Ubuntu、CenterOS等 3.內(nèi)核

    2024年02月09日
    瀏覽(43)
  • 軟件與系統(tǒng)安全復(fù)習(xí)

    軟件與系統(tǒng)安全復(fù)習(xí)

    課程復(fù)習(xí)內(nèi)容 其中 威脅模型 對(duì)于影響系統(tǒng)安全的所有信息的結(jié)構(gòu)化表示 本質(zhì)上,是從安全的視角解讀系統(tǒng)與其環(huán)境 用于理解 攻擊者 什么可信、什么不可信 攻擊者的動(dòng)機(jī)、資源、能力;攻擊造成的影響 具體場景 接受客戶端請(qǐng)求的Web服務(wù)器 可信:Web服務(wù)器 不可信:客戶端

    2024年02月09日
    瀏覽(15)
  • 【軟件工程】《軟件工程》期末復(fù)習(xí)提綱

    【軟件工程】《軟件工程》期末復(fù)習(xí)提綱

    《軟件工程》期末復(fù)習(xí)提綱 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 第十章 第十一章 第十二章 第十三章 第十四章 小題參考 大題參考 1.在下列選項(xiàng)中,( )不是軟件的特征。 A.系統(tǒng)性與復(fù)制性 ????????B.可靠性與一致性 C.抽象性與智能性??

    2024年01月17日
    瀏覽(22)
  • 軟件工程 | 期末復(fù)習(xí)

    軟件工程 | 期末復(fù)習(xí)

    1、軟件發(fā)展經(jīng)歷三個(gè)階段: 程序設(shè)計(jì) 、 程序系統(tǒng) 、 軟件工程 2、軟件的概念:軟件是計(jì)算機(jī)系統(tǒng)與硬件相互依存的另一部分,包括 程序 、 數(shù)據(jù) 以及相關(guān) 文檔 的完整集合,軟件=程序+數(shù)據(jù)+文檔 數(shù)據(jù) :使程序能夠適當(dāng)處理信息的數(shù)據(jù)結(jié)構(gòu) 程序 :能夠完成預(yù)定功能和性能

    2024年02月05日
    瀏覽(31)
  • 軟件測試期末復(fù)習(xí)

    軟件測試期末復(fù)習(xí)

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 15選擇 2分 15判斷 1分 5填空 空多 3簡答 4分 半期 1綜合 9分 等價(jià)類劃分法 題目簡單 看例題 12多選 2分 共51道題 提示:以下是本篇文章正文內(nèi)容,下面復(fù)習(xí)資料可供參考 1.軟件生存期的瀑布模型的基本流程

    2023年04月17日
    瀏覽(13)
  • 軟件測試期末復(fù)習(xí)題庫

    一、選擇題 1.在軟件測試階段,測試步驟按次序可以劃分為以下幾步:( ??A ??) A、單元測試、集成測試、系統(tǒng)測試、驗(yàn)收測試 B、驗(yàn)收測試、單元測試、系統(tǒng)測試、集成測試 C、單元測試、集成測試、驗(yàn)收測試、系統(tǒng)測試 D、系統(tǒng)測試、單元測試、集成測試、驗(yàn)收測試 2

    2024年02月03日
    瀏覽(13)
  • 軟件測試期末復(fù)習(xí)(超詳細(xì)?。? decoding=

    軟件測試期末復(fù)習(xí)(超詳細(xì)!)

    黑盒測試 :測試人員僅基于輸入和輸出的規(guī)格說明,而不考慮內(nèi)部代碼和結(jié)構(gòu)的一種軟件測試方法。 白盒測試 :測試人員基于代碼邏輯和結(jié)構(gòu)來設(shè)計(jì)測試用例,以驗(yàn)證程序的正確性、覆蓋率和性能的一種測試方法。 集成測試 :測試軟件系統(tǒng)中不同模塊之間的集成和交互,

    2024年02月12日
    瀏覽(20)
  • 軟件工程-期末復(fù)習(xí)題

    軟件工程-期末復(fù)習(xí)題

    第1章軟件工程概述 1、軟件的概念及特點(diǎn) 概念: 計(jì)算機(jī)軟件是由專業(yè)人員開發(fā)并長期維護(hù)的軟件產(chǎn)品。完整的軟件產(chǎn)品包括了在各種不同容量和體系結(jié)構(gòu)計(jì)算機(jī)上的可執(zhí)行的程序,運(yùn)行過程中產(chǎn)生的各種結(jié)果,以及以硬復(fù)制和電子表格等多種方式存在的軟件文檔 特點(diǎn): 1)

    2024年02月13日
    瀏覽(94)
  • 軟件測試與質(zhì)量期末復(fù)習(xí)

    軟件測試與質(zhì)量期末復(fù)習(xí)

    軟件缺陷定義: 軟件缺陷就是軟件產(chǎn)品中存在的問題,最終表現(xiàn)為用戶所需要的功能沒有完全實(shí)現(xiàn),不能滿足或不能全部滿足用戶的需求。 軟件缺陷表現(xiàn)形式 設(shè)計(jì)不合理,不是用戶所期望的風(fēng)格、格式 部分實(shí)現(xiàn)了軟件某項(xiàng)功能 系統(tǒng)崩潰、界面混亂 數(shù)據(jù)結(jié)果不正確、精度不

    2024年02月12日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包