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には無く、ここでのコードをそのまま流用することができなかったので、あくまで参考程度にしています。
なぜZen言語で書いたのか?
ちょうどコネクトフリーのインターンを三ヶ月ぐらい休んでいたので、リハビリと勉強のためにZen言語で書きました。
感想
インターンでは、ベアメタルで動くコードしか書いていないので、このようにOSの上で動くコードをzenで書いたのははじめてで新鮮でした。osがないと動かない関数を使うのは大変刺激的でした。
zenのドキュメントに書いていない関数をライブラリのコードを見て使い方を学ぶのは、結構難しかったです。
askiiの文字コードをアルファベットに変更する関数が見当たらないので、単純なコードをたくさん書いたんだけど、その関数がないのはな。。。(あるのかな?
文字を生成するコードもっとよく書けないかな?
zenのライブラリをもっとよく知ると、もっと良いコードを書くことができるだろう。(zenzen知らずに書いた。 https://blog.hatena.ne.jp/kazuminkun/kazuminkun.hatenablog.com/edit?entry=26006613613888079#textarea