C# で ini ファイルの内容を任意のクラスに格納するコードを書いてみた。

どうもみむらです。

C# で ini ファイルを操作するとなると、
よくあるのが GetPrivateProfileString あたりを叩いて取得することになります。

でもその場合、いちいち要素を指定して取得しなければならず、
特に複数のキー(フィールド)がある場合に複数回コードを書くのも面倒です。

特に ini ファイルの項目が多くて、こんな状態になった日には・・。

image

 

・・ということで、 Reflection を使用して
この辺をすごく楽に出来るような感じでコードを書いてみました。

 

コード:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;

public static class Ini
{
    [DllImport("KERNEL32.DLL")]
    public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);

    [DllImport("KERNEL32.DLL")]
    public static extern uint GetPrivateProfileInt(string lpAppName, string lpKeyName, int nDefault, string lpFileName);

    [DllImport("KERNEL32.DLL")]
    public static extern uint WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);

    public static T Read<T>(string section, string filepath)
    {
        T ret = (T)Activator.CreateInstance(typeof(T));

        foreach (var n in typeof(T).GetFields())
        {
            if (n.FieldType == typeof(int))
            {
                n.SetValue(ret, (int)GetPrivateProfileInt(section, n.Name, 0, Path.GetFullPath(filepath)));
            }
            else if (n.FieldType == typeof(uint))
            {
                n.SetValue(ret, GetPrivateProfileInt(section, n.Name, 0, Path.GetFullPath(filepath)));
            }
            else
            {
                var sb = new StringBuilder(1024);
                GetPrivateProfileString(section, n.Name, "", sb, (uint)sb.Capacity, Path.GetFullPath(filepath));
                n.SetValue(ret, sb.ToString());
            }
        };

        return ret;
    }

    public static void Write<T>(string secion, T data, string filepath)
    {
        foreach (var n in typeof(T).GetFields())
        {
            WritePrivateProfileString(secion, n.Name, n.GetValue(data).ToString(), Path.GetFullPath(filepath));
        };
    }
}

 

使い方:

ini ファイルの読み取りたいセクションに合わせたクラスを用意します。

    public class Human
    {
        public string name;
        public int age;
    }

でもって次のような ini ファイルを用意して

[01]
name=TARO
age=20

あとはこんな風に呼び出します。

        static void Main(string[] args)
        {
            var h = Ini.Read<Human>("01", "DATA.INI");

            h.age = 15;
            h.name = "JIRO";
            Ini.Write("02", h, "DATA.INI");
        }

 

実行しますと、

image

こんな感じでデータが読み出されます。

でもって、 ini ファイルは

[01]
name=TARO
age=20
[02]
name=JIRO
age=15

こんな感じに、ちゃんとセクション 02 が書き込まれます。


躓きそうなところ:

データを格納するクラスが、こういう感じに {get; set;} な状態になっている場合:

    public class Human
    {
        public string name { get; set; }
        public int age { get; set; }
    }

上記コード内の GetFields を GetProperties に換え、 FieldType を PropertyType に変えれば動作します。


・・そんなわけで、もし良ければ自己責任でご利用ください-。

Python の内包表現と演算子と。

みむらです。

最近ちょっと Python を触ってみようかとということで、
しばらくぶりに触っています。

ってことで忘れそうなことのメモ。

・・・Python をよく使っている人からするとぶん殴られそうな気がしますが、
とりあえず、勉強ということで躓いたところをメモしていきます。

 

内包表現:

[追加要素 for 変数 in リスト if 条件]

使い方としては、

l = ((0,1),(2,3),(4,5))
m = [i for (i,j) in l]
>> (0,2,4)

みたいな。

なんとなく、C# だと、

var l = new[] { new[] { 0, 1 }, new[] { 2, 3 }, new[] { 4, 5 } };
var m = l.Select(i => i[0]);

みたいな感じ・・ですかね。

あとは条件式を加えて、

[i for (i,j) in l if i > 0]

みたいなやつに関しては

var l = new[] { new[] { 0, 1 }, new[] { 2, 3 }, new[] { 4, 5 } };
var m = l.Where(i => i[0] > 0).Select(i => i[0]);

みたいな感じ。

 


