私は興味のある分野がいろいろあるのですが、プログラムの解析技術もその中の一つです。(シンボリック実行)」というものがあります。これは、「どのような入力を与えられたとき、どの経路を実行するのか」を特定する技術です。これを使うことで、プログラム上の多くの経路を通るような、高いテストカバレッジのテストケースを作成できるようになったりします。一般的に、経路は条件分岐によって行き先が変わるので、分岐における条件式とそこに含まれる変数の関係を解き明かす必要があります。そこで、登場するのが、「SMTソルバ」というプログラムです。Researchが開発しているSMTソルバです。Proverこれを使えば、条件式がtrueになる可能性があるのかを特定したり、条件式がtrueになる変数の例を挙げることができます。Rustのcrateの中にも、すでに「z3」を使うためのcrateがいくつか存在するようです。今回は、その中でも最もメジャーそうなcrate「z3」(crateの名前もそのままでした)を使ってみます。2019-04-10)、crateの「z3」のバージョンは、0.3.2。crateの「z3」を使うためには、Linux環境にz3の機能を持つlibz3が必要なので、apt-getなどで先にインストールしておく必要があります。内部的にはこのライブラリを呼び出しているようです。サンプルコードはこちらになります。y_value);}これを実行すると、次のように出力されました。z3::Context::new(&cfg);まず、ここでz3の環境を整えるため、ConfigとContextを新たに作ります。格納されていくようです。ctx.from_i64(7);変数xとyを定義し、他にも数値データである0、2、7についても定義します。solver.assert(&x.add(&[&two]).gt(&seven));ここではSolverを新たに作成し、条件式を追加していきます。ここで入力した条件式は、次のようになります。solver.check());solver自体を出力すると、入力した条件式を見ることができます。solver.check()をすることで、入力した条件式が成立する変数x、yが存在するかがわかります。実際、trueが返されたので、この式が成立する値があるようです。y_value);ここでは、このSolverからModelを取得し、さきほどの式が成立する、具体的なxとyを取得しています。2となり、確かに当たっているようですね。yが最大(または最小)になるような値」なども取得することができます。まとめSMTソルバ「z3」を使うことで、プログラム中にある条件式がtrueになる条件を調べることができます。これによって、「どのような入力を与えられたとき、どの経路を実行するのか」を特定することができるようになります。実際、有名なCTFチームの一つである「Shellphish」が開発している「angr」という記号実行ツールでも、「z3」が使われています。SMTソルバを使えば、パズルを解いたり、線形計画問題を解いたりすることもできるので、記号実行以外にも使える場面はいろいろありそうです。f...先日、Rust言語でよく使われているcrateをいくつか調べました。»プロフィールid:toyamaguchiソフトウェアエンジニア。セキュリティが私の関心。(11)月別アーカイブはてなブログをはじめよう!toyamaguchiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。