更新日時で差をつけろ

差をつけられそう

CBCTFのIncident Responseのwrite-upを見た

高専祭代休、結構無駄にしてしまったような気がします。実は疲れていたのかもしれません。
なんだかんだで日曜日の就寝25:50だし。

月曜日は気分がすぐれず、少し勉強して用事を済ませて洗濯して終わりでした。
何もする気分になれなかったので18:40ぐらいに布団に入って寝てしまいました。

12時間寝た後の火曜日もテンションが低かったのですが、焼きそば食って氷砂糖キメてからはそこそこやる気が出ました。
課題を消化してから先日のCBCTFのwrite-upを見ていました(Incident Response)。

CODE BLUE CTF 2017 - Incident Response - Writeup - yyy
ctf-writeups/codeblue2017/misc-incident_response at master · ymgve/ctf-writeups · GitHub

pcapから取り出したリクエストボディをx86として逆アセンブルしたときに das という見慣れない命令を見つけたので、意味を調べると BCD(二進化十進数) を用いた特殊な演算をするときに使うものでした。
「こんな問題でるのか...? Incident Responseなのに...?」と思っていたらアーキテクチャを間違っていました。x64だった。
同じく見つけた syscall はx64にしかない命令なので、ここから判別することもできました(じゃあx86で逆アセンブルしたときに出てきたのはなぜ?)。

Linuxでx86アセンブラ(BCD編) - Qiita

でこれを実行したいな〜とか思って objcopy とか nasmアセンブルとか色々試したんですが、以下でバイナリを実行できるみたいです。バイト列をそのまま関数にしている。

char code[] = "\xe9\xab\x01\...";

int main(){
  (*(void (*)())code)();
}

gccコンパイルするときに -z execstack をつけて DEP を無効にしてあげないと、 code の内容を実行できなかった(DEPSSPややこしい)。

Linux x86用のシェルコードを書いてみる - ももいろテクノロジー

これを実行するとシェルがでーんと出てくる。

あとは記事見ながらって感じで、 connectsyscall しているところでブレークさせて引数を見るらしいのですが、ブレークポイントの張り方がわからず gdb-peda$ s を連打して無理やり見ました...

こんなんわからん〜

  • xxd -p file | tr -d '\n' でバイナリファイルのhexを1行で出力できる
  • objdump -b binary -D aaa.bin -m i386(:x86-64) -M intel でELFじゃないファイルを逆アセンブルできる