初めに
SDCTFで学んだことをまとめていきます。
全然時間が取れず期間内にはほとんど触ることができなかった(educationalしかできてない...)ので、次のCTFの時には解く時間をしっかり確保するようにしたいです。
間違ってたら教えていただけるとありがたいです。
OSINT
This flag has been stolen
Wayback Machine
Wayback Machineを使うことでサイトが過去にどのようなものだったのかを見ることができる。
REVENGE
A Bowl of Pythons
わかった部分から少しずつコードを修正していくことで、コードを見やすくしていく。
関数化、コード化されている部分を自分で実行してみることでコードをより簡単にしていく。
pythonのコードを見るときは横にpythonのターミナルを開いて、逐次実行しながら理解していくとよい。
eval
pythonではeval
関数を用いることで引数のコードを実行することができる。
format
pythonでもprint
関数でフォーマットを用いることができる。
{}
で囲まれた部分はその後ろの.format()
に存在する配列に対応している。
-1
pythonの配列においてインデックスがマイナスの場合は後から数える。
-1だと配列の最後の値を指す。
xor
g xor fib = f
のとき、f xor fib = g
となる。
PWN
printfailed
ダイレクトパラメータアクセス
printf
関数において、%N$d
とすることで、N番目の引数を表示させることができる。
CyberChef
シーザー暗号を解くにはCyberChefが有効。
https://cyberchef.org
rotを用いることで文字のASCIIはいじることができるが、記号はいじることができないので、subを用いて調整する。
Pwntool
pwntoolを使ってctfを解くときは、手元にバイナリと自分で作ったダミーのflagファイルを用意する。
pythonでソルバーを書く。
process()
に処理したい内容(たとえばバイナリを実行するであったり、netcatで接続するであったり)を書くことで、その環境でソルバーを実行することができる。
recvline
で出力された内容を受け取り、sendline()
で括弧の内容を入力する。
JAIL
haxlab
シェルを開く
import os
os.system("sh")
でシェルを開くことができる。
dir
dir関数を用いることで、引数に指定したオブジェクトのアトリビュート(変数や関数)を表示することができる。
このとき__
で始まるものは特殊なアトリビュートである。
getadder
getadder(object,"attribute")
でもアトリビュートを参照することができる。
dict
__dict__
にはすべてのアトリビュートが格納されている。
配列
flagを取り出すことができなくても、flagを配列のように扱い、要素を順番に取り出すことによって表示させることができる。
monkey patch
pythonでは__builtins__
に含まれている関数も実行時に上書きすることができる。
lambda
pythonではlambda 引数:式
で関数を定義することができる。(ただし名前なし)
#FORENSICS
needle-in-a-haystack
cyberchef
cyberchefにバイナリファイルをぶち込むことも可能。
render image
で画像ファイルとして出力する。