Alpacahack という常設型CTFサイトのPwnカテゴリのWrite upです!
AIに頼ってたら破産する貧乏人なので、紙とペンを使いつつ自力で解いていきます。 世の中の脆弱性発見→修正はプロと金持ちに任せます。
簡単な問題ですが復習をかねて、ポイントを詳細に書いていこうと思います。 調査においてnmやobjdump、gdbを使いましたが長くなりすぎるので省略しています。 気が向いたら追記します。
simpleoverflow
問題文: Cでは、0がFalse、それ以外がTrueとして扱われます。
動作
プログラムを実行すると、"name: "というプロンプトが表示されます。 admin などの文字列を入力しても、 "Hello, ○○" "You are not admin. bye"と表示されてプログラムが終了します。
脆弱性
この問題にはsimpleoverflowという名前の通り、スタックベースのバッファオーバーフロー脆弱性があります。
ELFバイナリ(chall)と一緒に配布されている、ソースコード(src.c)を確認していきます。
作成したchar型配列" buf "のサイズが10(1*10バイト)であるのに対して、 標準入力から buf に書きこむ read 関数の第3引数を見ると 0x10、 10進数に直すと16(バイト)になっています。 確保したメモリ領域のサイズよりも大きいサイズの書き込みが行われるので、 バッファオーバーフローと言います。
攻撃の方針
ソースコードを確認すると、int型のis_adminというローカル変数がありデフォルト値は0です。 これは if 文の条件になっており、0以外にすることができれば、 flag.txtの中身が表示されます。 したがって、何とかしてis_adminを書き換えることでflagを手に入れることができます。
下の図は配列と変数の並びのイメージです。今回は一番上のように配列 buf とローカル変数 is_admin が隣り合って配置されます。真ん中は入力できるサイズを表し、一番下は10文字(たとえばAAAAAAAAAA)を入力したときの様子で、赤い部分は書き換わっている部分を表します。
bufは入力した10文字で埋まっていますが、なぜか is_adminも書き換わりました。これは入力後のエンターで改行を示す1バイト(0x0a)が入力されているからです。これによりis_adminは0ではなくなり、ソースコードで確認した通り、flag.txtの中身が出力されます。

攻撃
実際に攻撃してみます。 問題文の下方にある「Spawn Challenge Server」を押すと、 nc IPアドレス ポート番号 という情報がでます。
これは攻撃用サーバー上で動いているターゲットプログラム(先ほど調査したバイナリファイル chall )にアクセスするためのIPアドレスとポート番号です。
「10バイトの文字列+改行(0x0a)」をサーバーに送ることが出来れば、 ncでアクセスしても、Pythonのpwntoolsライブラリを使っても、何でもいいのですが今回はncコマンドでやってみます。
$cat | nc IPアドレス ポート番号
(IPアドレスとポート番号は毎回変わるので、「Spawn Challenge Server」を押したときに出た
情報を使いましょう。)
実行すると、
name :
と出てくるので、10文字(AAAAAAAAAAなど)入力してエンターを押しましょう
でてきたctf4b{ }がまるごとフラグです。

念のため注意書き(捕まらないために)
Pwnの簡単な問題で出るような脆弱性、攻撃は世界のほとんどのシステムで対策されてます。 AIも捕まる方法しか教えてくれないので、自分のPCとCTFのサーバー以外で試さないようにしましょう。 不正アクセスなどは法律で禁止されてます。
悪用するのは簡単なので、もっと難しい方に興味を持つことを願います。
