@amaga38この広告は、90日以上更新していないブログに表示しています。CTFのWrite-upです。ghidrabeleaf標準入力にフラグを入力する問題。IDAでmainを眺める。main0x912でフラグの文字列長の検査。0x20より長いらしい。その後、1文字ずつsub_7FAの関数に渡して、チェック。戻り値(%rax)とunk_2014E0+idxの値が同じなら正解でループ継続。文字数分わかればOK。sub_7FAの中では、0x201020にあるフラグ文字列のパーツっぽいデータ(8byte毎)と引数で渡された1文字を比較し、一致した文字のインデックスを呼び出し元に返却する。unk_2014E0のindex値の位置にあるフラグ文字列のパーツを順に取り出して繋げれば、フラグが得られる。printf関数のアドレスも教えてもらえるので、libcのベースアドレスを計算して、ミニROPでexecve関数を呼び出して、シェルを取った。execveのパーツは、与えられたlibcからよさげな↓を探して利用。<execve@@GLIBC_2.2.5>飛ばした先のexecveの引数の準備で、第2引数と第3引数に0を代入しておく必要があった。アセンブリ上は、%r12、%r14がそれぞれ引数に代入されるので、ROPする直前で値が0でなかった%r12にPOP命令でゼロを代入した。%r12ソルバーはこんな感じに。Table)のアドレスを上書きできればOK。shortサイズの値を指定のアドレスに書き込める%hnを使って手元環境ではうまくいっていたが、本番サーバーでは攻撃を送り込んだ直後にサーバー側からFINを投げられて通信が終わってしまいダメだった。解けたチームのWrite-upを見ていたら%hhn(!?)で1byte書き込んで成功していた。%hhnとかあったのね~。%hnは書き込みサイズが大きすぎとかで弾かれていたのかな。開催されたCTFのWrite-upです。全体77位で個人成績?では61位でした。main()抽出できたPNGファイル順番通りに並べればフラグっぽい。https://score.beginners.seccon.jp/files/fc23f13bcf6562e540ed81d1f47710af_dumpDLしたバイナリを見たらpcapっぽかったので、まずは拡張子をpcapにしてWiresharkで開いた。HTTPコンテンツを出力した。HTMLコンテンツの中は8進数みたいな値が並んでいた。Shellとなっているのと、Wiresharkで保存されたファイル名が、webshell.php%3fcmd=hexdump%20%2De%20%2716%2F1%20%22%2502%2E3o%20%22%20%22%5Cn%22%27%20%2Fhome%2Fctf4b%2Fflag.htmlになっていたので、やはりhexdumpでflagファイルの中を8進数で表示したものらしい。f.write(b)tar.gzぽかったので、tarコマンドで回答したらフラグのJPEGがでてきた。injectionとかよくわからないので、sqlmapをつかったら出た。Tired最強の暗号を作りました。https://score.beginners.seccon.jp/files/7e9eb0636de2cad98b1eee3b667aea6c_so_tired.tar.gzファイルをtarコマンドで回答すると、Base64文字列が書いてあるテキストファイルがでてくる。base64デコードするとバイナリがでてくる。fileコマンドで調べてみるとzlibで圧縮されたデータらしい。data試しに解凍してみるとまたbase64文字列がでてきたので、繰り返しだろーなーと思って、以下のソルバーを書いて解いた。コマンドライン引数と比較している。strcmpされる前のstackを見ればフラグが見えるはずなので、gdb-pedaで適当に0x4006a4にブレイクポイントを設定して実行。ctf4b{5tr1ngs_1s_n0t_en0ugh}Leakageコマンドライン引数に正しいFlag文字列を与えて実行するとcorrectと出力される実行ファイルみたい。is_correctという関数でバイナリ内にある難読化したフラグ文字列を1文字ずつconvertという関数内で元に戻している。始めは慣れていないangrでチャレンジしてみたが、なぜか解けない。gdbでやれば答えがでるのは、わかっているのであきらめてgdbでチマチマ解いた。ブレイクポイントを設定して、そのときの$eaxの値がconvertで変換されたフラグの1文字がわかる。あとはそれを繰り返す。qフラグ文字列がすべてわかるまでひたすら繰り返す。Operation次はangrでうまくいった。shellcodershellcodeを標準入力から読み込み、shellcodeに[binsh]が含まれていないかstrchrでチェックし、OKならshellcodeを実行してくれる。strchrのチェックは\x00がある位置で終了なので、shellcodeの先頭に影響のない↓のコードを入れておく。x64でスタックバッファオーバーフローをやってみるから頂いた。2019で解けた問題のwrite-upです。ソロ参加し、310pts獲得して148位でした。(フラグの出力)welcome_to_the_game参加表明?的なフラグ提出。サブドメインで提供していたWEBサービス?があったんだけど、ボスがびびってサーバーをネットワークから切り離したからコンテンツ見れんぞ。いう設定の問題らしい。スキャナツールを探し、OWASPのツールでAmassというのを使ってみた。302リダイレクトされる。SYN/ACKが返ってこない。IPv4アドレス206.189.162.22の検索を試してみる。censysの記録Censysがアクセスしたときのコンテンツを記録してくれているみたいで、おっ!?と思い、HTTPコンテンツを覗いてみるとフラグがあった。OOO{DAMNATIO_MEMORIAE}know_your_mempwn練習問題?Shellcodeを提出して、フラグを表示させれば勝ち。あり、練習用ファイルはヒント表示がある。ソースとしては一緒だが、simplified.cは、simplified_shellcode.so.cをコンパイルしてできるsimplified_shellcode.soのshellcodeという関数を呼び出し、know_your_mem.cは、標準入力からfreadしたshellcodeをメモリ上に格納し、処理をしてくれる。フラグは、ファイルからreadした文字列を0x0000100000000000UL~0x00001ffffffff000ULの間のランダムな場所にmmapで確保されたメモリー領域に格納されている。checkとすれば、shellcodeのテストができる。simplified.cはフラグが格納されているアドレスのポインタを突き止めればOK。know_your_mem.cは、そのポインタを利用してフラグを表示すればOK。0x19900cd26000フラグ文字列を指すポインタを求める処理は↓のように書いた。ポインタは、mmapの返却値としてstack上に一時保存していた値が残っているので、stack上の値を適当に検索して、保存対象のアドレス範囲を指すポインタ値っぽいかどうか雑に比較して求めた。(フラグの出力)Makefileの処理でshellcode.cに書かれた処理がコンパイルされ、know_your_memに送るshellcodeが作成される。いう風にshellcodeが作成されている。make処理では、↑で書いたポインタを求める処理だけコンパイルし、そして、know_your_mem.cで特定したメモリアドレスをwriteするshellcode部分は以下のように書いて、↑で作成したshellcode.bin.pktに追加して最終的なshellcodeを作成した。RAX最終的にサーバーへ送信したshellcodeは以下のようになった。syscalls}以上でっす。2017で解けた問題のwrite-upです。CTF-infinitとして参加し、43pts獲得して173位でした。(Baby'sFirst)crackme1_f92e0ab22352440383d58be8f046bebe.quals.shallweplayaga.me:10001[https://2017.notmalware.ru/add6a6232ea1e9d42b925a7d2a2c5781bfccd6fd/8a97fb8c264a3b34dad0a707dbfc92832067a0fa0f2b5a576c73557960b11506.tar.bz2]x86-64のELFが提供され、リモートに繋いでみると何か答えをBase64で送れと言われる。971など細かく関数をcallしている。引数(rdi)に渡しているアドレスは、1バイトずつずらしている。:呼び出されている関数の中身を見てみると、引数(rdi)と1バイト比較。イコールならeaxに値を代入してret。notイコールのときに呼ばれる758は、<.plt.got>セクションにあるし、exit関数っぽい。比較している1バイトを集める。ex"という文字列になった。試しにBase64でエンコードして送信してみたらフラグだった。(CrackMe_2000)cm2k-magic_b46299df0752c152a8e0c5f0a9e5b8f0.quals.shallweplayaga.me:12001[https://2017.notmalware.ru/5e1d5bc4e73657be1b008fbb6b08a7604e81d7cb/91ae7f2ec76f00975849c44b3d8ec8ed897fab7335c156d949bd15ea156338b3.tar.bz2]解凍するとx86-64のELFが200個ほどあった。逆アセンブルして眺めてみたところ、crackme1と同じ形式なことがわかった。:200個を手作業でやるわけにはいかないので、pythonで自動収集するプログラムを作成。XX"だったので、逆アセンブル結果から該当する機械語を含む行だけ抽出したら、うまいぐあいに文字の比較部分だけ抽出できた。最終的な回答コードが以下になった。比較されているバイトを連結し、Base64エンコードして辞書作成。サーバーへの回答時は、サーバーからの質問をキーとしてエンコードしている回答を送信しているだけ。何度か回答に成功するとフラグがもらえた。sokemsUbif解けた問題は以上です。力不足感が半端ないので、もっと精進したい。2017で解けた問題のwrite-upです。CTFinfinitとして参加し、226pts獲得して185位でした。PCTF{poop}テスト問題なので、フラグ投稿するだけ。なっていて確かにファイル名長さの値が大きすぎる。