資安第六堂
PPC、網路概論、WebSocket、編碼、古典密碼
聽說有人第一次來上課?
啊記得加picoCTF的classroom
Index
PPC
水母不會py...
what is ppc
- PPC 全名 Professionally Program Coder
- 題目可能是一個遊戲,參賽者要設計出一個演算法來突破層層關卡,過關後才將flag 顯示給參賽者,考驗參賽者的程式能力
有點像是競程的互動題- 通常是使用python及pwntools進行解題
Py你不可不知的幾件事
輸入輸出
print("hello")
name = input("請輸入你的名字: ")
# 格式化輸出
age = 20
print(f"{name} 的年齡是 {age} 歲") # f-string
# 迴圈印出 0 到 4
for i in range(5):
print(i)
# 遍歷列表
items = ["apple", "banana", "cherry"]
for item in items:
print(item)
for迴圈
count = 0
while count < 5:
print(count)
count += 1
while迴圈
data = "apple,banana,cherry"
fruits = data.split(",") # 以逗號分隔
print(fruits) # ['apple', 'banana', 'cherry']
split 函式
s = "Hello"
b = s.encode() # 轉為 bytes
print(b) # b'Hello'
print(b.decode()) # 轉回 str
字串與位元組
try:
num = int(input("輸入數字: "))
print(10 / num) # 如果輸入 0,會觸發錯誤
except ZeroDivisionError:
print("不能除以 0!")
except ValueError:
print("請輸入有效的數字!")
try-except
import pwn # Pwntools 主要模組
from pwn import * # 匯入所有工具
模組導入
pwntools
匯入 pwntools 套件
from pwn import *
#連線名稱 = remote(‘主機位址’, port)
r = remote(‘120.114.62.214’, 2403)
nc 連線
r.interactive()
離開連接端
recvn(N)#接受 N 個字元
recvline()#接收一行資料
recvlines(N)#接收 N 行資料
recvuntil(some_string)#接收到 some_string 為止
r.recvuntil(b’answer: ’) #前綴加b代表此為bytes字串
接收資料
r.close()
連線結束
send(payload)#發送payload(需為字串)
sendline(payload)#發送payload,並換行(末尾\n)
sendafter(some_string, payload)#接收到 some_string 後, 發送 payload
sendlineafter(some_string, payload)#接收到 some_string 後, 發送 payload並換行
傳送資料
pwntools
因為感覺你們會很矇
所以拿一題題目來解釋

題目通常都長這樣
只會給一個nc連線的東東
當然還是有些會給點題目敘述或是類提示
pwntools
首先先連線上去觀察題目

因為這題概念簡單我就沒理server.py直接寫程式了
觀察之後整理出重點:
- 在Command:之後要傳challenge
- 接收兩行不必要資訊
- 開始一百輪的互動
- 接收到Text x/100:,後面密文存起來
- 接收掉Response:
- 回傳base32 decode然後base64 encode後的
- 最後記得切換回互動才能接收flag
pwntools

然後把重點翻譯一下:
- r.recvuntil(b'> Command: ') r.sendline(b'challenge')
- r.recvlines(2)
-
for i in range (100):
- r.recvuntil(b': ') s = r.recvline()
- r.recvuntil(b': ')
- r.sendline(base64.b64encode(base64.b32decode(s)))
- r.interactive()
然後把重點組合一下加上一點點修飾
你就會取得flag

網路概論
網路概論真的很難
當我們輸入網址後按下 enter 鍵後到底發生了什麼事情呢?




example.com
93.184.216.34
DNS
browser
server
資料庫
Request
Response
sql
data
93.184.216.34
Internet 中要經過非常多道手續才能順利將資訊傳遞到另一端,因此就有組織將手續整理後明確分層變成一個模型
internet
當我們輸入網址後按下 enter 鍵後到底發生了什麼事情呢?