演算子のメモ:

割り算において “/” と “//” 演算子があって、

3.0/2.0 = 1.5

3.0//2.0 = 1.0

というように、”//” 演算子だと結果が整数に丸められる。

丸め方としては、

math.floor で丸めた時と同じ動作となるっぽい。

1.5 → 1.0

-1.5 → -2.0

考え方としては「負の無限大」方向に丸める。

データとして考えるなら、 0x0 の方向に丸める、と考えると良いのかもしれない。

(負数は2の補数表現で表現されることを考えてみると。)

逆に、 “0” 方向に丸める場合は、 int で括ると良い感じ。

ex. int(1.5 / 1.0)

1.5 → 1.0

-1.5 → –1.0

あとは round 関数で丸める方法なんてのもありますが、

これは昔書いた「銀行丸めと四捨五入。」を参照してください。

 

それと、 “**” 演算子が存在し、

これは C# で言うところの Math.Pow (べき乗計算)に該当。

ex.)

2**10 = 1024


要素数を数える:

私自身、ちょっとはまったのですが・・(汗

C++ だと hoge.size() とか書いて、

C# だと hoge.Length だったり、動的に求める必要がある物については hoge.Length() だったり。

Python の場合は、 len(hoge) で求まる。

また、 hoge.count() と叩くと「引数が足りない!」と怒られるんですが、

これは C# の hoge.Count(1) と同じで、要素内に指定されたものがいくつ入っているかを返すメソッド。

ただし、C# の hoge.Count() のように、引数なしだと要素数が返ってくるということはなく、

「引数が足らない!」としかられるだけなので注意。

Windows 8.1 Update (Spring) を適用してみた

どうもみむらです。

何となく、わくわくして書きたくなったので。

無題

今日公開!と build で出ていましたので、早速 MSDN Subscription に接続してダウンロード。

 

一般向けに公開される際は、Microsoft Update の一つになったりするとおもいますが、
MSDN Subscription のユーザ向けには .msu ファイルの入った zip ファイルで提供されていました。

無題3

 

ということで、順番通りにインストール-。

image

 


インストール完了:

 

*スタートスクリーンでは無く、デスクトップが表示されるようになる。

image

タスクバーを右クリックし、プロパティをクリックすると出てくるこの画面。

ここの「スタート画面では無くデスクトップに移動する」のチェックが
既定で有効
になりまして、スタートスクリーンでは無くて、
デスクトップがいきなり表示されます。
(タッチなマシンだと、ここも変わってくると思います。)

・・もちろん、ここのチェックを OFF にすれば、従来通りの挙動になります。

 


*タスクバーにモダン UI のアプリも並ぶ

image

次に気づくのは、タスクバー上にモダン UI のアプリがいること。
ちゃんとマウスオーバーすれば普通のデスクトップアプリと同じように表示されます。

image

これも、「Windows ストアアプリをタスクバーに表示する」を OFF にすれば切ることが出来ます。

そして、このあたりも普通のデスクトップなアプリと同じようなことが行えます。

image

×ボタンを押して閉じるとか。

image

 


*スタートスクリーンに電源オプションがつく

image

スタートスクリーンの隅っこに、こんな感じでボタンが増えます。

ちなみに、アップデート適用前はこんな感じ:

無題

 

でもって、ここからも電源が切れたり、再起動できたりします。

image

 

もちろん、従来通りチャームを呼び出してもOK

image

 

 


*タイルを右クリックすると、メニューが出るように

image

アップデート前は、タイルの並び替えのモードに入りましたが、
今度からは右クリックメニューからアンインストールやライブタイルの ON/OFF などが
切り替えられるようになります。

 


*ストア版の IE で、タブ表示が既定になる。

image

ストア版 IE で、こういう感じで画面下部にタブが出続けるようになりました。
もちろんコレも、設定で切ることは出来ます。

 


*ストアアプリの上にマウスカーソルを持って行くと、閉じるボタンが出るようになる。

image

 

今までですと、画面上を掴んで、下に下げる・・なんて動作をマウスで行っていましたが、
アップデートされると、画面上部にマウスカーソルを持って行ったときに
最小化と閉じるボタンが出ます
ので、ここで管理できるようになります。

そして、このアプリを画面横に並べたりする際は、
今までのように「手の形」にして動かさなくても、
この黒い部分をドラッグすれば動くようになっています。

(デスクトップアプリのタイトルバーにほぼ近い挙動をします。)


*OneDrive

image

今回のアップデートで、ちゃんと名前が修正されたようです。

 


*PC設定の画面下部に「コントロールパネル」へのリンクがついた。

image

 


・・・ぱっと見つけたのはこのあたりでしょうか。

一般向けには 4月8日に公開されるそうですが、
MSDN Subscription を持っている方は入れてみてはいかがでしょうか。

細かいところが使いやすくなっていて、よいアップデートかなと思います。

(また、Build 内で公開されていたスタートメニューに関しては含まれていませんでした。 さすがにアレを見たときに「スタートスクリーンに慣れてきたし・・」と思っていたので、ある意味含まれないのはアリなのかなと。)

Olympic CTF 2014 参加。

どうもみむらです。

この前開催された Olympic CTF 2014 にいつものように wasamusume で参加しました。

・・最近無線を聞くのがちょっとした趣味なんですが、
それが CTF に効いたようです。


問題文。

We found illegal radio transmissions and saved them into dump for you. Please check it for data leakage.

というわけで早速、問題のファイルをダウンロードします。

Radio ということで、早速 HDSDR にぶっこんで眺めることに。

image

でもって、 –80.000 した場所に合わせると、 FM でなんかつぶやく声が。

image

 

・・・最初これを一生懸命聞き取ろうとしていたんですが、違いました。

 

ヒントとして、

olympics

こういう画像がでまして、 Google の画像検索で調べると “Radio Data System” と。

Radio Data SystemラジオデータシステムRDS)は、FMラジオにおいて選局中の放送局やその放送局で再生中の曲名をラジオに表示させるサービスである。

