PPC、網路概論、WebSocket、編碼、古典密碼
水母不會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 套件
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並換行
傳送資料
因為感覺你們會很矇
所以拿一題題目來解釋
題目通常都長這樣
只會給一個nc連線的東東
當然還是有些會給點題目敘述或是類提示
首先先連線上去觀察題目
因為這題概念簡單我就沒理server.py直接寫程式了
觀察之後整理出重點:
然後把重點翻譯一下:
然後把重點組合一下加上一點點修飾
你就會取得flag
網路概論真的很難
example.com
93.184.216.34
DNS
browser
server
資料庫
Request
Response
sql
data
93.184.216.34
Internet 中要經過非常多道手續才能順利將資訊傳遞到另一端,因此就有組織將手續整理後明確分層變成一個模型
internet
browser
server
Request
Response
93.184.216.34
OSI模型
TCP/IP 通訊協定
OSI模型
TCP/IP 模型
VS
層級 | 名稱 | 主要功能 | 代表協定/技術 | 例子 |
---|---|---|---|---|
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、聊天室訊息 |
哇字好多,所以我們來看看GPT怎麼讓我們簡單理解😎
層級 | 名稱 | 主要功能 | 代表協定/技術 | 例子 |
---|---|---|---|---|
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、聊天室訊息 |
上學期web的小補充
比較項目 | 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=
這題要用XSS
他會把你打的字放到螢幕上
所以可以用img來進行XSS ⭢ <img src=1 onerror="alert('1')">
直接send會發現沒成功XSS
用burp攔截看看發生啥事
啊被編碼了
那就攔截他然後自己改回去就好了
你們ok的
ASCII的轉換可以用py或線上工具
在py中可以使用chr()跟ord()來進行轉換
chr():ASCII轉字元
ord():字元轉ASCII
bytes.fromhex() : 將一個十六進制字符串轉換為 bytes 類型
.hex() : 將 bytes 類型的數值轉換為一個十六進制字符串
將十六進位數字轉換為ASCII字符的例子:
Hexadecimal: 48 65 6C 6C 6F
Step-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
Base64:
使用數字 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
from Crypto.Util.number import *
bytes_to_long()
long_to_bytes()
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內建函式庫:
一種時通時斷的訊號代碼,通過不同的排列順序來表達不同的英文字母、數字和標點符號
長度與字元出現的頻率成反比
人類使用密碼,已經有數千年歷史,而使用密碼的目的,就是不讓敵對陣營或不該知道訊息內容的人知道訊息
早期的密碼技術,主要以書寫文字之取代 (Substitution)以及位移 (Transposition)為主
Substitution
Transposition
已知最古老的加密方法之一
加密方法就是將字母往後移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皆為凱薩的變體
也是「單套字母替代法」
將字母化成數字代碼(a=0,b=1 ......)
再套入加密函數 E(m)=αm+β (mod 26)
其中α與β為整數,且α必須與26互質
(不互質的話此加密函數將不會1對1,當加密函數不是1對1時,就無法存在反函數)
解密則需要加密函數的反函數
D(c) = α^-1(c-β) (mod 26)
屬於「多套字母取代法」
差別就是加密時是一個區塊一個區塊加密
由一些偏移量不同的凱薩密碼組成
密鑰為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)
加密過程:
也可透過這個表進行加密
以一個5*5的矩陣作為密鑰
加密規則
以「hello」為例
先將他分成he lx lo
he → kb
lx → ry
lo → dr
所以密文就是kbrydr
密碼棒是個可使的傳遞訊息字母順序改變的工具,由一條加工過、且有夾帶訊息的皮革繞在一個木棒所組成
在古希臘,文書記載著斯巴達人用此於軍事上的訊息傳遞
假設那棒可寫下四個字母使之圍繞成圓圈且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"
將明文排列成像鐵道柵欄一樣上下兩行(也可三or more),排列中明文必須扣除空白鍵,並以上下次序排列
明文的字元數必須是四的倍數,不到四的倍數則以“E”字元補滿
將排列中的字母,由左至右、由上而下,依序編寫出來,即成為加密後的密文
與Rail Fence Cipher非常相似,但是使用多行列矩陣方式排列
由上而下的順序排列填入矩陣的方格中,如果還有空格的話,則填入”E”來補滿
金鑰的長度與矩陣的行數目相同;每相對應行的金鑰數字,為取出密文的次序
主要都是密碼學相關的一個解題平台
註冊有點特別
需要回答一個密碼學
其實沒很難就凱薩而已,自己找解碼器