またそのエミュレータで実行すればパスワードが得られるプログラムが配布される.
しかし独自追加なので,通常のエミュレータでは正常実行できない.
デバッガを駆使して特殊命令の仕様を調べ,自分でエミュレータに同等の実装を行い, プログラムを実行することで得点を得る,という競技.
アーキテクチャ | 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 |