# picoCTF - General Skills write-up
未寫:
* YaraRules0x100
# Easy
## FANTASY CTF
:::spoiler 解法
連線之後是一堆文字然後會有選擇給你選
```
Options:
A) *Play the game*
B) *Search the Ether for the flag*
```
A好像會一直顯示`Don't just submit any old flag you find!` 選B才會找到這題的flag

:::
## Log Hunt
> grep
:::spoiler 解法
這題題目說檔案內容可能有重複,先觀察一下裡面寫了甚麼
可以發現在一堆WARN、DEBUG其中夾雜著幾行 INFO FLAGPART: ,看起來像是 flag 的碎片

用grep把flag都抓出來,把碎片組合在一起就是flag了~

:::
## Rust fixme 1
> Rust
:::spoiler 解法
這題要修他的rust腳本,他有三個問題,分別是`How do we end statements in Rust?`、`How do we return in rust?`、`How do we print out a variable in the println function?`

答案其實上網查一下就好,答案分別是`;`、`return;`、`{}`
改好之後回到上一層目錄用`cargo run`就可以得到flag了

:::
## Rust fixme 2
> Rust
:::spoiler 解法
這題的問題是let是不可變的,要讓它變成可變的要加上mut
參數傳遞那邊則要改成&mut

改好之後回到上一層目錄用cargo run就可以得到flag了

:::
## Rust fixme 3
> Rust
:::spoiler 解法
這題一樣是要修這個rust程式,一開始看一下內容,看到他寫什麼unsafe
直接執行看看他的報錯,可以看到他說`std::slice::from_raw_parts(decrypted_ptr, decrypted_len);`這段需要unsafe function,查了一下什麼是 unsafe function。

在 Rust 中像 `from_raw_parts` 這種函式是標記為 unsafe 的,意思是你要保證它的使用是正確的。用法就是要把這段程式碼包在 unsafe { } 裡面,這樣編譯器才會讓你過