http://ja.wikipedia.org/wiki/Radio_Data_System

FMラジオということなので、 NFM ではなくて WFM だ!ということで
普段これもまたよくお世話になっている SDR# に読ませてみることに。

image

偶然にも、SDR# が Radio Data System に対応していたようで

image

このような感じで周波数表示の上に文字が表示されました。

 

あとは軽快な音楽を楽しみながら待っていると、

image

このような表示に。ということで、これがフラグ。

SECCON CTF–Web予選に参加してがんばった

にゃんぱすー。 どうもみむらです。

最近、今頃になって「のんのんびより」を見るようになりまして、
自宅付近にも無人の野菜直売所とかあるなーと、見ていてほのぼのしている今日この頃です。

 

さてさて。今回は SECCON CTF の Web予選に wasamusume として参加しました。

初日が所属する大学の中間発表日であったり、
普段使っているラップトップPC が不調になったりといろいろとありましたが、
とても楽しかったです。

運営の皆さん毎度毎度、本当にありがとうございます。

 

今回はいつものメンバーに zip さんを入れて。

やっぱりこういうのはみんなでワイワイとやるのが一番いいですね。
第一に楽しいですし、チーム内の解法は全体で共有しているので
新しく来たメンバーや既存のメンバーどっちもおいしい。
そして、交流も深まる。一石n鳥ってところでしょうか(

 

私は hyt さんと一緒に大学内に簡易CTF会場を設置して取り組みました。

BezbtJvCQAAyDn2

夜からは各々自宅にて。

なお、九州組は研究室泊まり込みでやったそうです。
次回はホテルとかを借りて、泊まり込みで CTF やりたいですね。

 

さて、こういうぶっ通しの CTF でたまに思うのは、
”休憩” と “食事” と “睡眠” でしょうか。効率よく取らないと。

さすがに初日が中間発表会であった関係で早起きしたこともあり、
終わり際はなかなかに眠くて仮眠を少し取りました。

・・だからといって、よく解けたかというと、うーん。

 

そういえば、一部ではなんでも “人権” ということで、
取得した得点によっては “ (CTF) 社会的に人間として認められる権利” が認められないことがあるそうで、怖い世の中です。

もちろん、 wasamusume 内ではチーム全員に “CTF 社会的に人間として・・” は
たとえ 0点であろうと認めます。 ・・・というか、これが剥奪されるチーム、怖すぎです。。

・・冗談はさておき。

 

 

今回紹介するのは
“Enjoy the Game”
“削除されているファイルの名前はなんですか?”
”ログインパスワードを解明せよ”
の3つを。


Enjoy the Game

image

こんな感じのゲームが起動します。
ゴールまで行けばフラグが出る、とのことですがゴールにいつまで経ってもたどり着けません。

でもって色々といじってみます。

image

画面が暗いのですが、オブジェクトの高さを0にしてみますと、
本来たどれない場所にゴールがあることに気づきます。

 

しょうが無いので、 IDA で動きを見てみますと、

image

0x1400016C7 に “cmp al,1” として、
前に進めるかどうかを判定している箇所がみつかりますので、
この先の jz を jmp に書き換えます。

一番シンプルな方法ということで、
game.exe の 0xAC9 にある 0x74 を 0xEB に書き換えます。

そうすると、 “74 04” ( jz 0x1001006 ) が “EB 04” ( jmp 0x1001006 ) となり、
壁に当たっていようがなんであろうが突進することが出来るようになります。

パッチ後:

image

すっきりですね!

 

 

でもって、ゴールの場所に直行すると、

image

このダイアログが。

 

このプログラムのデバッグ情報のファイル名が
”3D_GameAAA_is_NOT_password_Enjoy_HackingAAAAAAAA…” になっているところからも
分かるとおり、こいつは答えではありません。

 

ぐるぐる回って答えの場所に行きますと、 “3D_dUNGEAN” などいろいろと変化します。

その何れも NG でしたので、うーんと悩んでいたところ ゆったんが
”3D_dUnGEoN” として送信したところ正解。

・・・どういうルートを通ったら正しいんだろう・・。でも答えは見つかったし・・と。
ずいぶんともやもや。


削除されているファイルの名前はなんですか?

問題として、MFT のデータがもらえます。

http://malware-hunters.net/2012/09/13/mftdump-v-1-3-0-released/

ここにある MFTDump を使いますと、いい感じに tsv 形式で出してくれますので
後はその表を Excel なんかに入れて検索。

答えは SkyhookParser.exe

 


ログインパスワードを解明せよ

問題として、 1GB のメモリダンプが渡されます。

まず Volatility を使用して、 hivelist を出力して目的のファイルの場所を見つけます。

# volatility hivelist -f memorydump2.bin --profile=Win7SP1x86

Volatility Foundation Volatility Framework 2.3.1
Virtual    Physical   Name
---------- ---------- ----
0x9ff5a3c0 0x37fbb3c0 \SystemRoot\System32\Config\SECURITY
0x9ffc03a0 0x30e243a0 \SystemRoot\System32\Config\SAM
0x8f60c568 0x04bbc568 [no name]
0x8f61c008 0x005d2008 \REGISTRY\MACHINE\SYSTEM
0x8f6448d8 0x04b3c8d8 \REGISTRY\MACHINE\HARDWARE
0x90659650 0x199c0650 \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0x906d8008 0x13200008 \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0x93cf5008 0x38814008 \Device\HarddiskVolume1\Boot\BCD
0x93d479d0 0x388c19d0 \SystemRoot\System32\Config\SOFTWARE
0x989bc008 0x37920008 \SystemRoot\System32\Config\DEFAULT
0x9e6e69d0 0x005469d0 \??\C:\Users\forensics\ntuser.dat
0x9efe5650 0x028aa650 \??\C:\Users\forensics\AppData\Local\Microsoft\Windows\UsrClass.dat 

 

次に、SYSTEM と SAM のデータを用いて hashdump を実行します。

#volatility hashdump -f Memorydump2.bin --profile=Win7SP1x86 -y 0x8f61c008 -s 0x9ffc03a0

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
forensics:1000:aad3b435b51404eeaad3b435b51404ee:98ffdb1b29e7c88954326cd4011141d8:::

ここまで来れば、後は Ophcrack ( http://ophcrack.sourceforge.net/ ) を利用して、

パスワードを求めます。

手元のノートPCで数秒。 答えは “Kani3”


今回の CTF を通して、猛勉強しないとマズいなと強く実感した今日この頃です。。