picoCTFによる pythonリモート接続の学び
python3でのpwntools
picoCTF2018のgot-2-learn-libcという問題を解いた際に、pwntoolsを使いpythonからssh接続を行った。その時に「set_working_directoryの設定で詰まったため」、メモを残しておく。
set_working_directoryについて
内容については、システムコールの変数を元にshellを取るもので、参考にさせてもらったkusuwadaさんの記事では、systemとfflushのオフセットを元に解いていた。
そこで用いていたpythonコードの中で
# picoCTF の shell serverに接続 print('picoCTF shell server login') print('name:') pico_name = input('>>') print('password') pico_pass = input('>>') pico_ssh = ssh(host = '2018shell4.picoctf.com', user=pico_name, password=pico_pass) pico_ssh.set_working_directory('/problems/got-2-learn-libc_4_526cc290dde8d914a30538d3d0ac4ef1')
という部分があり、その中の
pico_ssh.set_working_directory('/problems/got-2-learn-libc_4_526cc290d~')
にて下記のようなエラーが出ていた。
これを調べてみたところstring型とbyte型は結合できないというエラーということが分かった。
さらに調べたところ、python3のソケット通信では送信はbytes、受信はstringになるとうことがこの記事から分かり、文字列をbytesにエンコードする必要があると分かった。
そのため、下記のように .encode()でbytes型に変換してやることで無事に通信ができた。
#picoctfに接続
print('picoCTF shell server login', end='')
print('name:', end='')
pico_name = input('>>').rstrip()
print('password', end='')
pico_pass = input('>>').rstrip
pico_ssh = ssh(host = '2018shell4.picoctf.com', user=str(pico_name), password=str(pico_pass))
pico_ssh.set_working_directory('/problems/got-2-learn-libc_1_ceda86bc09ce7d6a0588da4f914eb833'.encode())
ちなみに、改行が入るとtracebackというエラーで繋がらないためprintの後はend=''にしてあり、pwntoolsはpython3にしてpython3 ~.pyの形で実行した。
まとめ
これからもCTFの学び、やったことを書いていけたらいいなと思う。
また、日本語はまだまだへたくそなのでたくさん書いて練習したい。
CTFについても楽しいのでbinary, pwnを中心にレベリングしよう。