SECCON2018FINAL(International) サーバ4
(Special instruction challenge)

■ 概要

CPUに追加されている特殊命令の仕様を入出力から推測し,その特殊命令をエミュレータ に実装する,という競技

■ テーマ

CPUにセキュリティ関連の特殊命令が追加実装されており,その仕様がクローズドに なっていた場合に,命令への入出力を見るだけで,その仕様がどれくらい推測され 得るのか,クローズドであることが安全なのかどうか

■ 競技内容

エミュレータに特殊命令を追加実装してある. (CPUに独自の命令が実装されている状況を想定)

またそのエミュレータで実行すればパスワードが得られるプログラムが配布される.

しかし独自追加なので,通常のエミュレータでは正常実行できない.

デバッガを駆使して特殊命令の仕様を調べ,自分でエミュレータに同等の実装を行い, プログラムを実行することで得点を得る,という競技.

■ 競技説明

■ アーキテクチャ一覧

アーキテクチャ gdbサーバ 乱数アルゴリズム デフォルト値
シード パラメータ
Blackfin 線形合同法(32bit)
uint32_t value, param0, param1;
value = value * param0 + param1;
1param0 = 1103515245
param1 = 12345
MSP430 M系列(16bit)
uint16_t value, mask;
if (value & 0x8000)
  value = ((value << 1) | 1) ^ mask;
else
  value <<= 1;
0xfaafmask = 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;
}
0x900dfaceseq = 1
a = 9, b = 5, c = 14
V850 0xbadbeefseq = 3
a = 1, b = 3, c = 10
MIPS64 0xbadbadbadbadbeefseq = 2
a = 34, b = 41, c = 23
ARM Blackfinと同じ
RL78 MSP430と同じ
MicroBlazeMN10300と同じ
MIPS V850と同じ
AArch64 MIPS64と同じ

■ 解法

runme.x からパスワードを取得するには,いくつかの方法がある.

序盤では簡単な方法で対応できるが,徐々に対応しきれなくなり,最終的には シミュレータに実装しないと追い付かない,というような競技設計になっている.
(よって競技者の解法は,方法1→方法2/3/4→方法5のように遷移していくように 設計してある)

(方法1)

(方法2)

(方法3)

(方法4)

(方法5)

■ 進行

大まかに,以下のような進行になるように設計してある.

(競技の推移の設計)

■ ポイント

アーキテクチャや正答するためのポイントは盛りだくさんになっている.

これは,すべてのアーキテクチャやポイントを攻略しなければ得点が得られないと いうことではない.
runme.xはチームフラグの更新のタイミングで新しいものが再生成され, 最新のものから得られるパスワードでないと,チームフラグはコミットできない.
runme.xの再生成の際には,その都度,アーキテクチャやデコードのアルゴリズムが 変更される.

このため,多くのアーキテクチャやポイントを攻略することで,多くのタイミングで 防御ポイントが得られ,高得点が得られる,という競技設計になっている.
(最初のうちは簡単な対応で得点できるが,徐々に様々な対応をしないとすべての タイミングで得点できないので,引続き対応を行う,というモチベーションになる)

■ 乱数ごとのポイント

(線形合同法)

(M系列)

(xorshift)