writeupHarekazeCTF2019のwriteupを少し。)で38文字分の入力をscramble関数の引数に渡している。その関数がエンコードしてencryptedというシンボル名から始まるデータと何回かに分けて比較している。方針としてはrevの100pt問題でそんなに難しくなさそうなので、angrでスクリプトを書いて見たが、まだangrがうまく使いこなせなく、解けず。仕方ないのでscramble関数を読んで見るが、レジスタも多用していて、かなり読みづらい。ghidraのデコンパイル機能を使って見ることに。ghidraは触ったことがあったので良かった。参考にしないほうがいい。変数の名前を自分で変えたりしたが、あまりデコンパイラ使って解析をしたことがなかったので、名前のつけ方がナンセンスすぎた。input[]などと配列っぽく名付けてしまったために、その値が動的に変化するものだと自分でも勘違いしてしまい、かなりデコードするコードを書くのに手間がかかった。babyrop省略するがgdbで見るとbofの脆弱性。問題バイナリ内にsystem関数のpltと/bin/shの文字列があったので、それを利用してropする。rdiのガジェットを探す。ROP2(200pt)問題バイナリとlibcが配布される。./babyrop2またしてもbofの脆弱性。先ほどと違ってsystem@pltはなく、/bin/shの文字列のバイナリ内にはない。setvbuf@got)にreturnするように引数をセットして、libcのベースを求めつつ、その後main関数にreturnするようにする。二回目のmain関数で求めたlibcのベースから計算したsystemのアドレスとlibc内の/bin/shのアドレスを使用してsystem("/bin/sh")を呼び出すコードとても汚くて、一連の流れを関数にしてやったほうがいいとは思ったんだが、そんなに長くもならそうなので愚直に書いた。