# 資安實務-多元選修
## 目錄 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(參數)) #格式化輸出,以參數代替字元
```


### :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))
```
:::
---
## 第八章:系統安全(待編輯)
---