またそのエミュレータで実行すればパスワードが得られるプログラムが配布される.
しかし独自追加なので,通常のエミュレータでは正常実行できない.
デバッガを駆使して特殊命令の仕様を調べ,自分でエミュレータに同等の実装を行い, プログラムを実行することで得点を得る,という競技.
| アーキテクチャ | gdbサーバ | 乱数アルゴリズム | デフォルト値 | |
|---|---|---|---|---|
| シード | パラメータ | |||
| Blackfin | 有 | 線形合同法(32bit)
uint32_t value, param0, param1; value = value * param0 + param1; |
1 | param0 = 1103515245 param1 = 12345 |
| MSP430 | M系列(16bit)
uint16_t value, mask; if (value & 0x8000) value = ((value << 1) | 1) ^ mask; else value <<= 1; |
0xfaaf | mask = 0x2240 | |
| MN10300 | xorshift (32bit(MN10300, V850) / 64bit(MIPS64))
uint32_t v; (32bit(MN10300, V850))
uint64_t v; (64bit(MIPS64))
int seq, a, b, c;
switch (seq) {
case 0: v = v ^ (v<<a); v = v ^ (v>>b); v = v ^ (v<<c); break;
case 1: v = v ^ (v>>a); v = v ^ (v<<b); v = v ^ (v>>c); break;
case 2: v = v ^ (v<<a); v = v ^ (v<<c); v = v ^ (v>>b); break;
case 3: v = v ^ (v>>a); v = v ^ (v>>c); v = v ^ (v<<b); break;
}
|
0x900dface | seq = 1 a = 9, b = 5, c = 14 | |
| V850 | 0xbadbeef | seq = 3 a = 1, b = 3, c = 10 | ||
| MIPS64 | 0xbadbadbadbadbeef | seq = 2 a = 34, b = 41, c = 23 | ||
| ARM | 無 | Blackfinと同じ | ||
| RL78 | MSP430と同じ | |||
| MicroBlaze | MN10300と同じ | |||
| MIPS | V850と同じ | |||
| AArch64 | MIPS64と同じ | |||
序盤では簡単な方法で対応できるが,徐々に対応しきれなくなり,最終的には
シミュレータに実装しないと追い付かない,というような競技設計になっている.
(よって競技者の解法は,方法1→方法2/3/4→方法5のように遷移していくように
設計してある)
これは,すべてのアーキテクチャやポイントを攻略しなければ得点が得られないと
いうことではない.
runme.xはチームフラグの更新のタイミングで新しいものが再生成され,
最新のものから得られるパスワードでないと,チームフラグはコミットできない.
runme.xの再生成の際には,その都度,アーキテクチャやデコードのアルゴリズムが
変更される.
このため,多くのアーキテクチャやポイントを攻略することで,多くのタイミングで
防御ポイントが得られ,高得点が得られる,という競技設計になっている.
(最初のうちは簡単な対応で得点できるが,徐々に様々な対応をしないとすべての
タイミングで得点できないので,引続き対応を行う,というモチベーションになる)
$ bfin-elf-run --environment user runme.x $ mips64-elf-run --memory-region 0x100000,0x10000 runme.x
| シード | 出力 | 備考 | |
|---|---|---|---|
| 16進数 | 2進数 | ||
| 1 | 0x00000021 | 00000000 00000000 00000000 00100001 | ここからシフト順がRLRかRRLで,左シフト量が5(b = 5)であることがわかる |
| 0x80000000 | 0x88422100 | 10001000 01000010 00100001 00000000 | b = 5 でRLR/RRLのいずれかでこれらを満たすのは a=9, c=14, RLRのとき |
| 0xFFFFFFFF | 0x0F803E00 | 00001111 10000000 00111110 00000000 | |