{%hackmd BJrTq20hE %} <style> .markdown-body:not(.next-editor) pre{ background-color: #101010; } </style> * 日期:2023.07.15(六) * 報告者:[name=戴智濤]、[name=陳嘉璐]、[name=陳姿綾] # 競賽小組讀書會 [toc] ## Week 3 - General Skills ### what's a net cat?  netcat 是 Linux 系統管理者常用的網路診斷工具,幾乎任何使用 TCP 或 UDP 封包的動作都可以用它來達成,而 netcat 這個工具在 Linux 系統中的指令名稱是 `nc`,可以去打 `man nc` 指令瞭解詳情或是參考這個連結 [die.net](https://linux.die.net/man/1/nc) 解題: `nc jupiter.challenges.picoctf.org 41120` *透過 41120 連接埠(port)來連接 `jupiter.challenges.picoctf.org` 獲得資料(flag) ### Lets Warm Up  * ASCII 是美國標準的電腦編碼系統 將hexiadecimal(base 16)轉去ASCII: > * 用線上工具: [hex-to-ascii](https://www.rapidtables.com/convert/number/hex-to-ascii.html) > * `printf '\x70'` > * `echo -e "\x70"` ### Warmed up  將hexiadecimal轉去decimal: > * `printf "%d" 0x3D` > * `echo $((16#3D))` ### Nice netcat...  將decimal轉去ASCII: * 用線上工具: [decimal-to-ascii](https://gchq.github.io/CyberChef/#recipe=From_Decimal) 或 ```! nc mercury.picoctf.net 35652 | awk '{for(i=1; i<=NF; i++) printf("%c", $i)}' ``` *NF:每組資料第幾行 (Number of Fields) `awk` 可以參考 [awk簡介](https://docs.google.com/presentation/d/1Le7ioLD4coEVo5ltQ0wwiBvd23eaESK5Y9tJjiMVhrs/edit#slide=id.p) ## 參考資料 * [讀書會資料 - picoCTF](https://play.picoctf.org/practice?category=5&page=1) * what's a net cat? * [blog.gtwang.org](https://blog.gtwang.org/linux/linux-utility-netcat-examples/) * Lets Warm Up * [baeldung.com](https://www.baeldung.com/linux/character-hex-to-ascii) * Warmed up * [stackoverflow.com](https://stackoverflow.com/questions/13280131/hexadecimal-to-decimal-in-shell-script) --- ## 單向散列函數 (one-way hash function) ### Definition : * 指對不同的輸入值,通過單向散列函數進行計算,得到固定長度的輸出值 *  * 又稱 : 哈希函數、雜湊函數... ### characteristic: * 散列值長度固定 : ex, MD5 128 bits *  * Message 不同 hash value 也不同 => 抗碰撞性 * 1234567890 -> `HASH` -> E8 07 F1 FC F8 2D 13 2F 9B 0 18 CA 67 38 A1 9F * 234567891 -> `HASH` -> 0F 7E 44 A9 22 DF 35 2C 05 C5 F7 3C B4 0B A1 15 * 衝突避免: * 2的128次方為340282366920938463463374607431768211456,也就是10的39次方 * 2的160次方為1.4615016373309029182036848327163e+48,也就是10的48次方 * 2的256次方為1.1579208923731619542357098500869 × 10的77次方,也就是10的77次方 * 宇中原子數大約在10的60次方到80次方之間,所以2的256次方有足夠的空間容納所有的可能,演算法好的情況下衝突碰撞的概率很低。 * one way: * 無法反推 * 計算速度快 ### 常見演算法 * 哈希演算法主要有`MD4`、`MD5`、`SHA`。 * `MD4` 1990年 輸出128位 (已經不安全) * `MD5` 1991年 輸出128位 (已經不安全) * `SHA-0` 1993年 輸出160位 (發佈之後很快就被撤回,是SHA-1的前身) * `SHA-1` 1995年 輸出160位 (已經不安全) * `SHA-2` 包括SHA-224、SHA-256、SHA-384,和 SHA-512 ### Demo * 小試生手 ```python= import hashlib obj = hashlib.md5() obj.update("龍門虎躍".encode("utf-8")) # 需先編碼,否則會出錯 print("物件:", obj) print("16進位:", obj.hexdigest()) ``` * 增加複雜度 ```python= import hashlib obj = hashlib.md5("@ncnu.edu.tw".encode("utf-8")) # 提高複雜度, 字串也需編碼 obj.update("龍門虎躍".encode("utf-8")) print("物件:", obj) print("16進位:", obj.hexdigest()) ``` * 做成函數 ```python= def get_md5(data): obj = hashlib.md5("ejsh.djksvn.dskghdjn@!!*".encode("utf-8")) obj.update(data.encode("utf-8")) result = obj.hexdigest() return result answer = get_md5('123') print(answer) ``` * 應用:密碼登入(輸入'N',結束註冊) ```python= import hashlib USER_LIST = [] def get_md5(data): obj = hashlib.md5("12:;idrsicxwersdfsaersdfsdfresdy54436jgfdsjdxff123ad".encode('utf-8')) obj.update(data.encode('utf-8')) result = obj.hexdigest() return result def register(): print('**************sign up**************') while True: user = input('username:') if user == 'N': return pwd = input('password:') temp = {'username':user,'password':get_md5(pwd)} USER_LIST.append(temp) def login(): print('**************sign in**************') user = input('username:') pwd = input('password:') for item in USER_LIST: if item['username'] == user and item['password'] == get_md5(pwd): return True register() result = login() if result: print('登錄成功') else: print('登錄失败') ``` ## 參考資料 * https://zhuanlan.zhihu.com/p/194267700 * https://zhuanlan.zhihu.com/p/37165658 ## First Grep 這題是在一個充滿亂碼的file中尋找key,因為慢慢找的效率真的很低,所以這題我使用 `egrep` 來幫我完成 ### 什麼是egrep Linux系統中的`egrep`命令用於在文件内查找指定的字串,與 `grep`的不同點在於查找字串的方法不同 - 語法 ``` egrep [要查找的字串] [文件或目錄] ``` - 以題目來說 ``` egrep 'pico' file ``` - 一些值得我們看的參數 ``` egrep 'Linux' * ``` 查找當前目錄下所有包含Linux字串的檔案跟行 ```! -c :僅顯示匹配行的數量。 -h :當處理多個文件時排除文件名。 -i :當進行比較時忽略字符的大小寫。 -n :在每行之前加上該行在文件中的相對行號。 -q :禁止所有的輸出到標準輸出,不管匹配行。如果選中輸入行,以 0 狀態退出。 -s :僅顯示出錯消息。這點對檢查狀態有用。 -v :顯示除了與指定的模式匹配的行之外的所有行。 -x :顯示與指定模式精確匹配而不含其它字符的行。 ```  ### 參考資料 https://ryanstutorials.net/linuxtutorial/grep.php
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.