1 日本ソフトウェア科学会第 28 回大会 (2011 年度) 講演論文集 Malbolge の高級アセンブリ言語への加算命令の追加 安藤 聡 酒井 正彦 坂部 俊樹 草刈 圭一朗 西田 直樹 Malbolge は最も 難解な プロ グ ラ ミ ン グ 言語の一つと し て 知ら れて おり , その難解性から Malbolge を 用いて プ ロ グ ラ ミ ン グ を 行う こ と 自体がプロ グ ラ ム 難読化になり 得る こ と が飯澤ら によ っ て提案さ れた. その中で, Malbolge プロ グ ラ ミ ン グ を よ り 効率よ く 行う ための高級ア セン ブリ 言語が設計さ れたが, 高級ア セン ブリ 言語の算術命令には イ ン ク リ メ ン ト と デク リ メ ン ト し か存在せず, 加算を 行う にはイ ン ク リ メ ン ト を 繰り 返し 用いる 必要があ っ た. 本論 文では, 高級ア セン ブリ 言語への加算命令の追加を 行う . こ れを 処理する ために, Malbolge 向き の加算ア ルゴ リ ズ ム が何かを 考え , そのア ルゴ リ ズム を 低級ア セン ブリ 言語で実装する . 1 はじめに 作成し た プロ グ ラ ム を 不特定多数のユーザーに配 布する 場合, プロ グ ラ ム の改ざ ん防止やア ルゴ リ ズ (=<‘$9]7<5YXz7wT.3,+O/o’K%$H"’~D|#z@b=‘{^Lx8%$X mrkpohm-kNi;gsedcba‘_^]\[ZYXWVUTSRQPONMLKJIHGFE DCBA@?>=<;:9876543s+O<oLm 図1 HEllO WORld 出力プログラム ム な ど の知的財産の保護を 目的と し て , プロ グ ラ ム の内部を 解析困難にする よ う に求めら れる 場合があ る . そのよ う な場合には, プロ グ ラ ム を 解析が困難に な る よ う に変換する 手法が有用であ る と 考え ら れる . こ のよ う な同一言語上のプロ グ ラ ム の等価変換は, こ れま でプログラム難読化と 呼ばれている [1]. こ れに対し , 難解プロ グ ラ ミ ン グ 言語を 用いて プ れている Malbolge [3] が用いら れている . 本研究の目的は, 飯澤ら の成果を 基に Malbolge プ ロ グ ラ ミ ン グ を さ ら に容易にする こ と であ る . Malbolge は, その難解性から プロ グ ラ ム の解析だ けでなく プロ グ ラ ム の作成さ え 非常に困難であ り , “人類が 設計し う る 最も 邪悪な 言語” な ど ど 称さ れ ロ グ ラ ミ ン グ を 行う こ と がプロ グ ラ ム 難読化の手法 る . 図 1 に, Malbolge プロ グ ラ ム のサン プルと し て の一つにな り え る こ と が飯澤ら によ り 提案さ れた [2]. “HEllO WORld” を 出力する プロ グ ラ ム ソ ース [4] を 難解プロ グ ラ ミ ン グ 言語( 以降, 難解言語) と は, 意 示す. Malbolge プロ グ ラ ミ ン グ を 困難にし ている 理 図的にその言語でのプロ グ ラ ミ ン グ が困難になる よ う 由と し ては, 次の三点が主に挙げら れる . に設計さ れた言語であ り , こ のよ う な言語で書かれた プロ グ ラ ム は解析困難性を も つため, ソ フ ト ウ ェ アプ ロ テ ク ショ ン に関し て 有益であ る と 考え ら れて いる . 文献 [2] では, 難解言語の中でも 特に難解と し て 知ら Introducing Addition Instruction into High-Level Assembly Language for Malbolge. Satoshi Ando Masahiko Sakai Toshiki Sakabe Keiichirou Kusakari Naoki Nishida, 名古屋大学 大 学院情報科学研究科, Graduate School of Information Science, Nagoya University. • プロ グ ラ ム ロ ード 時のメ モリ の初期値に著し い 制約があ る • 命令の強制的な 動的書き 換え によ り , コ ード の 反復実行が困難であ る • 演算用・ 制御用と も に極めて 限定的な 命令し か 持たない こ れら の各問題点に対し 飯澤ら は解決策を 提案し , そ れに基づき Malbolge のための言語と し て, Malbolge の演算命令を 拡張し た 疑似命令, ループプロ グ ラ ム 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 2 が作成可能な低級アセン ブリ 言語, なら びに, 低級ア セ ン ブリ プロ グ ラ ム を 用いて 基本モジュ ール方式で 実現さ れる 高級ア セン ブリ 言語を 設計し た . し かし , const char xlat1[] = "+b(29e*j1VMEKLyC})8&m#~W>qxdRp0w" "krUo[D7,XTcA\"lI.v%{gJh4G\\-=O@5" "‘_3i<?Z’;FNQuY]szf$!BS/|t:Pn6^Ha"; こ れら の言語の中で最も 命令が豊かであ る 高級ア セ 図2 ン ブリ 言語においても , 算術命令にはイ ン ク リ メ ン ト と デク リ メ ン ト し か存在し ておら ず, こ れま で加算を 行う た めにはイ ン ク リ メ ン ト を 繰り 返し 用いら な け ればなら なかっ た. const char xlat2[] = "5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+" "Q;>U!pJS72FhOA1C"B6v^=I_0/8|jsb9" "m<.TVac‘uY*MK’X~xDl}REokN:#?G\"i@"; 本論文では, 高級アセン ブリ 言語へ加算命令を 追加 図3 し , 次のよ う に実現し た. • 低級ア セン ブリ 言語での加算モジュ ールの作成. 変換表 xlat1 変換表 xlat2 Malbolge プロ グ ラ ム は 59048 文字未満の印字可能 こ れは飯澤ら の提案し た プロ グ ラ ミ ン グ 手法に 文字( ASCII 値:33 ∼126) の列であ り , ス ペース と 従い, 以下の順に行っ た 改行は無視さ れる . ま た , 各 p 文字目におけ る 印字 Step1 Malbolge 向き の加算ア ルゴ リ ズ ム の 検討 Step2 Step1 のアルゴ リ ズム の疑似命令列で の実現 Step3 Step2 の疑似命令列の低級アセン ブリ 可能文字 c は, 変換表 xlat1[(c-33+p)%94)] によ る 解釈で i, j, p, *, /, <, v, o の 8 文字のいずれか に該当せねばなら ず, それ以外の場合はロ ード 時にエ ラ ーと な る . こ こ で xlat1 は図 2 のよ う に定義さ れ ている . ま た実行ス テッ プ中に実行さ れた命令 c は, プロ グ ラ ム へのコ ーディ ン グ 変換表 xlat2[c-33] によ っ て置換さ れ別の文字( 値) • 加算モジュ ールを 用いた加算命令の実現 に書き 換え ら れる . こ こ で xlat2 は図 3 のよ う に定 本論文の構成も こ の過程の順に従い, 第 2 節で Mal- bolge と 飯澤ら が設計し た 言語ついて 述べた のち に, 義さ れている . Malbolge の 仮想機械はメ モ リ ( mem) と 3 つの 第 3 節で Step1 について , 第 4 節で上記の Step2 で レ ジ ス タ ( コ ー ド ポ イ ン タ C, デ ー タ ポ イ ン タ 用いる , Malbolge プロ グ ラ ミ ン グ で重要と な る 二引 D, ア キ ュ ム レ ー タ A) を 持 ち , 1 ワ ー ド は 三 進 数三値関数を 実現する 疑似命令列の探索手法につい 数十桁( 10trits) で あ る た め メ モ リ 領域も 10trits て, 第 5 節で Step2, Step3 について述べる . そし て で 表現さ れる . こ の た め 値の 範囲は, 三進数表 第 6 節で作成し た 加算モジュ ールを 用いた 加算命令 現 で 0000000000t∼2222222222t, 十 進 数 表 現 で は の実現について述べ, 最後に第 7 節で本論文で行っ た 0∼59048( = 310 − 1) と な る . こ こ で , 三進数表 こ と ・ 明ら かになっ たこ と を ま と める . 現の末尾に t を 用いている のは十進数と 区別する ため であ る . 2 Malbolge とその関連する言語について 表 1 に Malbolge の各命令について の説明と そ の 本節では Malbolge の仕様についてその重要な部分 ニ ーモニッ ク 表記を 示す. こ れ以降では, Malbolge を 説明する . ま た飯澤ら が設計し た Malbolge のため の命令を 便宜的にニ ーモニッ ク 表記で記述する . こ の言語であ る , 疑似命令, 低級アセン ブリ 言語, 高級 こ で, mem[p] は, ア ド レ ス p のメ モリ 値を 表し てい ア セン ブリ 言語のそれぞれについて概説する . る . OPR 命令の演算 op(X,Y ) は, 三進数で表さ れた 二引数 X = x1 x2 · · · x10 と Y = y1 y2 · · · y10 の各桁 2. 1 Malbolge xi , yi 同士で表 2 に従っ て 計算を 行う . こ のよ う に Malbolge [3] は仮想機械上で動作する 機械語と し 三進数で表さ れた二引数の各桁であ る 表に基づき 計算 て 定義さ れ, 開発者が C 言語で実装し た イ ン タ プリ を 行う 関数を 二引数三値関数と 呼ぶ. 文献 [2] におい タ によ っ てその意味が定めら れている . て , op 関数を 合成する こ と によ っ て 任意の二引数三 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 表1 命令 i j p * / < o v ROT OPR OPR OPR OPR Malbolge の命令とその説明 説明と ニーモニッ ク 表記 ジャ ン プ. C:=mem[D].’JMP’ D レ ジス タ の更新. D:=mem[D].’MOV D’ 演算命令. A,mem[D]:=op(A,mem[D]).’OPR’ 右ロ ーテート . A,mem[D]:=rotr(mem[D]).’ROT’ 入力. A:=getchar().’INPUT’ 出力. putchar(A).’OUTPUT’ 無操作. 何も 行わない. ’NOP’ 終了. プロ グ ラ ム の実行を 停止. ’HALT’ 表2 op(X,Y ) の各桁の演算 0 1 1 2 0 1 2 yi 表3 xi 1 0 0 2 2 0 2 1 疑似命令 命令 操作 ROT X OPR X INPUT OUTPUT A,X := rotr(X) A,X := op(A,X) A := getchar() putchar(A) CON1 Y Y X X 図4 表4 3 INPUT OPR Y OPR X OUTPUT 疑似命令列の例 命令・フラグとその操作 命令 操作 ROT label A,[label] := rotr([label]) REV ROT ROT 命令の復元 OPR label A,[label] := op(A,[label]) REV OPR OPR 命令の復元 JMP label PC:= [label] MOV PC label PC:= [label] REV MOV PC MOV PC 命令の復元 INPUT UNIT A:=getchr() REV INPUT INPUT 命令の復元 OUTPUT UNIT putchr(A) REV OUTPUT OUTPUT 命令の復元 FLAG label 命令が MOV PC であ る 場合 (ON):MOV PC と 同様 命令が NOP であ る 場合 (OFF):何も し ない 命令実行後には FLAG がフ リ ッ プさ れる FLAG+1 FLAG がフ リ ッ プさ れる (ON↔OFF) の値を 出力する 疑似命令列を 示す. こ こ で, 各変数 X , Y の初期値は任意の値と する . 値関数を 実現でき る こ と が示さ れて いる . 以下に op 演算の例を 示す. 2. 3 低級アセンブリ言語 op(0120120120t, 0001112222t) = 1001022212t 低級アセンブリ言語 [2] は, 強制的な 命令の動的書 ROT 命令の演算子 rotr は引数の 10trits の値に対し て き 換え によ り Malbolge で ループプロ グ ラ ム 作成が 右ロ ーテート を 行う . 以下に例を 示す. 困難と いう 問題を 解決する た めに設計さ れた 言語で rotr(0001112222t) = 2000111222t ある . 低級アセン ブリ 言語は Malbolge と 同じ メ モリ 空間 2. 2 疑似命令 を 持つ仮想機械と し て定義さ れる . レ ジス タ は PC と 疑似命令 [2] は, Malbolge の演算命令や入出力命令 A の 2 つを 持ち, 値は 10trits で表現さ れる . 低級ア の表現を よ り わかり やすく し , 引数にメ モリ 名を 指定 セン ブリ プロ グ ラ ム は, メ モリ アド レ ス を 表すラ ベル でき る よ う にし たも のであ る . 命令列の実行は逐次実 を 付加可能なデータ の列によ っ て定義さ れる . 各デー 行のみと し , 反復実行や条件分岐は考え ない. タ は変数と 命令, およ びフ ラ グ のいずれかであ り 一行 表 3 に疑似命令と その操作について 示す. こ こ で, で記述さ れる . 命令やフ ラ グ の引数にはラ ベルを 用 疑似命令列の引数に特別な 変数と し て CON 0( 初期 いる . 低級ア セン ブリ 言語の命令を 表 4 にま と めた . 値: 0000000000t) , CON 1( 初期値: 1111111111t) , ただし , [label] は label でラ ベル付けさ れたデータ を CON 2( 初期値: 2222222222t) , P AT 20( 初期値: 表し ており , A は A レ ジス タ であ る . 2222222220t) を 利用でき る も のと する . 図 4 に例と し て, 入力さ れた値を X に代入し , そ 表 4 から 分かる よ う に, JMP を 除いた 各命令には そ の復元命令が存在する . プロ グ ラ ム を 記述する 際 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 4 L1: REV MOV PC JMP ENTRY: CON1: # (ラ ベル):(データ ) L2 ROT CON1 # エン ト リ ーラ ベル 1111111111t # 三進数表現の定数 PROGRAM INIT: Loop: INPUT Var X MOV Var X,Var Y INC Var Y BRANCH Var Y,Var Exit OUTPUT Var X BRANCH Zero,Var Loop STOP REV ROT L2: OPR Y Y: 0 # 十進数表現の定数 Exit: REV OPR FLAG2+1 FLAG2 L3 FLAG1 L2 L3: OPR X X: 0 表5 命令と操作 操作 FLAG2+1 INC label [label] := [label]+1 FLAG2 L6 DEC label [label] := [label]−1 L3 MOV label1,label2 [label2] := [label1] INPUT UNIT BRANCH [label1]= 0 の時,IP:=[label2] DUP label1,label2 それ以外の場合何も し ない REV INPUT INPUT label [label]:=getchr() FLAG2+1 OUTPUT label putchr([label]) MOV PC L1 MASK label1,label2 [label2]:=mask([lable1],[label2]) OUTPUT UNIT ROTATE label [label]:=rotr([label]) DUP STOP 実行の停止 FLAG1 L6: 高級アセンブリプログラムの例 命令 REV OPR L4: 図6 REV OUTPUT RETURN: 図5 END 表6 図 4 の低級アセンブリプログラム 関数 mask(X,Y ) の表 には, プロ グ ラ ム 実行時にあ る 命令が実行さ れた 後 そ の命令の復元命令が実行さ れる よ う にする 必要が yi あ る . フラグはフ リ ッ プフ ロ ッ プの役割を 果たし てお 0 1 2 0 0 2 0 xi 1 0 0 1 2 0 1 2 り , こ れによ っ て実行を 制御する . 変数の値には, 定 数と し て十進数( 0∼59048) と 三進数( 0000000000t と いう ラ ベルはエン ト リ ーポイ ン ト を 表す. 命令の引 ∼2222222222t) が利用でき , 特別な 定数と し て 任意 数には変数かラ ベルを 用いる . 例と し て 図 6 に高級 の定数を 表す DUP が利用でき る . アセン ブリ プロ グ ラ ム の例を 示す. こ れは, 標準入力 図 5 に, 図 4 の疑似命令列を 低級ア セン ブリ プロ によ り 入力さ れた 文字を 標準出力する プロ グ ラ ム で グラ ム に変換し た例を 示す. ただし , こ こ で, “#” か あ り , EOF( =59048) が入力さ れる ま で繰り 返し 実 ら 改行ま でを コ メ ン ト と し , “ENTRY” を PC の初期 行さ れる . こ こ でプロ グ ラ ム 中の変数 Zero は 0 を 表 値を 表すエン ト リ ーラ ベルと する . し ている . 高級アセン ブリ プロ グラ ム 内の記述で使用でき る 命 2. 4 高級アセンブリ言語 令を 表 5 にま と めた . INC 命令の引数の値が 59048 高級アセンブリ言語 [2] は Malbolge プロ グ ラ ミ ン のと き の演算結果は 0, DEC 命令の引数の値が 0 のと グ を よ り 容易にする こ と を 目的と し て 設計さ れた 言 き の演算結果は 59048 と する . MASK 命令で使用する 語であ る . こ のため, 値の取る 範囲は 10trits であ る . 関数 mask(X,Y ) は表 6 に従い計算を 行う 二引数三値 高級ア セ ン ブリ プロ グ ラ ム は, ア ド レ ス を 表す省 略可能な ラ ベルがついた 命令「( ラ ベル名) :( 命令) ( 引数) 」 の列で定義さ れる . 特に “PROGRAM INIT” 関数であ る . IP については第 2. 5 節で説明する . 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 メ イ ン ルーチン モジュ ール 2 呼び出し 引数ラ ベル 引数ラ ベル モジュ ール 1 呼び出し 引数ラ ベル モジュ ール 3 呼び出し 引数ラ ベル 引数ラ ベル . . . 図7 表7 基本モジュ ール群 モジュ ール 1 モジュ ール 2 モジュ ール 3 モジュ ール 4 . . . 基本モジュール方式 yi 5 sum(X,Y ) の表 0 1 2 0 0 1 2 xi 1 1 2 0 2 2 0 1 ブリ プロ グ ラ ム への変換は実現さ れておら ず, ノ ウ ハ ウ を 用いて手変換する 必要があ る . 2. 5 高級アセンブリプログラムの実現 3 Malbolge 向けの加算アルゴリズム 高級ア セ ン ブリ プロ グ ラ ム は, 基本モジュ ール方 こ れま で Malbolge における 加算はイ ン ク リ メ ン ト 式 [6] を 利用し て 低級ア セン ブリ プロ グ ラ ム で実現さ を 用いて のみ実現さ れて いた . し かし n1 < n2 の加 れている [2] [5]. こ れは, あ る 仮想マシン を Malbolge 算 n1 + n2 を 考え た と き に, そ の実現方法ではイ ン 上に実装し ており , その仮想マシン はプロ グ ラ ム カ ウ ク リ メ ン ト を n1 回繰り 替えさ なければなら ず, n1 が ン タ IP と レ ジ ス タ REG0, REG1 を 持つ. レ ジ ス 非常に大き な数であ っ た場合効率が悪い. タ や IP は低級ア セン ブリ プロ グ ラ ム の特定の変数で そこ で, 本節では Malbolge で効率よ く 加算を 実現 あ る ため, 低級ア セン ブリ 言語のレ ジス タ ( A, PC) する ためのア ルゴ リ ズ ム を 検討する . Malbolge の仕 と は異なる . こ の低級アセン ブリ プロ グ ラ ム を 高級ア 様よ り , こ こ で扱う 値はすべて 10trits で表現でき る センブリ言語の実行系と 呼ぶ. 値と する . 高級ア セン ブリ プロ グ ラ ム の実現に用いた 基本モ ジュール方式と は, プロ グ ラ ミ ン グ を 容易にする こ と 3. 1 問題点と解決策 を 目的と し て定義さ れたも ので, 基本モジュ ールと 呼 こ れま で Malbolge で加算が実現さ れていなかっ た ばれる あ る 機能を 持た せた 命令列と , そ れら を サブ 理由に, 利用可能な演算命令が限定さ れている こ と が ルーチン コ ールのよ う に呼び出すメ イ ン ルーチン で 挙げら れる . 第 2. 1 節でも 述べたよ う に Malbolge の 構成さ れる ( 図 7) . 高級ア セン ブリ プロ グ ラ ム はこ 演算命令は OPR と ROT の二つのみであ り , OPR は表 2 のメ イ ン ルーチン にあ たり , 高級アセン ブリ 言語の各 の op 演算を 桁毎に行う 命令で, ROT は右ロ ーテート 命令と 同じ 機能を 持つ低級ア セン ブリ プロ グ ラ ム を 命令であ る . こ れら の命令を 用いて 実現する 演算は, 基本モジュ ールと し て呼び出し ている . すべて の桁を 平等に扱う も の以外非常に困難であ り , ど のよ う に加算の桁上げを 行う かが問題であ っ た. 2. 6 言語間の関係 こ れま でに述べて き た 言語について , 高級ア セ ン その解決策と し て, 二つの二引数三値関数を 用いて それぞれが桁を 特別扱いし ない加算を 用いる . ブリ プロ グ ラ ム から 低級ア セン ブリ プロ グ ラ ム に変 換する 手法 [2] [5] と 低級ア セ ン ブ リ プ ロ グ ラ ム か ら 3. 2 加算アルゴリズム Malbolge プロ グ ラ ム に変換する 手法 [2] が提案さ れ 二つの二引数三値関数を 用いた 加算ア ルゴ リ ズ ム ている . 後者の変換を 行う ア セン ブラ [2] が存在する . を 述べる . こ こ で二つの関数と は, 入力の二数に対し ただし こ の低級アセンブラは, 入力プロ グ ラ ム に合わ 桁上げを 考えない加算を 行う 関数 sum( 表 7) と , 入 せて エン ト リ ーラ ベルのア ド レ ス 値の指定やデータ 力の二数の加算に関する 桁上げのみの計算を 行う 関 のメ モリ 領域の指定を 低級ア セン ブラ のソ ース コ ー 数 carry( 表 8) であ る . ド に記述する 必要があ る . 疑似命令列から 低級アセン 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 6 表8 yi carry(X,Y ) の表 0 1 2 0 0 0 0 xi 1 0 0 1 表9 ス テッ プ X sum(X,Y ) Y carry(X,Y ) 1 0120120120t 0121202010t 0121202010t 0121000110t 0121000110t 0122010110t 0122010110t 0122010110t .. . 0122010110t 0122010110t 0001112220t 0000010110t 0000101100t 0000101000t 0001010000t 0000000000t 0000000000t 0000000000t .. . 0000000000t 0000000000t 2 0 1 1 2 3 入力 10trits で表さ れる 二つの値 出力 入力の二数を 足し 合わせた数 アルゴリズム 1. 入力の二数を 変数 X , Y に入れる 加算アルゴリズムの実行例 1 4 .. . 10 2. X , Y に対し て関数 sum の演算を 行う 3. X , Y に対し て関数 carry の演算を 行う 59048( =2222222222t) と 2( =0000000002t) の加 4. 2 の演算結果を X にコ ピ ーする 算には, 10 ス テッ プが必要であ る . 正し い加算結果 5. 3 の演算結果を 左に 1trit シフ ト し , 最下位 は 59050( =10000000001t) である が, アルゴ リ ズム trit を 0 ク リ ア の後, Y にコ ピ ーする 6. 2 から 5 を 10 回繰り 返す の仕様に沿っ て計算結果はオーバーフ ロ ーを 切り 捨て た値 1( =0000000001t) であ る . 7. X を 出力する ア ルゴ リ ズ ム の実行例を 表 9 に示す. 表の値はア ルゴ リ ズ ム の繰り 返し 開始時の X , Y の値と , その 4 二引数三値関数を実現する疑似命令列の探 索手法 X , Y に対し て 関数 sum と 関数 carry の演算を 行っ 第 3 節で提案し た ア ルゴ リ ズ ム を 疑似命令列で実 た結果の値である . こ の例は 11355( =0120120120t) 現する 上で, アルゴ リ ズム で用いる 二つの二引数三値 と 1131( =0001112220t) の 加算を 行っ て おり , 計 関数 sum, carry を 実現する 疑似命令列を 見つける 必 算結果は 10 ス テッ プ 目の sum(X,Y ) の値で 12486 要があ る . ( =0122010110t) と なり 加算と し て正し い結果と なっ そこ で本節では, 単純な三値関数であ る 二引数三値 て い る . こ の 例で は 3 ス テッ プ が 終了し た 時点で 関数を 実現する 疑似命令列の探索法について 述べる . carry(X,Y ) の 値が 0 に なっ て おり , そ れ以降の ス こ こ で, あ る 二引数三値関数 f を 疑似命令列 I が実 テッ プは X に 0 を 足す操作の繰り 返し と なっ ている . ア ルゴ リ ズ ム の仕様と し て , 桁上げによ っ て オー バーフ ロ ーが発生し た場合, 桁上げを 計算し 左に 1trit 現する と は, 入力を X , Y と し 出力を A レ ジス タ と し た と き , 疑似命令列 I を 実行し た 直後の A レ ジ ス タ の値が f (X,Y ) と なる こ と であ る . ずら し た 後に 最下位 tirt を 0 ク リ ア し て いる の で , 第 4. 1 節で任意の二引数三値関数が疑似命令列で オーバーフ ロ ー分の最上位 trit が切り 捨て ら れた 値 実現でき る こ と を 示す. その後に, 第 4. 2 節で二引数 が出力と なる . 三値関数を よ り 少な い命令数で実現する 疑似命令列 ま た ア ルゴ リ ズ ム が一定時間で停止する 理由と し て, こ のア ルゴ リ ズム で扱う 値は 10tirts で表現でき を 探索する ア ルゴ リ ズ ム を 示し , 第 4. 3 節でそ れを 実装し たプロ グ ラ ム の評価を 行う . る 数であ る ので, ど れだけ桁上げが発生し たと し ても 最大 10 回で収ま る . そのためア ルゴ リ ズム の繰り 返 4. 1 二引数三値関数の疑似命令列での実現 し を 10 回にする こ と によ り 必ず計算は終了する ので, こ こ では, 任意の二引数三値関数を 疑似命令列で実 イ ン ク リ メ ン ト のよ う に計算量が増え る こ と はな い. 例と し て , 最も 桁上がり が発生する 例の一つであ る 現でき る こ と を 示す. 第 2 節で紹介し た よ う に, OPR 命令に用いら れる 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 表 10 インクリメント用の関数 inc(X,Y ) yi 0 1 2 0 0 1 1 xi 1 1 2 2 ROT OPR OPR OPR OPR ROT 2 2 0 0 CON1 Z Z Y Y CON2 図8 OPR ROT OPR OPR OPR 7 ROT OPR ROT OPR X CON2 X Z Y 変数コピー 図9 CON2 X CON2 X A レジスタへのロード op 関数を 合成する こ と によ り 任意の二引数三値関数 が実現でき る こ と がすでに文献 [2] で示さ れて いる . ま た, その調査に用いら れた op 関数合成プロ グ ラ ム を 利用する こ と で, 特定の二引数三値関数を 実現する op 関数の合成を 知る こ と ができ る . 例えば, 表 10 に 対し op 関数合成プロ グ ラ ム を 用いる と , 以下の式で 表 10 を 実現でき る こ と が分かる . op(op(op(X,CON0),op(CON2,op(Y,CON0))),op(CON2,X)) こ のよ う な式を シス テマティ ッ ク に疑似命令列に変 ROT OPR ROT OPR OPR ROT OPR ROT CON2 Y CON2 Y S CON2 S CON2 OPR ROT OPR OPR OPR ROT OPR ROT 図 10 X CON2 X CON0 S CON2 X CON2 OPR ROT OPR OPR S CON2 S X 表 10 を実現する疑似命令列 換する こ と が出来れば, 任意の二引数三値関数を 疑似 ROT OPR OPR ROT OPR 命令列で実現でき る こ と がいえ る . こ の変換で問題と なっ て く る のが, OPR 命令が A レ ジ ス タ の値と 変数 X の値について op 演算を 行い, その結果を A レ ジス タ と X に代入し ている こ と であ る . こ の破壊代入と も 呼べる 操作によ り OPR 命令の 引数であ る X は上書き さ れてし ま い, X の値を 繰り 返し 用いる こ と ができ ない. ま た OPR 命令は op 演算 の第一引数に A レ ジ ス タ を と っ て いる ので, 上記の 式のよ う に直接変数を 第一引数に指定する こ と がで き ない. こ れら の問題の解決策と し て, 次の手法を 提案する . • op 関数合成プロ グ ラ ム によ っ て得ら れた式で複 数の op 演算の第二引数が同じ 変数であ っ た場合 あ ら かじ め必要な 数だけ そ の変数の値を 別の変 数にコ ピ ーし ておく • op 演算の第一引数が変数であ っ た場合はその変 数の値を A レ ジス タ へロ ード する 操作を 行う 変数コ ピ ーと A レ ジ ス タ へのロ ード は, それぞれ図 8, 図 9 の疑似命令列で行う こ と ができ る . こ こ で, 変数コ ピ ーの疑似命令列で Z は作業用変数で あ り , 図 11 CON2 Y S CON2 S ROT OPR OPR OPR OPR CON2 X CON0 S X 表 10 を実現するより短い疑似命令列 提案手法によ り , op 関数合成プロ グ ラ ム で得ら れ る 式を すべてシス テマティ ッ ク に疑似命令列に変換す る こ と ができ る . 提案手法を 用いて表 10 を 実現する 式を 疑似命令列に変換し たも のを 図 10 に示す. こ こ で変数 S の初期値は CON0 と する . 以上によ り , 任意の二引数三値関数を 疑似命令列で 実現でき る こ と がいえ た. し かし , こ の手法で見つけら れる 疑似命令列は必ず し も 最短のも のと は限ら ない. たと え op 関数合成プ ロ グ ラ ム によ り 得ら れる 式が最短であ っ た と し て も , 特定の二引数三値関数を 実現する op 関数の合成は複 数存在する . 実際, 表 10 は図 11 の疑似命令列でも 実 現でき る . こ こ で変数 S の初期値は CON0 と する . Malbolge のメ モリ は固定であ る ため, でき る だけメ モリ を 節約する こ と を 考えなければなら ず, 二引数三 X がコ ピ ー元の変数, Y がコ ピ ー先の変数で あ る . 値関数を 疑似命令列で実現する 場合にはよ り 少な い 変数 Y , Z の初期値は任意であ る . A レ ジ ス タ への 命令数のも のを 用いる こ と が望ま し い. ロ ード の疑似命令列は, 変数 X の値が A レ ジス タ へ ロ ード さ れる . 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 8 4. 2 疑似命令列探索のアルゴリズム 表 11 任意の二引数三値関数を よ り 短い命令数で実現す 1 クリアの関数 1clear(X,Y ) の表 る 疑似命令列を 網羅的に探索する ア ルゴ リ ズ ム を 述 べる . yi ま ず次を 定義する . 0 1 2 0 1 1 1 xi 1 1 1 1 2 1 1 1 INS(I) {ROT CON 0, ROT CON 1, ROT CON 2, OPR X, OPR Y , OPR Ai | 0 ≤ i ≤ I } ただし , 変数 X , Y は入力で, 変数 Ai の初期値 は CON 0, CON 1, CON 2 のいずれか 疑似命令 x ∈INS(I) 4. 3. 2 節で作成し たプロ グ ラ ム の評価実験を 行う . 4. 3. 1 実装 前節で提案し た ア ルゴ リ ズ ム の実装では, プロ グ 疑似命令列 α ∈(INS(I))* ラ ム 内で X , Y の初期値を 012012012t, 000111222t 疑似命令列の長さ |α| と する こ と によ り , 表の全て の場合の判定を 一度に 命令の連接 α :: x 行っ て いる . プロ グ ラ ム 内の値は 9trits 表現であ る 上記の定義を 用いる と , 疑似命令列探索のアルゴ リ が, それは二引数三値関数を 表現する のには九つの組 み合わせで十分であ り , 最上位( 最下位) の 1trit を ズム は以下のよ う に記述でき る . 入力 二引数三値関数の表 table, 疑似命令列の長 効率のため省略し ている ためであ る . ま た, 入力の条 さ の上限値 LM , 使用する 変数の数 (X , Y を 除 件を みた す疑似命令列を すべて 出力する よ う に実装 く )N , 空の疑似命令列 α し た. 出力 Success(α′ ) か Fail. α′ は入力の二引数三値 関数を 入力の条件下で実現する 疑似命令列. アルゴリズム 実装し たプロ グ ラ ム は, 深さ 優先探索に従っ て疑似 命令列の探索を 行う . ただし , ヒ ュ ーリ ス ティ ク ス を 導入し , あ る 程度の枝刈り を 行う こ と で効率化を 図っ ている . 枝刈り は次の方法で行っ た. Search(table, LM, N, α) = 1. if |α| > LM then return Fail else 1. 最初の命令は ROT に限定する 2. if check(α,table) then return Success(α) 2. ROT は連続し ない 1 に限定する のは, OPR は引数に A レ ジ ス タ の値を else と る ため最初の命令と し ては使えないから であ る . ま 3. foreach x ∈ INS(N ) do た 2 は, ROT が連続し た場合, 後に行っ た命令だけ実 ′ let α = α :: x ′ Result = Search(table, LM, N, α ) in if Result == Success(α′ ) then return ′ Success(α ) else continue end 行する 場合と 実行結果が変わら ないためであ る . プロ グ ラ ム の動作例と し て, 入力を 1clear( X,Y ) の関数表 (表 11) と 疑似命令列の長さ の上限値 3, 使 補助関数 check(α,table) は受け 取っ た 疑似命令列が 用する 変数を 3 つと し た と き , プロ グ ラ ム の出力結 table の関数を 実現し て いる かを 調べ, 実現し て る 場 果は長さ 1 の疑似命令列が 1 個, 長さ 2 のも の 3 個, 合は True を , そう でな い場合は False を 返す. 入力 長さ 3 のも のが 32 個と なる . 長さ 1 のも のは CON 1 と し て表 table’ と 疑似命令列 α が与えら れたと き の を ROT し たも のであ る . ′ 判定方法は, 疑似命令列 α′ を 実行し た後の A レ ジス 4. 3. 2 評価 タ が table’(X,Y ) と 等し いかど う かであ る . 作成し た 疑似命令列探索プ ロ グ ラ ム の 評価の た め , い く つか の 二引数三値関数を プ ロ グ ラ ム に あ 4. 3 疑似命令列探索プログラム た え , 各関数を 実現する 最短の 疑似命令列の 長さ 第 4. 2 節で 示し た ア ル ゴ リ ズ ム を 実装する . 第 と そ の 長さ の 疑似命令列の 種類の 数, な ら びに 探 4. 3. 1 節では実装の際に行っ た工夫について述べ, 第 索 に か かっ た 時 間 を 表 12 に ま と め た . な お , 使 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 表 12 プログラムの評価実験結果 関数 0clear 1clear(表 11) inc(表 10) sum carry 命令長 個数 時間 (sec) 2 3 0 2 3 0 10 4 465 T.O. 9 6 44 T.O. タ イ ム ア ウ ト 5400 秒 9 6. 4 の計算結果を 左に 1trit シフ ト し , 最下位 trit を 0 ク リ ア の後, Y1 にコ ピ ーする 7. 1 から 6 ま でで使用し た 作業用変数を 初期値に 復元する こ のモジュ ール群の内, 変数コ ピ ーモジュ ールと 0 ク リ アモジュ ール, 変数復元モジュ ールは既に飯澤ら に よ っ て実現さ れており , 左シフ ト も 右ロ ーテート を 9 回行う こ と で容易に実現でき る . 本研究で新たに実現 用する 変数は 3 つと し , 関数 0clear と 関数 1clear する のは, 桁上げを 考え な い加算を 行う 関数 sum の に お い て そ れ ぞ れ ROT 命 令 一 つ で の 実 現 は 除 い 疑似命令列と 桁上げのみを 計算する 関数 carry の疑似 て い る . 処 理 時 間 の 計 測 に は getrusage 関 数 を 用 命令列であ る . ど ち ら の関数も 二引数三値関数であ い て , 実験は CPU Xeon W5590 (3.33GHz/4core り , そのよ う な関数を 実現する 疑似命令列を 発見する 8thread/L2cache 4*256KB/L3cache 8MB) デュ ア 手法と し ては, 次の二つがあ る . ル, メ モリ 48GB の計算サーバ上で行っ た. 関数 sum に関し て, こ のタ イ ム ア ウ ト では長さ 11 の場合ま での探索が可能であ り , こ の条件下では長さ 11 以下で関数 sum を 実現する 疑似命令列が存在し な いこ と が確かめら れた. • 既存の疑似命令列や, Malbolge 特有の op 関数 の性質から ノ ウ ハウ によ り 見つける • 第 4 章で作成し た 疑似命令列探索プロ グ ラ ム を 利用する 関数 sum の 疑似命令列は前者の 手法に よ り , 関数 carry の疑似命令列は後者の手法によ り 発見し た. 5 加算を実現する低級アセンブリプログラム の実装 本節では, 第 3 節で提案し た加算アルゴ リ ズム を 低 5. 2 加算アルゴリズムの低級アセンブリ言語での 実装 級ア セン ブリ プロ グ ラ ム と し て実装する . ま ず第 5. 1 第 5. 1 節で作成し た 疑似命令列を 参考に, 今度は 節で疑似命令列で実現し , そ れから 第 5. 2 節で低級 以下の方針に従い, 第 3 節の加算ア ルゴ リ ズ ム を 低 ア セン ブリ プロ グ ラ ム に実装する . そ し て 第 5. 3 節 級アセン ブリ 言語で実装し た. 以降, こ のプロ グ ラ ム で, 従来のイ ン ク リ メ ン ト を 用いた加算と の比較評価 を 加算モジュールと 呼ぶ. を 行う . • メ モリ を 節約する た めにでき る だけ 使用する フ ラ グ の数を 減ら す 5. 1 加算アルゴリズムの疑似命令列での実現 • 第 5. 1 節の疑似命令列のモジュ ール毎に, 低級 第 3 節で提案し た 加算ア ルゴ リ ズ ム を 低級ア セン ア セ ン ブリ プロ グ ラ ム でも モジュ ールを 記述す ブリ 言語で実装する にあ たり , 直接アルゴ リ ズム から る . ただし 一部に命令数を 減ら す工夫を し ている 低級ア セン ブリ 言語で実装する のは困難であ る ので, プロ グ ラ ム 作成には長坂ら の開発し た Malbolge デ ま ず加算ア ルゴ リ ズム を 疑似命令列で実現する . バッ ガ・ 低級ア セン ブリ デバッ ガを 利用し た [5]. 加算アルゴ リ ズム は疑似命令列で実現する 上で, 以 下のモジュ ールに分割でき る . 1. 入力 X1 を X2 にコ ピ ーする 2. 入力 Y1 を Y2 にコ ピ ーする 3. sum(X1 ,Y1 ) を 行う 5. 3 効率の評価 本研究で実現し た加算と , 従来のイ ン ク リ メ ン ト を 用いて実現し た加算の効率の評価を 行う . ま ず理論的な 評価を 行う . 評価対象は, そ れぞれ 4. carry(X2 ,Y2 ) を 行う の加算の実現に用いら れる 疑似命令列のス テッ プ数 5. 3 の計算結果を X1 にコ ピ ーする と する . 従来の加算を 実現する ス テッ プ数は, n を 10 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 加算に必要な イ ン ク リ メ ン ト の数と する と , 全体で 0.03 addtion by increment addtion upgrade addtion 143n − 10 ス テッ プであ る . 本研究で実現し た加算の 0.025 ス テッ プ数は 637 ス テッ プ. よ っ て理論的にはイ ン ク リ メ ン ト が 5 回以上必要な 加算において , 本研究で 果が得ら れた. 上記の評価は定量的に行っ ている が定性的にも 比較 を 行う こ と ができ る . その場合, 入力さ れる 値は m trits で表現さ れる も のと 仮定し , 評価を 行う . こ の time(sec) 実現し た 加算の方が効率よ く 計算を 行え る と いう 結 0.02 0.015 0.01 0.005 0 0 50 100 場合, 本研究で実現し た加算の計算量は桁数に比例す る こ と にな る ので O(m) と な る . 一方, 従来の加算 の計算量は桁数に依存する こ と に加え , 最悪の場合 イ ン ク リ メ ン ト を 3m /2 回繰り 返す必要があ る ので, O(3m ) と な る . よ っ て , 定性的な 評価において も 本 研究で実現し た加算の方が優れている と いえ る . 次に実験的な 評価を 行う . 従来のイ ン ク リ メ ン ト 図 12 表 13 総ス テッ プ数 使用フ ラ グ 数 150 inc_size 200 250 300 比較実験結果 実装の改善 改善前 改善後 10809 9 4324 16 を 用いた加算の Malbolge プロ グ ラ ム で必要なイ ン ク リ メ ン ト の回数 inc size を パラ メ ータ と し て , Mal- プロ グ ラ ム の実行制御命令が含ま れる . そ のこ と に bolge イ ン タ プ リ タ 上で の処理時間を 比較し た . 以 よ り 演算命令と 演算命令の間での実行制御にかかる 降, 比較する プロ グ ラ ム を そ れぞれ本研究のプロ グ 時間分の遅延が, 理論と 実験の結果の差になっ ている ラ ム , 従来のプロ グ ラ ム と 呼ぶ. それぞれプロ グ ラ ム のだと 思われる . 低級ア セン ブリ プロ グ ラ ム の実装 は低級ア セン ブリ プロ グ ラ ム から 低級ア セン ブラ で の改善によ り , こ の差は縮めら れる のではないかと 考 Malbolge コ ード に変換し たも のであ る . 処理時間の え, 低級アセン ブリ プロ グ ラ ム での実行ス テッ プ数を 計測には getrusage 関数を 用いて, 5 回の計測の平均 減ら す方針で同一の疑似命令列を 再実装し た . 改善 値を 結果と し た. 計測し た inc size の値は 1, 3, 10, 前と 改善後の低級ア セン ブリ プロ グ ラ ム のそ れぞれ 30, 100, 300 で, 実験は CPU Athlon 64 X2 4800+ の総ス テッ プ数, 使用フ ラ グ 数は表 13 のよ う になっ (2.4GHz/L2cache 2*1MB), メ モリ 4GB の計算サー た. 改善後のプロ グ ラ ム ( upgrade addition) では, バ上で行っ た. その結果が図 12 であ る . 従来のプロ グ ラ ム( addi- inc size が 10 以上の場合にイ ン ク リ メ ン ト を 用いた 加算のプロ グ ラ ム よ り 速いと いう 結果が得ら れ( 図 tion by increment) では inc size が増え る に従っ て 12) , 実装の改善によ り 理論的な値に近づける と いう 処理時間も 長く な る のに対し , 本研究のプロ グ ラ ム こ と が実験的に確かめら れた. ( addition) はほぼ一定の時間で計算を 終え る こ と が 出来た . た だし , 理論上では inc size が 5 以上であ 6 高級アセンブリ言語への加算命令の追加 れば本研究のプロ グ ラ ム の方が速く 計算でき る はず 本節では, 第 5 節で作成し た加算モジュ ールを 利用 であ る が, 実験では inc size が 43 以上の場合に本研 し , 高級アセン ブリ 言語への加算命令の追加方針を 提 究のプロ グ ラ ム の方が速いと いう 結果が得ら れた. 案し , その方針に基づき 実際に追加を 行う . 原因と し ては, 疑似命令列と 低級アセン ブリ プロ グ ラ ム の実現手法の違いが挙げら れる . 疑似命令列がプ ロ グ ラ ム の本質であ る 演算命令のみで構成さ れて い る のに対し , 低級アセン ブリ プロ グ ラ ム での実装には 6. 1 高級アセンブリ言語の加算命令 本節で追加を 考え る 高級ア セン ブリ 言語の加算命 令は, 次の仕様と する . 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 表 14 基本モジュール一覧 番号 モジュ ール名 (1) (2) (3) (4) (5) (6) (7) (8) (9) イ ン ク リ メ ン ト モジュ ール デク リ メ ン ト 及び条件分岐モジュ ール 変数コ ピ ーモジュ ール マス ク モジュ ール 入力モジュ ール 出力モジュ ール 停止モジュ ール IP に関する モジュ ール REG0,REG1 に関する モジュ ール • 加算命令 “ADD X,Y ” 表 15 11 命令と基本モジュールとの関係 命令 イ ン ク リ メ ン ト 命令 デク リ メ ン ト 命令 変数コ ピ ー命令 条件分岐命令 マス ク 命令 ロ ーテート 命令 入力命令 出力命令 停止命令 必要な基本モジュ ール (1),(3),(8),(9) (1),(2),(3),(8),(9) (1),(3),(8),(9) (1),(2),(3),(8),(9) (1),(3),(4),(8),(9) (1),(3),(8),(9) (1),(3),(5),(8),(9) (1),(3),(6),(8),(9) (7) ト する ためであ る . ま た (3) と (9) のモジュ ールが使 Y := X + Y を 計算する . た だし , オーバーフ われている のは, 引数を と る 命令の場合, ま ず引数の ロ ーが発生し た 場合, 正し い計算結果の最上位 値を レ ジス タ REG0,REG1 にコ ピ ーし , そし て各レ trit を 切り 捨てた値を Y に代入する . ジス タ に対し て命令に対応する 操作を 行っ たあ と , 必 要な ら ば REG0,REG1 の値を 引数の変数や IP にコ 6. 2 高級アセンブリ言語への加算命令の追加方針 第 2 節でも 述べた よ う に, 高級ア セン ブリ プロ グ ラ ム は基本モジュ ール方式を 利用し て低級アセン ブリ ピ ーする と いう 仕様になっ ている ためであ る . 以上よ り , 高級アセン ブリ 言語に新たに加算命令を 追加する ために以下の二点を 行う 必要があ る . プロ グ ラ ム で実現さ れている . こ れはあ る 仮想マシン • 基本モ ジュ ール 群に 加算モ ジュ ール を 組み込 を Malbolge 上に構築し ており , その仮想マシン はプ む . そ の 際 , 加 算 モ ジュ ー ル の 入 力 の 二 数 に ロ グ ラ ム カ ウ ン タ IP と レ ジ ス タ REG0,REG1 を 持 REG0,REG1 を と る よ う に変更し ておく つ. 高級アセン ブリ プロ グ ラ ム は基本モジュ ール方式 • 他の命令と 同様に IP のイ ン ク リ メ ン ト に (1) と のメ イ ン ルーチン にあ たり , 高級アセン ブリ 言語の各 (3) のモジュ ールを , 変数・ レ ジス タ 間コ ピ ーに 命令と 同じ 機能を 持つ低級ア セン ブリ プロ グ ラ ム で (8) と (9) のモジュ ールを 使用する よ う に高級ア あ る 基本モジュ ールを サブルーチン コ ールのよ う に呼 セン ブリ プロ グラ ム 実行系のフ ラ グを 再設定する び出し ている . 高級ア セン ブリ 言語に加算命令を 追加する た めに, 上記の方針に基づき 高級ア セン ブリ プロ グ ラ ム の実 行系を 拡張し , 加算命令を 追加する こ と に成功し た. 高級アセン ブリ 言語の実行系の解析を 行っ た. 基本モ ジュ ール群には大き く 分けて表 14 のモジュ ールが存 7 おわりに 在する こ と が文献 [7] で述べら れている . 解析の結果, 本論文では, 以下のよ う にし て高級アセン ブリ 言語 各モジュ ールと 高級アセン ブリ 言語の各命令の関係は 表 15 であ る こ と が明かと なっ た. 停止命令は特殊で あ る ので, 以降は停止命令以外について話を 進める . 表 15 から 分かる よ う に, 全て の命令で (1), (3), (8), (9) のモジュ ールを 使用し ている . こ れはこ の四 への加算命令の追加を 行っ た. • 低級ア セン ブリ 言語での加算モジュ ールの作成 – Malbolge 向けの加算ア ルゴ リ ズム の検討 – 二引数三値関数を 実現する 疑似命令列の探 索手法の提案 つのモジュ ールが命令の操作だけではなく , 高級アセ – 加算ア ルゴ リ ズム の疑似命令列での実現 ン ブリ プロ グ ラ ム の実行自体に使用さ れて いる た め – 加算ア ルゴ リ ズ ム の低級ア セン ブリ 言語で であ る . (1) と (8) のモジュ ールが使われている のは, 高級ア セン ブリ プロ グ ラ ム のプロ グ ラ ム カ ウ ン タ で あ る IP を 命令や引数を 読み込むご と にイ ン ク リ メ ン の実装 • 加算モジュ ールを 用いた加算命令の実現 12 日本ソ フ ト ウ ェ ア 科学会第 28 回大会 (2011 年度) 講演論文集 ま た, 低級アセン ブリ 言語を 用いた加算アルゴ リ ズ 動かない場合も あ る . こ の値の決定は, 入力のプ ム の実装や高級アセン ブリ 言語の実行系の解析, 拡張 ロ グ ラ ム を ひと ま ず適当な値でアセン ブルし , 出 を 行っ たこ と によ り , 低級アセン ブリ プロ グ ラ ミ ン グ 力さ れた Malbolge プロ グ ラ ム と アセン ブル時に を 困難にし ている 主な原因が明ら かと なっ た. 得ら れる あ る 情報を 参考にノ ウ ハウ によ り 導出 1. 限定的な命令 使用でき る 命令は基本的に Mal- し た 正し いと 思われる 値を 設定し 再びア セ ン ブ bolge と 変わら ないので非常に限定的であ る . ルする と いう , 繰り 返し の試行によ り 行われる . 2. 特定アドレスへの複数回アクセス 低級ア セ ン 上記の困難性に対する 解決策は, 現在のと こ ろ ノ ウ ハ ブリ プロ グ ラ ム では, 同じ 名前の変数は一つのア ウ に依存し ている 部分がほと んど であ り , 今後の課題 ド レ ス にし か書く こ と ができ ない. そのためプロ と し て各困難性に対する シス テマティ ッ ク な解決策を グ ラ ム 実行中に一度通り 過ぎ た 変数に再び何ら 考案する こ と が望ま し い. かの操作を 行いたい場合, MOV PC 命令を 使用 Malbolge プロ グ ラ ム を ソ フ ト ウ ェ ア 保護の目的で し て前に戻る 必要があ る . あ る 変数に対する 命令 利用する 場合, 本論文で行っ たよ う に命令を 豊かにし は必ずそ の変数よ り も 前に記述し な け ればな ら て し ま う と 解析困難性が低下し て し ま う 恐れがあ る . ないため, ジャ ン プバッ ク は目的の変数の少し 前 特に高級アセン ブリ 言語で実装を 行っ た場合, 現在の ま で行う . ま た命令が実行さ れる と 自動的に PC 手法では逆コ ン パイ ルが可能であ る こ と がすでに明 がイ ン ク リ メ ン ト さ れて し ま う た め, 同じ 変数 ら かになっ て いる [8]. そ こ で, 逆コ ン パイ ルを 困難 に対する 連続のアク セス であっ ても ジャ ン プバッ にする た めに, 低級ア セン ブリ プロ グ ラ ミ ン グ 時に ク は複数回必要になる . こ こ でジャ ン プバッ ク が コ ード 難読化を 施し たり , 乱数を 用いた構造変換など 無条件分岐だと 無限ループに陥っ てし ま う こ と は を 行う こ と で, よ り 難読性を 高める こ と が必要であ る 容易に想像でき る . その解決のために用いら れる と 考え ている . のがフ ラ グ であ る が, フ ラ グ を 用いる こ と によ っ てさ ら に以下の困難性が生ま れる . 謝辞 本研究は一部, 科研費 #22650003 の助成を 受けている . 3. フラグによる実行制御 低級ア セ ン ブリ プロ グ ラ ム はフ ラ グ によ り そ の実行を 制御さ れる . し かし , 静的解析が非常に困難であ る た め, プロ グ ラ ム 実行中の各フ ラ グ の状態を 知る た めには 動的解析を 行う 他な く , プロ グ ラ ム の理解やデ バッ ク が非常に困難であ る . 特にメ モリ の節約の た めに一つのフ ラ グ を 複数の場所に使用する と , 解析はさ ら に困難と な る . 大量のフ ラ グ を 用意 し , 一つのフ ラ グ は一度し か使わないこ と にする こ と でこ の問題はやや軽減する こ と ができ る が, Malbolge のメ モリ は固定であ る ので必要以上の フ ラ グ を 使用する こ と は避ける べき であ る . 4. アドレス値の設定 第 2. 6 節でも 述べたよ う に, 低級ア セ ン ブラ は入力の低級ア セ ン ブリ プロ グ ラ ム に合わせて エン ト リ ーラ ベルのア ド レ ス 値 の指定やデータ のメ モリ 領域の指定を そ のソ ー ス コ ード に記述する 必要があ る . 指定し た 値に よ っ ては, 出力の Malbolge プロ グ ラ ム が正し く 参 考 文 献 [ 1 ] 門田暁人, 高田義広, 鳥居宏次 : プロ グラ ム 難読化法 の実験的評価 , 情報処理学会研究報告 ソ フ ト ウ ェ ア 工 学研究会報告, Vol. 96, No. 32, pp. 33–40, 1996. [ 2 ] 飯澤恒 : 難解言語 Malbolge に基づく プロ グ ラ ム 難 読化に関する 研究 , 名古屋大学修士論文, 2006. [ 3 ] Ben Olmstead : ”Malbolge: Programming from Hell”, http://www.bouletfermat.com/danny/ malbolge/ , 1998. [ 4 ] Andrew Cooke : “malbolge : hello world”, http://www.acooke.org/malbolge.html. [ 5 ] 長坂哲 : 難解言語 Malbolge の弱チュ ーリ ン グ完全 性と プロ グラ ミ ン グ環境 , 名古屋大学修士論文, 2011. [ 6 ] 飯澤恒, 坂部俊樹, 酒井正彦, 草刈圭一朗, 西田直 樹 : 難解プロ グラ ミ ン グ言語 Malbolge における プロ グ ラ ム 構成手法, 信学技報, 電子情報通信学会, Vol. 105, No. 129, pp. 25–30, 2005. [ 7 ] 長坂哲, 酒井正彦, 坂部俊樹, 草刈圭一朗, 西田直 樹: 難解言語 Malbolge のチュ ーリ ン グ 完全性につい て, 信学技報, 電子情報通信学会, Vol. 110, No. 227, pp. 55–60, 2010. [ 8 ] 菅優也 : 難読言語 Malbolge の逆コ ン パイ ル困難 性に関する 研究 , 高知工科大学卒業論文, 2011.
© Copyright 2024 Paperzz