KazuminEngine

プログラマーの日記

zen製fuzzerを書いた

なにをしたの?

zen言語で書かれた簡易Fuzzerをつくりました。cliコマンドにfuzzを送るものです。皆さんおなじみのCTFのcrackmeをfuzzingするイメージです。

遺伝的アルゴリズムとかでfuzzを生成するとかではなく、ランダムに文字をせいせいしています。

コードはGitHubにあります。 GitHub - kazuminn/kfuzz

使い方

最新のzenで、

zen build

してやると動かすことができます。

githubにあるコードのままだと、lsにfuzzを渡すものになっています。

実行したいコマンドを変更するには、

const argv = &mut [_][]u8{ "ls", self.fuzz };

の{}にコマンドを,区切りで”をつけて書いてやってください。そして、fuzzを出力したい場所に、self.fuzzを書いてやってください。

fuzzingに成功すると、

0,-Id2K_+}F/[Lqjc|]-QD[n^]4[j)BcRVsjiWe{X
0,-IX7Z;f'\8;"Z?G}1;$R.j#7{~TxCY:+

のように、dump.csvファイルに出力されます。 0がstatus codeで,以降がそのときのfuzzです。

fuzzの文字数を固定することができなかったので、固定されていません。(たぶん、書き方あると思うけど、固定なしに。

ある程度の長さを変更したいなら、holder関数の長さを変更すれば、多分できます。

どうやって書いたの?

この本を参考につくりました。この本ではpythonでFuzzerをつくっています。pythonと同じような関数がzenには無く、ここでのコードをそのまま流用することができなかったので、あくまで参考程度にしています。

www.amazon.co.jp

なぜZen言語で書いたのか?

ちょうどコネクトフリーのインターンを三ヶ月ぐらい休んでいたので、リハビリと勉強のためにZen言語で書きました。

 感想

インターンでは、ベアメタルで動くコードしか書いていないので、このようにOSの上で動くコードをzenで書いたのははじめてで新鮮でした。osがないと動かない関数を使うのは大変刺激的でした。

zenのドキュメントに書いていない関数をライブラリのコードを見て使い方を学ぶのは、結構難しかったです。

askiiの文字コードをアルファベットに変更する関数が見当たらないので、単純なコードをたくさん書いたんだけど、その関数がないのはな。。。(あるのかな?

文字を生成するコードもっとよく書けないかな?

zenのライブラリをもっとよく知ると、もっと良いコードを書くことができるだろう。(zenzen知らずに書いた。 https://blog.hatena.ne.jp/kazuminkun/kazuminkun.hatenablog.com/edit?entry=26006613613888079#textarea