writeup久しぶりの更新、生きています。')]))アルファベットと符号化された対応がわかるので、デコードする。}}エンコード方法は文字列をasciiに変換しスタックにpush。その後スタックからpopし2進数の文字列に変換("AB"だったら0x41,0x42なので10000011000010)。その後0と1を反転させ、9個左にローテーションさせる。110001)、どこで区切ればいいかわからんってなったので、フォーマットがtjctf{***}であることはわかっているので、それっぽいleet表現の文字列に直した。これ全探索以外に綺麗にコードでかけないよな。special.バイナリファイルがもらえる。tjctftjctf{my_b3l0v3d_5qu4wk3r_w0n7_y0u_l34v3_m3_4l0n3}しかしこれはダミー。dump.main+99~main+156でinputの最初の6文字を比較している。比較するのはダミーが入っている0x804a040の中身。main+158~main+210でinputの次の3文字と0x804a040+0xeからの3文字を比較している。main+212~main+264でinputの11文字目から23文字と0x804a040+0x1bからを比較している。main+266~main+270でinputの10文字目が0x64('D')であるかどうか比較している。invalidator......tjctf{0h_my_4_51mpl370n_4_r3d_h3rr1n6_f0r_7hUWVSt$,U......しかしこれもダミー。これにxorするとかでもなくまじで関係ないやつだった。gdbで見るとプログラムの第一引数と何かを比較する感じ。肝心なのは自作関数strcmp。<+115>:retどうやら0x804a040からのデータと比較している。これもgdbで見てみよう。<r+64>:0x000000140x0000008a0x000000ca0x00000077明らかに人の手で作り込んだようなデータがある。rというシンボル名が付いている。|................|readelfでサイズが2048、hexdumpで最初の4dを調べて見ると0x1040からrがあることがわかる。(他になんか便利なコマンドあったはずだが忘れた)solve.cではrは実際には4バイトずつにしか値が入ってないので長さ512の配列を用意して、バイナリファイルから直に読み込んだ。デコードする操作はアセンブリをみて理解する。8010ご丁寧にcのソースまである。0;}shop_orderのgetsでoverflowが起こせる。自作canaryは0にすることもできるが、上書きしてしまっても今回は問題ない。rpでpop,retのガジェットを検索して、putsを利用し、puts@gotとgets@gotの中身をリークし、サーバーのlibcを特定する。hex(u32(libc_puts[0:4]))conn.interactive()getsとputsのアドレスがわかったら、https://libc.blukat.me/に入力してlibcを特定、/bin/shとsystemのオフセットも特定。このサイトマジで便利だな。あとはASLRを回避するためにputsのアドレスをリークしつつ、もう一度shop_order関数に戻り、もう一度getsに対してoverflowを仕掛ける。tjctf{5l3dd1n6_0mk4r_15_h4ppy_0mk4r}総括この間、人の書いたwriteupをみてlibcを特定するサイトを知ったのだが、早速使える場面が来て、嬉しい。最近rev,pwn担当として、非力ながらチームに参加させてもらったので、頑張っていきたい。早く研究室とか就活とか終わらせて、卒業したい。社会人になったらやる元気あるのかな。今後もよろしくお願いしますわ。writeupHarekazeCTF2019のwriteupを少し。writeupångstromCTFで僕が解いた問題のwriteuppwnとrevとmiscを少しず...2018-10-17picoCTF2018振り返り+ちょっとwriteuppicoCTF2018に参加しました。(1)はてなブログをはじめよう!kam1tsur3さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。