12
© 2016 Software Engineering Consortium LAB FOR SECURE PROGRAMMING IN C 1

安全程式設計 C語言

Embed Size (px)

Citation preview

Page 1: 安全程式設計 C語言

© 2016 Software Engineering Consortium

LAB FOR SECURE PROGRAMMING IN C

1

Page 2: 安全程式設計 C語言

© 2016 Software Engineering Consortium

Lab環境

Linux-Ubuntu14.04

32bits

gcc gdb

• sudo apt-get install gcc-multilib

hexedit

• sudo apt-get install hexedit

2

Page 3: 安全程式設計 C語言

© 2016 Software Engineering Consortium

Lab說明

Lab1: 以Flawfinder對程式碼進行安全分析

Lab2: 根據Lab1找到的安全漏洞,嘗試攻擊程式

Lab2-1:以Stack Overflow攻擊程式

Lab2-2:以Array Indexing Error攻擊程式

Lab2-3:以Format String Bugs攻擊程式

Lab3: 嘗試修改程式碼,避免遭受攻擊

3

Page 4: 安全程式設計 C語言

© 2016 Software Engineering Consortium

補充資料:Flawfinder介紹

4

Page 5: 安全程式設計 C語言

© 2016 Software Engineering Consortium

Flawfinder簡介

http://www.dwheeler.com/flawfinder/

容易安裝與使用的C與C++程式碼安全分析工具

條列可能的安全問題

根據錯誤嚴重等級排序各個分析出的安全問題

使用環境

Unix-based系統• sudo apt-get install flawfinder

安裝Cygwin 的Windows系統

指令

flawfinder directory_with_source_code

• 例如:flawfinder test1.c 5

Page 6: 安全程式設計 C語言

© 2016 Software Engineering Consortium

範例程式碼(000.c)

6

Page 7: 安全程式設計 C語言

© 2016 Software Engineering Consortium

Flawfinder(1)

以”flawfinder 000.c”對000.c進行安全分析

程式名稱

錯誤等級

問題區域

危險函數/參數

程式碼行碼

錯誤說明

7

Page 8: 安全程式設計 C語言

© 2016 Software Engineering Consortium

Flawfinder(2)

8

Page 9: 安全程式設計 C語言

© 2016 Software Engineering Consortium

Flawfinder(3)

Hits:找到錯誤數量

Lines analyzed:分析的程式碼行數與所耗費時間

Physical Source Lines of Code (SLOC):原始碼行數

Hits@level:各等級錯誤數量

Hits@level+:各等級錯誤數量累計

Hits/KSLOC@level:錯誤數量/來源程式碼(千行)

Minimun risk level:最小風險水平 9

Page 10: 安全程式設計 C語言

© 2016 Software Engineering Consortium

補充資料:GDB指令介紹

10

Page 11: 安全程式設計 C語言

© 2016 Software Engineering Consortium

GDB指令(1)

run (或r):執行程式

r 555 666 (以555和666作為輸入,並執行程式)

disass:反組譯函數,檢視各個組合語言指令在記憶體中的位址

Ex: disass main (檢視main()的組合語言指令以及記憶體位置)

breakpoint (或b, bre, break):設定中斷點

Ex1: b 19 (在程式碼原始碼中的第19行設定中斷點)

Ex2: b *0x080485bc (在記憶體位置0x080485bc的指令設定中斷點)

c:繼續執行程式直到下一個中斷點,或是直到程式結束

n:執行下一行程式碼(遇到函數呼叫,會讓函數執行完return)

s:執行下一行程式碼(遇到函數呼叫,會讓進入函數)11

Page 12: 安全程式設計 C語言

© 2016 Software Engineering Consortium

GDB指令(2)

print: 檢視變數的內容

Ex1: print i (檢視變數i的內容)

Ex2: print &I (檢視存放變數i的記憶體位址)

x/32wx:印出 32個 word (4 bytes) 的記憶體內容

x/32wx $esp (印出$esp這個暫存器所指記憶體位址起的32個words記憶體內容)

12