browser
server
Request
Response
93.184.216.34
OSI模型
TCP/IP 通訊協定
osi模型 vs TCP/IP模型
OSI模型
TCP/IP 模型
VS
- 全名是開放式通訊系統互連參考模型(Open System Interconnection Reference Model)
- 由國際化標準組織(ISO)針對開放式網路架構所制定的電腦互連標準
- 是一種制定網路標準都會參考的概念性架構
- 共切分成7個不同的層級,每級按照網路傳輸的模式,定義所屬的規範及標準
- 基於實際運作的網際網路技術而設計的
- 由美國國防部提出,是網際網路的基礎架構
- 每個中間層為其上一層提供功能,其自身功能則由其下一層提供。
- 將通訊系統中的資料流劃分為四個層
OSI 七層
層級 | 名稱 | 主要功能 | 代表協定/技術 | 例子 |
---|---|---|---|---|
1 | 物理層 (Physical) | 負責實體訊號傳輸,如電磁波、光訊號等 | 光纖、銅線、Wi-Fi、5G | 網路線、Wi-Fi 訊號、藍牙 |
2 | 資料鏈路層 (Data Link) | 負責封包在同一個區域網路 (LAN) 內傳輸 | Ethernet、Wi-Fi (802.11)、MAC、ARP | 交換機轉發數據、Wi-Fi 無線傳輸 |
3 | 網路層 (Network) | 負責尋找最佳路徑,確保數據封包能送達 | IP、ICMP、ARP | IP 地址、路由選擇、Ping 指令 |
4 | 傳輸層 (Transport) | 負責資料分段、錯誤控制、流量控制 | TCP、UDP | TCP 三次握手、串流音樂 (UDP) |
5 | 會話層 (Session) | 管理連線、維持會話,確保資料能持續傳輸 | WebSocket、RPC、NetBIOS | 遊戲伺服器、遠端桌面連線 |
6 | 表示層 (Presentation) | 負責資料格式轉換、壓縮、加密 | TLS/SSL、JPEG、MP3、ASCII | HTTPS 加密、影片播放、文字編碼 |
7 | 應用層 (Application) | 提供應用程式與使用者介面,讓程式能夠存取網路 | HTTP、HTTPS、FTP、SMTP、WebSocket | 瀏覽器開啟網站、發送 Email、聊天室訊息 |
OSI 七層
哇字好多,所以我們來看看GPT怎麼讓我們簡單理解😎
- 物理層 → 「如何實際傳輸?」(訊號經由網路線、光纖、無線電波傳輸)
- 資料鏈路層 → 「如何在同一區域內傳送?」(Wi-Fi、乙太網路等)
- 網路層 → 「如何找路?」(IP 地址、路由選擇,確保封包能送到)
- 傳輸層 → 「如何確保完整?」(TCP/UDP 決定可靠或快速傳輸)
- 會話層 → 「如何維持連線?」(建立與管理對話,像聊天室連線)
- 表示層 → 「如何轉換?」(資料格式、壓縮、加密)
- 應用層 → 「我要傳什麼?」(處理使用者需求,如網頁、郵件、聊天)
TCP/IP 四層
層級 | 名稱 | 主要功能 | 代表協定/技術 | 例子 |
---|---|---|---|---|
1 | 網路存取層 (Network Access / Link Layer) | 負責封包在同一個區域網路 (LAN) 內傳輸,處理實體訊號 | Ethernet、Wi-Fi、MAC、PPP、5G | 交換機轉發數據、Wi-Fi 無線傳輸 |
2 | 網際層 (Internet) | 負責尋找最佳路徑,確保數據封包能送達 | IP、ICMP、ARP | IP 地址、Ping 指令、路由選擇 |
3 | 傳輸層 (Transport) | 負責資料分段、錯誤控制、流量控制 | TCP、UDP | TCP 三次握手、影片串流 (UDP) |
4 | 應用層 (Application) | 提供應用程式與使用者介面,讓應用存取網路 | HTTP、HTTPS、FTP、SMTP、DNS、WebSocket | 瀏覽器開啟網站、發送 Email、聊天室訊息 |
osi模型 vs TCP/IP模型

