picoCTFによる pythonリモート接続の学び

python3でのpwntools

picoCTF2018got-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~')

にて下記のようなエラーが出ていた。

 

f:id:groundMonster:20200331013302p:plain

これを調べてみたところ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の形で実行した。

 

f:id:groundMonster:20200331020709p:plain

まとめ

これからもCTFの学び、やったことを書いていけたらいいなと思う。

また、日本語はまだまだへたくそなのでたくさん書いて練習したい。

CTFについても楽しいのでbinary, pwnを中心にレベリングしよう。