# 資安實務-多元選修 ## 目錄 Catalogue :::warning ### 第一章:密碼學-資安體驗 * Big5 編碼 * GB 18030 編碼 * Unicode編碼 * 中文編碼遇到的挑戰 ::: :::warning ### 第二章:隱寫術(待編輯) ::: :::warning ### 第三章:Python基礎語法 * 變數&資料型別 * 輸入輸出&算數運算子 * for & while迴圈 * if/else 條件判斷 * 資料型別 ::: :::warning ### 第四章:Linux * 基礎命令:From linux to CTF * CTF解題思維 ::: :::warning ### 第五章:pwntools * pwntools 使用 ::: :::warning ### 第六章:Web exploitation(待編輯) * web 基礎 * web 進階 ::: :::warning ### 第七章:Crypto * 古典密碼 * 現代密碼-加密演算法 * RSA解密範實例 ::: :::warning ### 第八章:系統安全(待編輯) ::: --- ## 第一章:密碼學-資安體驗 ### :memo: BIG5編碼 ### :rocket: 在華人地區相當普及的繁體中文編碼方式 :rocket: 由台灣資訊工業策進會規劃及設計 :rocket: 共收錄13000多字 >以兩個bytes來儲存一個字(若用3bytes儲存會造成無法對齊) >以「常用國語標準字體」作為主要根據來源 >>異體字大部分皆未收錄 >>多數系統因此在原本編碼外,另添加新字 :rocket: 發展與延伸 >由於各廠牌頻繁地自行造字,然版本不相容問題卻存在 >亂碼問題持續困擾使用者 >>在Unicode編碼系統推出後,逐漸取代BIG5編碼的地位 >>例如蘋果Mac Os系統、Windows系統、Microsoft 都轉而以Unicode編碼為主 ### ### BIG5編碼範例 ### | 編碼格式| 包含字詞 | | -------- | -------- | | 0x8140-0xA0FE | 自訂字元 | | 0xA140-0xA3BF | 標點符號、希臘字母 | | 0xA3C0-0xA3FE | 保留區(未開放編碼)| | 0xA440-0xC67E | 高使用頻率漢字| | 0xC6A1-0xC8FE | 自訂字元| | 0xC940-0xF9D5 | 次頻率使用漢字| | 0xF9D6-0xF9DC | 特殊擴充字| | 0xF9DD-0xFEFE | 自訂字元| ### ### :memo: GB 18030 編碼 ### :rocket: 在中國大陸作為主要編碼方式 :rocket: 由中華人民共和國資訊工業部電子工業標準化研究所研發 :rocket: 由中華人民共和國所制訂的字元集 :rocket: 中國規定凡國內所有軟體設備,皆需與GB編碼相容 :rocket: 共收錄約70000個漢字 >採用「變長多位元組」模式儲存字元,可以1bits,2bits,4bits貯存一個漢字 >編碼空間龐大為其最大優勢,最大可定義約16萬個字 >>不需自行定義即可支援中國少數民族的文字,日語、韓語,甚至Emoji文字 :rocket: 位元組之結構 >包含1byte 的ASCll碼、2bytes長度的GBK碼(中國早期編碼版本)以及4bytes的UTF-8碼 ### :memo: Unicode 編碼 ### :rocket:官方中文譯為「統一碼」,在台灣則俗稱「萬國碼」 :rocket:統整並為世界上多數語言進行編碼 :rocket:至今仍不斷增修中,累計已編碼共13萬字 :rocket:廣泛應用於現今電腦軟體,諸如Java等作業系統,皆以Unicode作為編碼 :rocket:「向下相容政策」:僅會增加新字元,而舊字元不會被刪除 :rocket: 編碼方式 >每個字元以2bytes儲存,並使用16位編碼空間 >因此得以儲存2^16個字(此空間應可儲存大多數世界上字) ### :memo: 中文編碼的問題 ### :rocket:由於資訊界中編碼方式繁多,且各有不同 :rocket:當不同電腦使用的內碼相異時,即會造成「衝碼」現象 :rocket:亂碼 >電腦無法正常顯示字元 >通常是由於電腦誤認不同的兩種編碼方式 >>最常發生的錯誤:電腦將GBK編碼誤認為BIG5編碼 > >解決方法:轉換編碼方式(可能需要多試幾次) >亦或是更改字體檔案 --- ## 第二章:隱寫術 ### :memo: 隱寫術(待編輯) --- ## 第三章:Python基礎語法 ### :memo:變數&資料型態 :rocket:與C++不同,變數無需宣告,可直接指派值 :rocket:不得以數字、英文、符號作為標題 :::info ```python= int #整數 float #浮點數 str #字串 ord #字串轉ASCII ``` ::: ### :memo: 輸入輸出&算術運算子 ```python= string = input() #輸入字串 num = int(input()) #將輸入強制轉換為整數 #input 資料讀到換行符號為止 print("輸出字元") #預設為換行 print("輸出字元",sep='分隔字元',end='結束字元') print("字元".format(參數)) #格式化輸出,以參數代替字元![](https://i.imgur.com/aMhMi0R.png) ``` ![](https://i.imgur.com/7S9ytIo.png) ![](https://i.imgur.com/vDV0m2l.png) ### :memo: for & while 迴圈 :rocket:for用於知道明確次數的重複時使用 :rocket: while用於不確定重複次數時,若符合條件式則會不斷重複,反之則跳出迴圈 ```python= 序列用法: for 變數 in range(起始值,終值,遞增值): 程式區塊 #起始值和遞增值可省,分別預設為0,1 字串用法: for 變數 in 字串: 程式區塊 #可用於檢測字元或ASCII編碼 while(條件式): 程式區塊 break #跳出迴圈 continue #執行下一層迴圈內容 ``` ```python= example1:#列出a,b兩數間3倍數的數量 a = int(input()) b = int(input()) count = 0 for i in range(a,b): if(i%3==0): count +=1 print(count) ``` ```python= example2:#跳出迴圈範例 for i in range(b): a,b = int(input()) if(a==b):break else:flag +=1 print(flag) ``` ### :memo: 資料型別 ```python= string #字串 #以單雙引號涵括 list #表列 #以[]將多筆資料涵括其中,用法與C++陣列相似 tuple #元組 #不能修改的list dict #字典 #儲存無序資料,多用於建表 set #集合 #儲存無序資料,且自動刪除重複元素 ``` --- ## 第四章:Linux :::warning ### :memo: Linux基礎命令 :rocket: Linux是一種作業系統,具有高度穩定性和安全性 :rocket: 程式碼完全公開,故各家有許多不同版本 :rocket: 本次使用Kali2021 ::: ### pwd 路徑為Linux中極為重要的一環 可使用**pwd**指令來顯示當前路徑 | 表示路徑的特殊符號 | 意義 | | ---------------- | ----------| | **/** | 根目錄 | | **~** | 家目錄 | | **.** | 當前目錄 | | **.\./** | 上一層目錄 | ### cd ```bash= cd [資料夾路徑] ``` **cd**切換當前資料夾路徑 >絕對路徑變換:直接打出路徑 >相對路徑變換: **.** 代表上層 ### ls ```bash= ls [參數] [資料夾路徑] ``` **ls**可列出指定目錄下所有的檔案和目錄 >參數 >> **-l** 以長列表顯示 >> **-a** 顯示所有檔案(包含隱藏檔案) ### wget ```bash= wget [url] ``` **wget**下載指定網站的檔案 通常搭配 **-O** 使用,得以命令檔名 ### echo ```bash= echo [參數] [字串] ``` **echo**可以輸出一行文字 舉例來說,要輸出 `HelloWorld` ```bash= echo "HelloWorld" ``` ### file ```bash= file [參數] [目標檔案路徑] ``` **file**用以查看目標檔案類型 >例如 **ELF** 即是可執行檔,用 ***./*** 執行 ### mkdir ```bash= mkdir [參數] [資料夾路徑] ``` **mkdir**這個指令可以建立資料夾 例如新增一個 `fellow` 的資料夾: ```bash= mkdir fellow ``` ### cat ```bash= cat [參數] [檔案路徑] ``` **cat** 會將指定檔案的內容合併起來輸出,語法如下: 例如,將 `Hello` 資料夾的內容 cat 出來: ```bash= cat Hello ``` ### strings ```bash= strings [參數] [檔案路徑] ``` **strings**將檔案所有可視字元輸出 ### ssh ```bash= ssh [參數] [帳號]@[IP] ``` **ssh**可以使用Terminal遠端連線外部主機 用參數 **-p** 控制port,預設為22port ### grep ```bash= grep [參數] [Patterns] [檔案路徑] ``` **grep** 可以從檔案當中搜尋指定的關鍵字並顯示 :::danger **使用範例:** ``` appps123 appps234 appcs345 MyFirstCTF{{}}}{}{{}}}{}}}{{}}{}} MyFirstCTF{{}{}}{}{}}{}}{{}} MyFirstCTF{{{}{{{}}{}}}{}{} MyFirstCTF{{{}{}}}}}{}{} MyFirstCTF{Y0U_gOt_thE_flag} ``` ::: 如果要找到包含 `MyFirstCTF` 的字串,可以這樣下指令: ```bash= grep "MyFirstCTF" Hello ``` **grep** 是大小寫敏感的,也就是大小寫是會被區分的。如果希望不分大小寫,可以加上參數 *-i* 通常與 **strings**或 **pipe** 共同使用 ### rm ```bash= rm [參數] [檔案或資料夾路徑] ``` **rm** 可以刪除檔案或是資料夾。如果要刪除資料夾,需要加上參數 *-r* 例如,刪除在桌面底下的 `tmp` 檔案: ```bash= rm tmp ``` ### find ```bash= find [起始路徑] [參數] [關鍵字] ``` **find** 可以讓我們尋找檔案或資料夾 例如,從家目錄搜尋檔案名稱為 `Hello` 的檔案: ### chmod **chmod** 可以將檔案的權限更新,如果是要更新資料夾的權限則需要加上參數 `-R`。 ```bash= chmod [參數] [權限] [檔案或資料夾路徑] ``` >Linux 的權限關係。 在 Linux 中,權限分成 **擁有者 (Owner)**、**群組 (Group)**、**群組外使用者 (Others)** 三種權限 *r* *w* *x* 分別表示了 **可讀**、**可寫**以及**可執行**。 例如修改 `tmp` 檔案的權限,針對 **擁有者** 新增 **執行** 的權限 ```bash= chmod u+x tmp ``` :::danger :rocket: 指令總整理 | 指令 | 說明 | 語法 | | ------------ | -------------------------------- | ------------------------------------------------------- | | **pwd** | 顯示當前所在路徑 | `pwd` | | **cd** | 切換路徑 | `cd [資料夾路徑]` | | **ls** | 列出資料夾檔案列表 | `ls [參數] [資料夾路徑]` | | | **echo** | 輸出一行文字 | `echo [參數] [字串]` | | **touch** | 修改檔案時間戳,可以新增空白檔案 | `touch [參數] [檔案路徑]` | | **mkdir** | 建立資料夾 | `mkdir [參數] [資料夾路徑]` | | | **cat** | 輸出指定檔案的內容 | `cat [參數] [檔案路徑]` | | **grep** | 輸出與關鍵字相符的檔案內容 | `grep [參數] [Patterns] [檔案路徑]` | | **rm** | 刪除檔案或資料夾 | `rm [參數] [檔案或資料夾路徑]` | | **mv** | 移動檔案或資料夾位置 | `mv [參數] [檔案或資料夾原路徑] [檔案或資料夾目標路徑]` | | **file** | 查看指定檔案的檔案類型 | `file [參數] [目標檔案路徑]` | | **find** | 尋找指定的檔案或資料夾 | `find [起始路徑] [參數] [關鍵字]` | | | **clear** | 清空 Terminal | `clear` | | **chmod** | 修改檔案權限 | `chmod [參數] [權限] [檔案或資料夾路徑]` | ::: --- :::danger ### :memo: CTF解題思維-Linux-檔案 :rocket: 若需要遠端加密連線,使用ssh再加上port :rocket: 使用wget下載網址 ```bash= / |──遠端加密連線,使用 ssh 再加上port │──遠端連線,使用 nc 連線 | |──使用wget下載網址 └──用ls-la查看檔案及權限 └──權限不足,chmod+權限 └──使用 file 查看檔案類型 └──依據不同檔案類型選擇開啟方式 └──EOF檔案:直接 ./檔案名 └──文字檔:直接cat 檔案 ``` ::: --- ## 第五章:PWN tools :::warning ### :memo: PWN tools :rocket: 一種由python開發的套件,得以讓使用者快速編寫漏洞 ::: :rocket: 可用nc或是ssh連線 ```bash= #nc r = remote(IP,port) #ssh r = ssh(host=‘IP‘, user=‘’, port= , password=‘’) ``` :rocket: 如何引入pwntools ```python= from pwn import * ``` :rocket: 傳送 ```python= send(payload) #傳送payload sendlone(payload) #傳送payload並換行 sendafter(some_string, payload) #接收到 some_string 後, 發送 payload sendlineafter(some_string, payload)#接收到 some_string 後, 發送 payload ``` :rocket: 接收 ```python= recvn(N) #接受 N 個字元 recvline() #接收一行資料 recvlines(N) #接收 N 行資料 recvuntil(some_string)#接收到 some_string 為止 ``` :rocket: 取得flag ```python= r.interactive() ``` --- ## 第六章:Web(待編輯) :::warning ### :memo: Web 基礎 ### :memo: Web 進階 ::: --- ## 第七章:Crypto :::warning ### :memo: Crypto 主要分為古典密碼和現代密碼兩部分: ::: :rocket:古典密碼 :rocket: CTF-RSA解密實例 :::info ```python= #RSA解密範例 #使用二分搜尋 from Crypto.Util.number import inverse, long_to_bytes L = 1 R = C ans = C while(L<=R): mid = (L+R)//2 if(mid**e<C): L = mid+1 elif(mid**e>C): R = mid-1 else: break msg = long_to_bytes(mid) print("解密後明文為: %s" %msg) ``` ::: :::info ```python= #三數的rsa解密 from Crypto.Util.number import inverse, long_to_bytes p = 2262150367 q = 3006300461 r = 12218233223644524650141958853163065112163255395621655741865064529020634406575730714768264558014607893896434523845321502371618344594488810317052606914954669 n = p*q*r phi = (p-1)*(q-1)*(r-1) e = 11 d = inverse(e,phi) c = 32392151763267291269610586564983347951891395196084251182633225594245167922176424232164117237142038355860036871811244158149537196288428230971760474130300660929743492107190512 m = pow(c, d, n) print(long_to_bytes(m)) ``` ::: :::info ```python= #e太小,n太大 !pip install gmpy2 from gmpy2 import iroot from Crypto.Util.number import inverse, long_to_bytes n = 1005098784594165848821832590501628403524802902674053382968470498538675288024873128424879364961488454145355936225677709124632789481770148984368708158164916266844271786072406765898627538801884748356080826075494258116818573097428235536790636847100997446916017821607591551722483794674940379793999230206353715117589898489861301662334780242666620337676110221421426102941068711974618344098371538140671153829377393837740293830337243493085160451872753422509384072905634851957789103689582476286664749588114456827960476870164048784404280351460249562996906271414272625881748849175309114734205368513000888013065441040602267654552015590863773059574256085653649422840863428324602357578340644446996674941825103598620438972286389472676382307637357209115141975325946791432841852827828407465818721747161090664009799105129953728589693126992849713556841586265400095017954688319716059398240941350468461830314384384626840855999556176928576367255322330539451380078690665639135509274932616776447492100759094249811584415361859939091438557866035439570864472528889723274777281738473905899882030941410513275852891694991922437995200537246398155615904052214367857177598437501143127042446835618109714924845047124233631838729882640996639575165133299706184551662489093 c = 44163895521220531459057055795752057167876718238617963549906371036055586914199267109947281359325715489398261335563468559859879340774499726524035061903919328383390193234339356811666801858858748990899697833645511123626735258871404048116302274347058468791179874933001105300534600581977271895856972533976629641765182868484553104584590829347999386472615066779248550781718812068424236647225425670871554757459074630360567280382876137651283102473254886990887517217176132596555364994651622062720390486911698802074418697530462711619997107804919499320409084297665919116751543056038865957808455949742740596859550586982302492545205898434968509344729243293414190715139959127090472661918871372070659935437431160846169010492251366727698703670348564864343164944932175842131148853297549424891479394079434940030257530096990169847176293150870765433888895069248560702669885642923421945661068042034911026426121363007026093515922333722778955975053692081279596854554640425470049534192255739670036469 e = 7 m = int(iroot(c ,7)[0]) msg = long_to_bytes(m) print(msg) ``` ::: :::info ```python= #分解出多質數,配合for迴圈 from Crypto.Util.number import inverse, long_to_bytes p = [10271, 12809, 13099, 14519, 15031, 15077, 15131, 16333, 17659, 18307, 18523, 18793, 20543, 20551, 21031, 22679, 23629, 24043, 24469, 25939, 26497, 28631, 29819, 30427, 30727, 32141, 33247, 34141, 35053, 37253, 37489, 37567, 37573, 41017, 42257, 43223, 45259, 46073, 46601, 47657, 48677, 48799, 48859, 49223, 50129, 51439, 51673, 51853, 53549, 53897, 54287, 54361, 54401, 56453, 56989, 57737, 58631, 59263, 59971, 60859, 61381, 61609, 61637, 62201, 62563, 62581, 62929, 62983, 63247, 63601, 63761, 65629, 66431, 66643, 67271, 68227, 68389, 68891, 69221, 71917, 72341, 72367, 72503, 74441, 79319, 80627, 80833, 82939 ,87797,88289, 90533, 91291, 92111, 92693, 94079, 94447, 95483, 95633, 99829] n = 5379242561523594647950347530894467537996480865590018355087109319158997270795930123540856331908672738884366385167904011017855488595276796586096107551557549670227523052877444022211292321864619810038031562604868881564808346457862397597705607504485696183634906636725606026297975141932490178472023960154975962264971630907933153973768347351189895853284875633303211925057255782604100810282383307164289739852489480355514932968092483928975367677291126737017391570952741840209 c = 1766263854323922707575527754062209530693519975028275174091426176752423520099913745390259854839923560590262155710171405162276402788610784687153180580696508496431680185160441911960475548921414375470602387918797963979512995294856434485367627926407933025461930285956325816773394481582850513417252588826280256703037578286646076025114023224350620606659249563966524948847728577768597977974590431903632589518334488721678778144427111523094613313429129360116783422105502923134 e = 65537 phi = 1 for i in p: phi = phi*(i-1) phi = phi*60859 d = inverse(e,phi) m = pow(c,d,n) print(long_to_bytes(m)) ``` ::: --- ## 第八章:系統安全(待編輯) ---