# readme [InterKosenCTF 2020] ###### tags: `InterKosenCTF2020` `misc` ## 概要 これだけ。どこかで見たような問題。ただし今回はファイル名、`/proc/self/fd/X`, `/dev/fd/X`が禁じられている。 ```python= # assert the flag exists try: flag = open("flag.txt", "rb") except: print("[-] Report this bug to the admin.") # help yourself :) path = input("> ") if 'flag.txt' in path: print("[-] Nope :(") elif 'self' in path: print("[-] No more procfs trick :(") elif 'dev' in path: print("[-] Don't touch it :(") else: try: f = open(path, "rb") print(f.read(0x100)) except: print("[-] Error") ``` ## 解法 ファイルの存在チェックで `flag.txt`をオープンしていて、かつクローズしていないことに気がつけば、 `/proc/self/fd/X` を読みたくなる。しかし今回は`self`が禁じられている。ここで手元のprocfsとにらめっこをすると、 `/proc/mounts`が `/proc/self/mounts`への、`/proc/net`が`/proc/self/net` へのシンボリックリンクであることに気がつく。これがわかれば、`/proc/mounts/..`や`/proc/net/..` が `/proc/self` 相当になることがわかる。問題の環境では`mounts`は存在しないらしくエラーになったから、 `/proc/net/../fd/X`としてファイルディスクリプタを当てれば良い。 0, 1, 2はそれぞれstdin, stdout, stderrなので、それより大きくて小さいfile descriptorを4,5,6,...と総当りしていけばそのうち`flag.txt`のfile descriptorに行き着く。 今回は6があたりだった。 ```shell= $ nc localhost 9712 > /proc/net/../fd/6 b'KosenCTF{fd_1s_l1nk3d_2_7h3_4c7u4l_f1l3p4th}\n' ``` ## 感想 SECCON Beginnersに参加していた人ならちょっとうれしくなっちゃうね。mediumでもhardでもよさそう