投稿

1月, 2014の投稿を表示しています

UEFIアプリケーション/ドライバー開発の話、メモ、その他

最近得られた知見をメモしておくね. リンクとか UEFI 仕様書 http://www.uefi.org/specs/download Phoenix wiki  http://wiki.phoenix.com/wiki/index.php/UEFI とりあえずここらへん.仕様書のページ数はけっこうあるけど、 案外読み易いのでとりあえずここみましょう. ヘンにググるよりProtocolとかこっち読んだほうが見つかったりします. Phoenix wikiのUEFIの項は最初のリンク、 Phoenix Developer Information About UEFI に Protocolのdefinitionが網羅的に載ってるのでUEFIのAPIの引数とかプロトタイプ宣言 探したくなったら役立ちます. OSDev Wiki http://wiki.osdev.org/UEFI 多くのOSS系のプロジェクトでEFIを使うときはIntelの EDK より gnu-efi を用いてる例 が多いですが、このwikiはgnu-efiとgcc toolchainのUEFIターゲットの導入をわりと丁寧に書いてあります. gnu-efiを使うとgdbでブレークポイントデバッグできるので、良さげ. x86asm.net  http://x86asm.net/articles/uefi-programming-first-steps/index.html Othersの項にいくつかUEFIについての記事がある模様. gnu-efiを使ってHello Worldを作るにあたって、なぜかアセンブリでのプログラムを解説している 稀有なサイト. tianocore  http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EDK_II_User_Documentation EDKのホスティングをしているtianocoreのサイト(sourceforge)にあるユーザーマニュアル EDK II Module Writer's Guide v 0.7 と Driver Writer Guide V1.01 は必読. まずEDKでビルドするのにConf書いたりWindow

SECCON CTF 2013 ONLINE wirteup

表題通り. route 9として参加しました. 解いたのはMisc200「Encode me.」とBin300「RISC Processor」 たぶんけっこうの人が解いてるとおもうのでどちらかというと自分の備忘録です Misc200 問題のファイル、encode_me_91は31byteのバイナリファイルで、 31byteというのをみてもしやアセンブラ短歌では…とか思いましたが全く見当違いでした. ファイル名の91がヒントで、 ecoding 91とかでググるとbasE91というエンコーディングが出てくるので、 それをつかってencode_me_91をエンコードすると PASSWORD/IS/WHICH+ENCODING+DO+YOU+LIKE とでます.それだけでした. Bin300 char main[] =" .... とmainという配列にASCIIコードが詰まってて、これをバイナリとして解釈すると マシン語になるというやつ. shell codeっぽい. char main[]も函数として解釈されちゃうのはIOCCCで知りました. とりあえず使ってたマシンがGentooだったので $ crossdev -t <arch>で有名どこのRISCアーキテクチャのツールチェインを用意して、 コンパイル->objudmp -Dのコンボ. なぜかshとsparcのemergeに失敗しました… その逆アセンブル結果いまどっかいったのであとで見つければ載せる. 追記: みつけた やってることはひたすらr0とr3にデータをロードして減算でASCIIコード作りだしては スタックに載せてスタックポインタ(r1レジスタ)を一つ進める、を繰り返して、 r0に4、r3に1、r4にスタックポインタ、r5に10を格納してシステムコール. r0をシステムコール番号、r3、r4、r5をarg1、arg2、arg3として解釈するので、 Linuxでシステムコール番号4番のsys_write( unsigned int fd, const char *str, size_t count ) を呼びだす. sys_write( stdout, スタックポインタ, 10 ); なのでそれま