{%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? ![](https://hackmd.io/_uploads/BJ8GKSgY2.jpg =50%x) 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 ![](https://hackmd.io/_uploads/SknQtHgt3.jpg =50%x) * 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 ![](https://hackmd.io/_uploads/Sk7mtSeY2.jpg =50%x) 將hexiadecimal轉去decimal: > * `printf "%d" 0x3D` > * `echo $((16#3D))` ### Nice netcat... ![](https://hackmd.io/_uploads/SkA3mDgF3.jpg =50%x) 將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 : * 指對不同的輸入值,通過單向散列函數進行計算,得到固定長度的輸出值 * ![](https://hackmd.io/_uploads/r1jbwvUq3.png) * 又稱 : 哈希函數、雜湊函數... ### characteristic: * 散列值長度固定 : ex, MD5 128 bits * ![](https://hackmd.io/_uploads/rJsVKDI5n.png) * 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://hackmd.io/_uploads/rk02pmt52.png) ### 參考資料 https://ryanstutorials.net/linuxtutorial/grep.php