:::
## Binary Search
> ssh、二分搜
:::spoiler 解法
ssh之後就二分搜,沒啥時間限制的樣子而且數字小所以不用寫腳本也行,直接手動二分搜就能得到flag了
:::
## Time Machine
> git
:::spoiler 解法
說要找上次運作時間
所以一樣想到git
`git log message.txt`就有了
:::
## Super SSH
> SSH
:::spoiler 解法
按下開始會出現其他資訊
在終端機打
`ssh -p 65400 ctf-player@titan.picoctf.net`
輸入密碼就好了
:::
## endianness
> big endian、little endian
:::spoiler 解法
這題要先了解甚麼是little and big endian
簡單來說就是位元組的排列順序
big-endian就是正序,相反就是little endian
知道之後就能解了
nc連線之後把他給的word換成hex格式
然後依big endian跟little endian排就得到flag了
:::
## Commitment Issues
> git
:::spoiler 解法
解壓縮後,會有一個message.txt
先 `git log message.txt`
可以看到兩筆commit一個是移除一個是建立flag
我們要拿建立flag那個時候的檔案
`git checkout 3d5ec8a26ee7b092a1760fea18f384c35e435139 -- message.txt`
然後再`cat message.txt`就是flag了
:::
## Collaborative Development
> git
:::spoiler 解法
題目說到跟他人共同編輯
上網查發現有個東西是 `git branch`可以查看有沒有其他分支
輸入後可以發現有三個分支
然後可以用 `git switch branch_name`切換到那個分支
三個都切換一次都 `cat flag.py`組合起來就是flag了
:::
## Blame Game
> git
:::spoiler 解法
題目說某人個commit阻止程式的運作
所以要找歷史提交紀錄
用git log
`git log message.py`
就有flag了
:::
## binhexa
> nc、二進制
:::spoiler 解法
nc連線之後按照他說的做二進位的運算
~~可以用pwntools啦但其實找線上工具就好了~~
:::
## repetitions
> base64
:::spoiler 解法
下載檔案會看到一堆像亂碼的文字
但結尾是==所以推測是base64
重複decode直到變成flag
:::
## Big Zip
> grep
:::spoiler 解法
一樣先 unzip 然後用grep
`grep -r "CTF"`就能找出flag了!
:::
## First Find
> find
:::spoiler 解法
先下載檔案
然後 `unzip file.zip`
題目說要找 `uber-secret.txt`
所以 `find . -name "uber-secret.txt"`然後cat 找到的檔案就好了
:::
## runme.py
> wget、pyhton
:::spoiler 解法
複製連結然後 `wget 連結` 然後用python3去跑檔案就好了
:::
## PW Crack 1
> nano
:::spoiler 解法
||其實會開檔案就好了||
把兩個檔案下載在同個目錄下
然後打開py檔可以直接看到他的密碼
輸入密碼就有flag了
:::
## PW Crack 2
> python
:::spoiler 解法
把兩個檔案下載在同個目錄下
然後打開py檔看一下
這次的密碼是 `chr(0x64) + chr(0x65) + chr(0x37) + chr(0x36)`
打開py跑一下就知道密碼是什麼了
一樣輸入就是flag了
:::
## HashingJobApp
> nc、md5
:::spoiler 解法
nc連線後會出現三題叫你md5加密的
可以寫py或找線上工具
三題答完就拿到flag了
:::
## Glitch Cat
> nc、python
:::spoiler 解法
按下開始之後會出現一個nc連線
直接複製到terminal就可以連線了
他會給你一串東西
看到chr就知道是py
打python然後直接整串複製貼上就能得到flag了
:::
## fixme1.py
> python
:::spoiler 解法
下載下來先跑跑看
報錯在20行
把print前面的空格刪掉就好了
:::
## fixme2.py
> python
:::spoiler 解法
一樣先跑一下
報錯的是 `if flag = "":`
改成 `if flag == "":`
就拿到flag了
:::
## convertme.py
> python、二進制
:::spoiler 解法
打開原檔可以知道他會給一個數字
然後我們要輸入二進制給他
他會比對是否一樣
照他的做就有flag了
:::
## Codebook
> python
:::spoiler 解法
把兩個檔案下載在同個目錄下
跑py
結束
:::
## Magikarp Ground Mission
> cd、cat、ssh
:::spoiler 解法
依題目說的先ssh `ssh -p 50094 ctf-player@venus.picoctf.net`
進去會先有兩個檔案
一個是第一部分的flag一個是告訴你下一步
分別cat他們
知道下一步要去根目錄 `cd /`
然後是家目錄 `cd ~`
三段flag組合在一起就是flag了
:::
## Tab, Tab, Attack
> unzip、tab
:::spoiler 解法
下載檔案之後 unzip 檔案
依題目知道可能會有好幾層資料夾(也可以用tree)
cd之後按著tab直到他自己跑到最後一層
最後一層資料夾裡有一個執行檔,執行之後就是flag
:::
## Wave a flag
> chmod
:::spoiler 解法
題目說是一個program所以要執行他
執行前先給他加個執行權限 `chmod +x warm`
然後 `./warm`執行後他會說 `Hello user! Pass me a -h to learn what I can do!`
照他說的 `./warm -h`就能得到flag
:::
## Python Wrangling
> python
:::spoiler 解法
把三個檔案都載下來
先進py檔看一下,-d可以解密,但需要密碼
`cat pw.txt`得到密碼
輸入 `python3 ende.py -d flag.txt.en`然後輸入密碼
get flag
:::
## Static ain't always noise
> chmod、grep
:::spoiler 解法
下載下來後先 `chmod +x ltdis.sh`給他加個執行權限
直接 `./ltdis.sh`他會報錯跟你說後面要加檔案
把另一個檔案丟上去 `./ltdis.sh static`
執行訊息會說他創了兩個新檔案
可以直接cat 檔名帶string那個或`grep "CTF" 檔名`
:::
## Nice netcat...
> python、ASCII、nc
:::spoiler 解法
nc連線之後會噴一堆數字出來
觀察一下可以猜到是ASCII
寫一個py或C++ 就好了(個人是寫C++)
``` cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int x;
while(cin>>x){
cout<<char(x);
}
}
```
:::
## Obedient Cat
> cat
:::spoiler 解法
下載檔案之後,在終端機cat他
~~其實可以直接雙擊點開~~
:::
## 2Warm
> 二進制
:::spoiler 解法
就是十進位轉二進位而已
``` py
num = 42
binary = bin(num)[2:]
print(binary)
```
解出來放到picoCTF{}裡就是flag
:::
## First Grep
> grep
:::spoiler 解法
下載之後 `grep "CTF" file`
:::
## Bases
> base64
:::spoiler 解法
題目都說base了
第一個猜base64
解碼之後丟到picoCTF{}裡就是了
:::
## Warmed Up
> 16進制
:::spoiler 解法
就是把16進制轉10而已
``` py
num = int("0X3D", 16)
print(num)
```
:::
## strings it
> strings、grep
:::spoiler 解法
下載下來之後看題目猜到要用strings
`strings 檔案`會噴出一堆東西
要搜尋的話聯想到grep,可以用|連接起來
`strings strings | grep "CTF"`得到flag!
:::
## what's a net cat?
> nc
:::spoiler 解法
用nc連線
`nc jupiter.challenges.picoctf.org 41120`拿到flag了
:::
## Lets Warm Up
> hex、ACSII
:::spoiler 解法
轉換的數字對應ASCII
``` py
num = int("0x70", 16)
print(chr(num))
```
解出來放到picoCTF{}就好
:::
# Medium
## Nothing Up My Sleeve
:::spoiler 解法
就wget檔案然後cat就得到flag了

