【軟件與系統(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博客
課程資料
?
- 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)安全基礎(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)用
?
==**具體地**==
* 攻擊者用一個(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 代碼重用
**代碼重用與代碼注入的協(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í)行被注入的代碼
?
?
-
威脅模型
威脅模型(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ā)生 ??
-
安全策略與策略執(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) ??
-
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)存管理:分段(必須)+ 分頁(可選)
程序線性地址空間 ≤4GB, 物理地址空間 ≤64GB
每個(gè)段最大 232 字節(jié), IA-32 程序最多使用 16383 個(gè)段
?
x86 Linux 系統(tǒng)的線性地址空間分層
- 最大 3G ?
? ??
-
-
四、內(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)
覆寫返回指令指針
代碼注入
將 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
- 如何做到? 當(dāng)前程序通過一個(gè) stub(PLT, Procedure Linkage Table )調(diào)用“execve”, PLT 在鏈接時(shí)檢索 GOT (Global Offset Table)中的地址集合(請(qǐng)回憶動(dòng)態(tài)鏈接過程)
?
?
整數(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ì)修改雙向鏈表
移除一個(gè)塊
攻擊 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)
格式化字符串中的“
%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ù)
通過提供一個(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
- 小心其他的引用:
%s
和sprintf
能夠被用于構(gòu)造棧內(nèi)容披露攻擊 - 編譯器支持printf參數(shù)與格式化字符串的匹配檢查
? ??
-
緩沖區(qū)溢出:棧溢出(stack smashing)
“x86 Linux 系統(tǒng)的線性地址空間分層”33
“System V AMD64 ABI 調(diào)用慣例”34
緩沖區(qū)溢出可被利用于修改:
- 棧上的: 返回指令指針, 函數(shù)指針, 局部變量. . .
- 堆數(shù)據(jù)結(jié)構(gòu)
覆寫返回指令指針
代碼注入
將 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
- 如何做到? 當(dāng)前程序通過一個(gè) stub(PLT, Procedure Linkage Table )調(diào)用“execve”, PLT 在鏈接時(shí)檢索 GOT (Global Offset Table)中的地址集合(請(qǐng)回憶動(dòng)態(tài)鏈接過程)
?
? ??
-
堆溢出
【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ì)修改雙向鏈表
移除一個(gè)塊
攻擊 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
?
? ??
-
格式化字符串攻擊
能夠?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ù)
通過提供一個(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
- 小心其他的引用:
%s
和sprintf
能夠被用于構(gòu)造棧內(nèi)容披露攻擊 - 編譯器支持printf參數(shù)與格式化字符串的匹配檢查
? ??
-
五、內(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);
有時(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), W⊕X
能夠阻止代碼注入攻擊
很多緩沖區(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)用
?
具體地
-
攻擊者用一個(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 代碼重用
代碼重用與代碼注入的協(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 集合
正常機(jī)器指令序列
ROP執(zhí)行
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í)別攻擊面: 程序從信道獲得輸入
- 最小化攻擊面
- 將所有輸入都看作潛在惡意的
? ??
-
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);
有時(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ǔ)
- 使得攻擊者可以向棧或堆注入代碼, 而棧和堆原本只應(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), W⊕X
能夠阻止代碼注入攻擊
很多緩沖區(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ù)的地址替換返回地址 ?? ??
-
代碼注入 vs 代碼重用
代碼重用與代碼注入的協(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í)行被注入的代碼
?
? ??
-
-
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)棧在哪里
?
? ?? ??
-
-
ROP 面向返回的編程
面向返回的編程
- 執(zhí)行任意行為, 不需要注入代碼
- 聯(lián)合現(xiàn)有的代碼片段 (gadgets)
- 一系列圖靈完全的 gadgets, 及一種串聯(lián)這些 gadgets 的方法
- 現(xiàn)有的展示已能針對(duì)小程序(如16KB)找到圖靈完全的 gadgets 集合
正常機(jī)器指令序列
ROP執(zhí)行
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)棧在哪里
?
? ?? ??
-
六、惡意代碼的機(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ī)病毒的分類
我們針對(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ī)病毒程序模塊劃分
-
感染模塊
- 尋找一個(gè)可執(zhí)行文件。
- 檢查該文件中是否有感染標(biāo)記。
- 如果沒有感染標(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ī)上”
?
?
? ??
-
病毒
計(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ī)病毒的分類
我們針對(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ī)病毒程序模塊劃分
-
感染模塊
- 尋找一個(gè)可執(zhí)行文件。
- 檢查該文件中是否有感染標(biāo)記。
- 如果沒有感染標(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ī)插入
- 垃圾指令插
? ??
-
木馬
一個(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)植入
- 木馬與病毒的融合
? ??
-
蠕蟲
它與其他的病毒相比,具有傳染的主動(dòng)性
計(jì)算機(jī)病毒是一段代碼,能把自身加到其它程序包括操作系統(tǒng)上。它不能獨(dú)立運(yùn)行,需要由它的宿主程序運(yùn)行來激活它”。
Eugene H. Spafford對(duì)蠕蟲的定義:“計(jì)算機(jī)蠕蟲可以獨(dú)立運(yùn)行,并能把自身的一個(gè)包含所有功能的版本傳播到另外的計(jì)算機(jī)上”
?
? ??
-
模糊測試
模糊測試:在很多隨機(jī)的、不正常的輸入上運(yùn)行程序,找出程序?qū)@些輸入進(jìn)行響應(yīng)時(shí)的錯(cuò)誤行為(如崩潰、掛起)
黑盒 fuzzing
基于突變(mutation)的 fuzzing
?
基于生成的 Fuzzing
?
基于覆蓋(Coverage)的Fuzzing
AFL:
白盒Fuzzing
?? -
軟件保護(hù)技術(shù) ??
-
代碼混淆
目標(biāo):阻止對(duì)軟件實(shí)施非授權(quán)的逆向分析
核心方法: 語義保留的程序變換
?
代碼混淆的可能性
借鑒密碼學(xué)算法的安全模型。目標(biāo):可證明安全性
然而,“虛擬黑盒”式的混淆器真的可以實(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ò)
-
軟件防篡改
目標(biāo):
- 使得軟件的內(nèi)部邏輯無法被篡改
- 當(dāng)篡改發(fā)生時(shí),完成自我診斷/修復(fù)
意義: 阻止對(duì)軟件的破解
方法:
-
內(nèi)省自檢(introspection)
-
Oblivious Hashing 未察覺的哈希
新場景:對(duì)抗app重打包
? ??
-
軟件混淆
軟件胎記
胎記”的實(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í)施的問題
?
? ??
-
九、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頁面
? ??
-
輸入驗(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頁面
? ??
-
代碼重用攻擊: 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ù)地址以做溢出寫
? ??
-
木馬的實(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)程操作
? ??
-
-
計(jì)算機(jī)病毒的分類
我們針對(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)一的命名方法來命名的。?一般格式為: <病毒前綴>.<病毒名>.<病毒后綴>
?
? ??
-
-
病毒的隱藏技術(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ī)插入
- 垃圾指令插
? ??
-
Man-At-The-End 攻擊 (MATE)
攻擊者: 位于終端,對(duì)終端計(jì)算資源有最高控制權(quán)限
攻擊對(duì)象:安裝在受控終端上的軟件程序
攻擊目的: 獲悉、篡改軟件的內(nèi)部邏輯
? ??
-
x86 Linux 系統(tǒng)的線性地址空間分層
- 最大 3G ?
? ?? ??
-
System V AMD64 ABI 調(diào)用慣例 ?? ??文章來源:http://www.zghlxwxcb.cn/news/detail-479445.html
-
劫持全局偏移量表(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)!