WebSocket
上學期web的小補充
what is WebSocket
- 全雙工(Full-Duplex)的網路通訊協定
- 只需建立一次連線,之後客戶端與伺服器可以主動互相發送訊息
- 由HTTP代為請求並建立連線
- 位於OSI模型的應用層
比較項目 | HTTP | WebSocket |
---|---|---|
通訊模式 | 請求-回應(半雙工):客戶端發送請求,伺服器回應後結束 | 持續連線(全雙工):伺服器 & 客戶端可以隨時互傳訊息 |
連線方式 | 每次請求都會建立 & 關閉連線 | 只需 一次握手,之後保持連線 |
封包開銷 | 每次請求都帶有完整的 HTTP Header,額外開銷大 | 握手後的封包較輕量,減少 Header 傳輸成本 |
適用場景 | 靜態資源、API 請求 | 即時互動、低延遲需求 |
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9YZrdJw==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
attacks-on-websockets
-
Denial-of-Service attack
- HTTP 每次請求都需要重新建立連線,因此大量請求容易被防火牆或速率限制機制攔截
- WebSocket 是一條持續開放的連線,攻擊者可以建立大量 WebSocket 連線,佔用伺服器資源,造成 DoS
-
Improper Authorization and Authentication(授權與身份驗證不足)
- WebSocket 不像 HTTP 需要每次請求都附帶身份驗證資訊,它的身份驗證只會在「連線建立時」 進行一次,之後的通訊不會再驗證身份
- 攻擊者在受害者登入後,竊取了 WebSocket 連線,就可以持續發送請求,不會再被驗證
-
Sniffing Attack(封包嗅探攻擊)
- WebSocket(ws://)在傳輸時是明文的,攻擊者可以透過攔截 WebSocket 傳輸的內容,得到敏感資料
CSWSH
- 全稱Cross-site WebSocket Hijacking
- 類似全能型的CSRF,可讀可寫
- 因為WebSocket沒有「同源策略」保護,所以只要握手成功,就能直接雙向傳輸數據,因此更容易遭受CSWSH

- 用户首先登录stock.com实时查询股票信息,其中该站点支持WebSocket,需要用户携带cookie访问;
- 接着用户被诱使在当前的浏览器访问beauty.com,其中加载了恶意JS代码到用户的浏览器中执行;
- 恶意JS代码通过WebSocket协议向stock.com站点发起请求,此时请求是用户浏览器发起的、是自动带上cookie信息的;
- stock.com收到恶意JS发送的WebSocket请求,由于未校验ws://请求的Origin头字段,在检测cookie合法后,返回敏感信息到用户浏览器;
- 用户浏览器中的恶意JS收到stock.com响应的WebSocket协议响应信息后,发往攻击者服务器,从而造成跨站点WebSocket劫持攻击;
Manipulating WebSocket messages to exploit vulnerabilities
這題要用XSS
他會把你打的字放到螢幕上
所以可以用img來進行XSS ⭢ <img src=1 onerror="alert('1')">
直接send會發現沒成功XSS
用burp攔截看看發生啥事

啊被編碼了
那就攔截他然後自己改回去就好了
你們ok的
Manipulating the WebSocket handshake to exploit vulnerabilities

Cross-site WebSocket hijacking
Introduction to CryptoHack
Index
ASCII
- 全稱為American Standard Code for Information Interchange,美國標準資訊交換碼
- 基於拉丁字母的一套電腦字元編碼標準
- 局限在於只能顯示26個基本拉丁字母、阿拉伯數字和英式標點符號,因此,現在的軟體系統大多採用Unicode

ASCII的轉換可以用py或線上工具
在py中可以使用chr()跟ord()來進行轉換
chr():ASCII轉字元
ord():字元轉ASCII

Hex
bytes.fromhex() : 將一個十六進制字符串轉換為 bytes 類型
.hex() : 將 bytes 類型的數值轉換為一個十六進制字符串
- Hexadecimal,也就是base16
- 轉換為ASCII時,每兩個十六進位數字對應一個ASCII字符

-
將十六進位數字轉換為ASCII字符的例子:
Hexadecimal: 48 65 6C 6C 6FStep-by-Step Conversion:
48 (十六進位) → 72 (十進位) → H (ASCII字符)
65 (十六進位) → 101 (十進位) → e (ASCII字符)
6C (十六進位) → 108 (十進位) → l (ASCII字符)
6C (十六進位) → 108 (十進位) → l (ASCII字符)
6F (十六進位) → 111 (十進位) → o (ASCII字符)
Result: 48 65 6C 6C 6F 轉換為 ASCII 為 Hello
base X
-
Base64:
- 使用數字 0-9、大寫字母 A-Z、小寫字母 a-z、以及符號 "+" 和 "/",共64個
- Base32:
-
使用數字 2-7(6個)和字母 A-Z(26個),共32個字元。
-
- 均使用 "=" 作為填充符號
import base64 #匯入模組
base64.b32encode(var1.encode()).decode()#b32加密
base64.b32decode(var2.encode()).decode()#b32解密
base64.b64encode(var3.encode()).decode()#b64加密
base64.b64decode(var4.encode()).decode()#b64解密
此處var是string,所以會看到一堆encode跟decode(稍後會提到,這跟bytes有關)
傳進跟傳出都是bytes
base X
Bytes and Big Integers
- bytes
- 表示二進制數據的資料型別
- py用變數儲存bytes型別 : b_data = b"hello"
- bytes to string : var1.decode()
- string to bytes : var2.encode("utf-8")
- bytes to hex-string : var3.hex()
- hex-string to bytes : bytes.fromhex(var4)
- 在密碼學中,尤其是 RSA 等演算法中,常需在 bytes 與大數(整數)間轉換
- 最常見的方法是先將訊息轉換為對應的bytes,再將這些bytes轉換為base16,然後將它們串接起來。這樣就可以轉換為一個base16的數字,也可以表示為base10的數字
- 需要先匯入模組
from Crypto.Util.number import *
- 將 bytes 轉換為整數 :
bytes_to_long()
- 將整數轉換為 bytes :
long_to_bytes()
xor
- XOR(Exclusive OR 異或)是一種位元運算,常用於密碼學和資料處理
- XOR 的運算規則是:兩個輸入位相同時,結果為0;兩個輸入位不同時,結果為1
- 0 ⊕ 0 = 0
- 1 ⊕ 0 = 1
- 0 ⊕ 1 = 1
- 1 ⊕ 1 = 0
- Commutative (交換率):A ⊕ B = B ⊕ A
- Associative (結合率):A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C
- Identity (恆等律):A ⊕ 0 = A
- Self-Inverse (自反律):A ⊕ A = 0
- Double Application (雙重應用):如果將相同的數字進行兩次 XOR,會回到原始數值:(A ⊕ B) ⊕ B = A
xor
def xor(x: bytes, y: bytes) -> bytes:
return bytes(i ^ j for i, j in zip(x, y))
from pwn import xor
result=xor('label',13) #使用pwn.xor會得到bytes型別的結果
自訂函式:
py內建函式庫:
morse-code
一種時通時斷的訊號代碼,通過不同的排列順序來表達不同的英文字母、數字和標點符號
長度與字元出現的頻率成反比


古典密碼
古典密碼學
人類使用密碼,已經有數千年歷史,而使用密碼的目的,就是不讓敵對陣營或不該知道訊息內容的人知道訊息
早期的密碼技術,主要以書寫文字之取代 (Substitution)以及位移 (Transposition)為主
Substitution
- Caesar Cipher
- Affine Cipher
- Vigenere
- Playfair Cipher
- Hill Cipher
Transposition
- Scytale Cipher
- Rail Fence Cipher
- Columnar Transposition
caesar

已知最古老的加密方法之一
加密方法就是將字母往後移n位(不含數字及特殊符號)
加解密範例:
明文為"caesar is funny" k = 4
先將明文轉為數字代碼"99 97 101 115 97 114 32 105 115 32 102 117 110 110 121"
使用加密函數E(m) = (m+k )%26
"103 101 105 119 101 118 32 109 119 32 106 121 114 114 99"
密文即為"geiwev mw jyrrc"
解密使用解密函數D(c) = (c-k)%26即可求出明文
ROT13及ROT47皆為凱薩的變體
Affine Cipher
也是「單套字母替代法」
將字母化成數字代碼(a=0,b=1 ......)
再套入加密函數 E(m)=αm+β (mod 26)
其中α與β為整數,且α必須與26互質
(不互質的話此加密函數將不會1對1,當加密函數不是1對1時,就無法存在反函數)
解密則需要加密函數的反函數
D(c) = α^-1(c-β) (mod 26)

Vigenere
屬於「多套字母取代法」
差別就是加密時是一個區塊一個區塊加密
由一些偏移量不同的凱薩密碼組成
密鑰為k=(k1,k2,…,kd)∈(Z/26)^d
則加密函數為E(x)=x+k=(x1+k1, x2+k2, …, xd+kd) (mod 26)
而解密函數為D(y)=y-k=(y1-k1, y2-k2, …, yd-kd) (mod 26)
加密過程:


也可透過這個表進行加密
Playfair Cipher
以一個5*5的矩陣作為密鑰
- 選取一個英文字作關鍵字(Keyword)。依序填入後再將剩下的字母依序由左而右、上而下填滿(將Q去除,或將I和J視作同一字。)
- 將要加密的訊息分成兩個一組。若組內的字母相同,將X(或Q)插入兩字母之間,重新分組(例如 HELLO 將分成 HE LX LO)。若剩下一個字,也加入X字。
- 在每組中,找出兩個字母在矩陣中的地方。

加密規則
- 加密字母位於同「列」時,依序往右加密
- 加密字母位於同「行」時,依序往下加密
- 加密字母位於「斜對角」時,依序往水平對角加密。
以「hello」為例
先將他分成he lx lo
he → kb
lx → ry
lo → dr
所以密文就是kbrydr
Hill Cipher
Scytale Cipher

密碼棒是個可使的傳遞訊息字母順序改變的工具,由一條加工過、且有夾帶訊息的皮革繞在一個木棒所組成
在古希臘,文書記載著斯巴達人用此於軍事上的訊息傳遞
假設那棒可寫下四個字母使之圍繞成圓圈且5個字母可連成一線。
範例文字:"Help me I am under attack".
欲加密:
_________
H E L P M
E I A M U
N D E R A
T T A C K
__________
==>"HENTEIDTLAEAPMRCMUAK"
解密的方法其實就是將編碼方法反過來:
假設編碼文為"HENTEIDTLAEAPMRCMUAK"
__________________________
H E N T---------
E I D T---------
L A E A---------
P M R C---------
M U A K---------
_______________
==>"HELPMEIAMUNDERATTACK"
Rail Fence Cipher

將明文排列成像鐵道柵欄一樣上下兩行(也可三or more),排列中明文必須扣除空白鍵,並以上下次序排列
明文的字元數必須是四的倍數,不到四的倍數則以“E”字元補滿
將排列中的字母,由左至右、由上而下,依序編寫出來,即成為加密後的密文
Columnar Transposition
與Rail Fence Cipher非常相似,但是使用多行列矩陣方式排列
由上而下的順序排列填入矩陣的方格中,如果還有空格的話,則填入”E”來補滿
金鑰的長度與矩陣的行數目相同;每相對應行的金鑰數字,為取出密文的次序

寫題🍊
- WebSocket
-
CRYPTOHACK-General
- Encoding
- XOR
- PicoCTF
- Vigenere
- 摩斯代碼:
- rail-fence:
- caesar
CRYPTOHACK
主要都是密碼學相關的一個解題平台

註冊有點特別
需要回答一個密碼學
其實沒很難就凱薩而已,自己找解碼器
參考資料
參考資料
資安第六堂
By jellyfish
資安第六堂
- 63