:::
## dont-you-love-banners
> ln、nc、rm
:::spoiler 解法
先連第一個他說有資料洩漏的nc連線
獲得password
再連第二個 , 會有三個問題
第一個就是前面得到的密碼,其他兩個上網查就有了,分別是DEFCON跟John
進去之後想到他題目說的/root
`cd /root` 之後會有兩個檔案,flag檔案沒辦法讀取,py檔可以讀
打開讀一下找到一個重點
``` py
with open("/home/player/banner", "r") as f:
print(f.read())
```
可以看到他會去打開這個地方的檔案
~~點開提示或通靈出來~~可以用 `ln` 架軟連接
連接前要先移除掉原本那個地方的文件,否則會報錯
`rm /home/player/banner`
`ln -s /root/flag.txt /home/player/banner`
然後重新nc連線就能得到flag了
:::
## SansAlpha
> base64、Shell 通配符
:::spoiler 解法
||因為啥想法都沒有所以就上網看writeup了||
了解到這題要用Shell 通配符
簡單來說
`*`:匹配任意長度的字符(包括空)。
`?`:匹配單個任意字符。
`[abc]`:匹配字符集合中的任一字符。
`[!abc]`:匹配不在集合中的任一字符。
輸入 `*/*`可以找到 `blargh/flag.txt`
但不能直接開
||wp說||要用/bin/base64先讓他base64加密
`/???/???[!_]64 ??????/????.???` (/???/????64會跟/bin/x86_64搞混)
然後把他給的拿去base64解密就好
:::
## ASCII Numbers
> ASCII、hex
:::spoiler 解法
簡單來說就是要把十六進位的ASCII碼轉成chr
寫個Py
``` py
hex_values = "0x70 0x69 0x63 0x6f 0x43 0x54 0x46 0x7b 0x34 0x35 0x63 0x31 0x31 0x5f 0x6e 0x30 0x5f 0x71 0x75 0x33 0x35 0x37 0x31 0x30 0x6e 0x35 0x5f 0x31 0x6c 0x6c 0x5f 0x74 0x33 0x31 0x31 0x5f 0x79 0x33 0x5f 0x6e 0x30 0x5f 0x6c 0x31 0x33 0x35 0x5f 0x34 0x34 0x35 0x64 0x34 0x31 0x38 0x30 0x7d"
readable_string = ''.join(chr(int(h, 16)) for h in hex_values.split())
print(readable_string)
```
||其實這是gpt的作品||
:::
## useless
> ssh、man
:::spoiler 解法
ssh連線之後會有一個執行檔 `./useless`他會顯示 `Read the code first`
cat他,可以看出來這是一個用來執行運算的程式,看到一行寫 `Read the manual`
`man useless`就能看到flag了
:::
## Specialer
> ssh、cd、echo
:::spoiler 解法
ssh之後習慣 ls 一下,結果顯示command not found
改成cd,按兩下tab可以發現一堆目錄
||然後我就不知道要幹嘛了所以又去看了wp||
直接按兩下tab可以看到可以用的指令
其中有用的是 `cd` 跟 `echo`
因為不能用cat要改用echo印出txt內的文字,上網查到了用法 `echo "$( < filename.txt )"`
然後就逛逛逛把txt翻一次
找到 `ala/kazam.txt`是flag!
:::
## Special
> ssh、cd、cat
:::spoiler 解法
連上去之後隨便打字發現他會變成別的字
但只限前面的字
所以用;再連接一個指令就好了
'aaaaaa;cd'可以看到一個叫blargh的資料夾
直接 `aaaaaaaa;cd blargh`可以發現blargh被編碼成large了
然後就||上網查||發現可以再後面加/, `aaaaaaaa;cd blargh/;ls`
可以發現有個flag.txt的檔案
所以就`aaaaaaaa;cd blargh/;cat flag.txt`就拿到flag了!
:::
## Permissions
> vim、sudo
:::spoiler 解法
直接 `cd /root/` 沒辦法
`sudo -l` 會顯示甚麼可以用 發現vim可以用
所以 `sudo vi /root`
然後就可以打開/root/flag.txt
:::
## chrono
> crontab
:::spoiler 解法
上網查他題目的那句,得知這題跟 crontab 有關
`crontab -e` 會顯示沒有編輯器
所以改成直接 `cat /etc/crontab`就有了
:::
## Serpentine
> python
:::spoiler 解法
下載py檔之後運行看看,他有三個選項,選了 `print flag`之後她顯示 `Oops! I must have misplaced the print_flag function! Check my source code!`
照他說的去看py原檔,發現選print flag那邊沒有呼叫函式
把她改成 `print_flag()` 然後再運行一次就好了!
:::
## PW Crack 3
> python
:::spoiler 解法
下載py之後,cat他看一下內容
大概邏輯就是把flag跟password做xor最後print出flag
最下面有七個密碼,他說只有一個是對的
所以就每個試一次就找的到了
||pw是2295||
:::
## PW Crack 4
> python
:::spoiler 解法
跟上一題一樣,但變成100選一 ||不能瞎猜了嗚||
在py寫個for迴圈全部跑一遍就好了
``` py
def level_4_pw_check():
#user_pw = input("Please enter correct password for flag: ")
for i in range (100):
user_pw = pos_pw_list[i]
user_pw_hash = hash_pw(user_pw)
if( user_pw_hash == correct_pw_hash ):
print("Welcome back... your flag, user:")
decryption = str_xor(flag_enc.decode(), user_pw)
print(decryption)
return
```
:::
## PW Crack 5
> python
:::spoiler 解法
變成有可能的pw在額外的一個檔案
問了一下gpt怎麼把它在py中變成一個array
``` py
with open('data.txt', 'r') as file:
array = [line.strip() for line in file]
```
知道這個就跟上一題一樣的解法了:D
``` py
def level_5_pw_check():
#user_pw = input("Please enter correct password for flag: ")
for i in range(len(array)):
user_pw = array[i]
user_pw_hash = hash_pw(user_pw)
if( user_pw_hash == correct_pw_hash ):
print("Welcome back... your flag, user:")
decryption = str_xor(flag_enc.decode(), user_pw)
print(decryption)
return
#print("That password is incorrect")
```
:::
## 1_wanna_b3_a_r0ck5tar
> Rockstar
:::spoiler 解法
他提供了一個Rockstar解碼器
把所有IF ELSE 刪了,然後隨便輸入
output會出現一些數字
拿去對照ASCII就可以知道flag了
:::
## flag_shop
> nc、overflow
:::spoiler 解法
這題剛好前段時間上課有上到所以就知道了
簡單來說就是讓他overflow這樣你的花費就會變負數
錢 - 負數 = 變多
所以只要買2^31 / 900 以上的flag就好了
:::
## plumbing
> nc、grep
:::spoiler 解法
nc連線之後噴出一大堆東西,滑都滑不完
想到可以用`grep` 跟 `|`
`nc jupiter.challenges.picoctf.org 4427 | grep "CTF{"`
就會找到flag了!
:::
## Based
> 二進制、八進制、hex、ASCII
:::spoiler 解法
試了好幾次知道了有三題
第一題是二進位轉成字串
第二題是八進位轉成字串
第三題是hex轉成字串
寫個py然後拚手速就好了
``` py
s = "01110000 01100101 01100001 01110010"
for i in s.split(" "):
print(chr(int(i,2)),end = "")
print()
s = "143 150 141 151 162"
for i in s.split(" "):
print(chr(int(i,8)),end = "")
print()
s = "6c616d70"
print(bytes.fromhex(s))
```
:::
## mus1c
> Rockstar
:::spoiler 解法
看到又是一篇意義不明的文章
想到剛剛前面看過的Rockstar
嘗試把文章丟進去解密
得到一串數字
用ASCII轉成字串
就是flag了
:::