MATLAB Shorts Mini HackをHackする（裏技紹介）

[MATLAB Shorts Mini Hack](https://jp.mathworks.com/matlabcentral/contests/2024-matlab-mini-hack.html)というコンテストに参加しています．
コンテストに対してハッキングというか裏技が使えそうだったので，試してみました．
私の裏技を利用した提出物は，以下になります．

<iframe width="315" height="315" src="https://www.youtube.com/embed/lzFwo3ABwT4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://jp.mathworks.com/matlabcentral/communitycontests/contests/8/entries/16203

実行したのは，Command Injection ([Code Injection](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E6%94%BB%E6%92%83)) にあたると思います．
画像データを音声データに変換の上でアップロードし，画像復元しています．

この記事では，MATLAB Shorts Mini Hackに対する裏技を紹介します．

# MATLAB Shorts Mini Hack
正式なルールは，[公式サイト](https://jp.mathworks.com/matlabcentral/contests/2024-matlab-mini-hack.html)を見てください．
この後の理解に必要なルールは，以下の通りです．
* MATLABプログラムを提出し，12秒の動画を作成する
* 音声ファイルを提出すると，動画に音がつく
* 禁止されたMATLABコマンドと関数が多数ある
<details><summary>禁止されたMATLABコマンドと関数一覧</summary>
thingSpeakRead, actxcontrol, actxserver, addpath, arrayviewfunc, assignin, builtin, cd, chdir, computer, copyfile, csvread, csvwrite, dbstack, dbstop, delete, diary, dir, dlmread, dos, echo, edit, error, eval, evalc, evalin, execute, exit, fclose, feature, feval, fgetl, fgets, finfo, fopen, ftp, get_param, getpref, help, hgsave, import, imread, inline, inlineeval, inmem, input, java, jpropeditutils, keyboard, lasterr, lasterror, load, lookfor, ls, matlabpath, mbuild, mex, mislocked, mlock, more, movefile, munlock, path, pause, perl, print, printdlg, pwd, quit, regexp, rethrow, rmpath, run, save, sendmail, set_param, setpref, str2func, system, system_dependent, type, uicontextmenu, uicontrol, uigetfile, uimenu, uiputfile, unix, urlread, web, webread, websave, webwrite, what, which, who, whos, xmlread, matlab.net.URI, matlab.net.http.HTTPOptions, py.os, BANG
</details>
<br>

画像データ，動画データを操作するMATLAB関数は利用できません．
Webからデータを読み込むことができず，UI操作も禁止されています．
また，JavaやPythonを利用した迂回策も対策されています．

ただし，今回のコンテストから音声ファイルがアップロード可能となっており，
その**音声ファイルに対する操作が可能**となっていました．

そこで，音声ファイルを利用する事で，何か面白いことが出来ないかと考えました．

# 裏技1: 音声ファイルへの書き込み
まず，音声ファイルへの書き込み関数 [audiowrite](https://jp.mathworks.com/help/matlab/ref/audiowrite.html) が正常に機能するか試しました．
実験の結果，音声ファイルへの書き込みが可能であることを確認できました．
音声ファイルをアップロードせずに，音声付きの動画を作成できました．

<iframe width="315" height="315" src="https://www.youtube.com/embed/mSbrI1wSywE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://jp.mathworks.com/matlabcentral/communitycontests/contests/8/entries/16168

音楽作成については，別の記事も執筆しています．

https://qiita.com/tomtkg/items/11990e399df4f48771ea

# 裏技2: 音声ファイルの読み込み
次に，音声ファイルの読み込み関数 [audioread](https://jp.mathworks.com/help/matlab/ref/audioread.html) が正常に機能するか試しました．
実験の結果，音声ファイルの読み込みが可能であることを確認できました．
音はデジタル信号として，1次元ベクトルの形式でファイルに保存されていました．

<iframe width="315" height="315" src="https://www.youtube.com/embed/Flyo0YlgESg" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

https://jp.mathworks.com/matlabcentral/communitycontests/contests/8/entries/16196

# 裏技3: 音声ファイルを利用した画像表示
いよいよ本番です．まず，以下のプログラムで音声ファイルを用意します．
```MATLAB: image2Audio.m
function image2Audio()
    A = imread("school.jpg");         % 画像の読み込み
    A = A(:,521:1600,:);              % 画像を正方形に切り取る（必要に応じて）
    A = imresize(A, 150/1080);        % 解像度の調整　　　　　（必要に応じて）
    A = A(:);                         % 画像を1次元ベクトルに変換
    audiowrite('audio.wav', A, 8000); % 音声ファイルを出力
end
```
`imread`関数で画像を読み込むと，縦$\times$横$\times$3(RGB値)で構成される3次元配列データ`A`が得られます．`A`を正方形にトリミングし，解像度を$150\times150$に変更します．

|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/255713c6-8b91-cace-9895-1b306c3313e6.jpeg" width="340">|<br>　←$1920\times1080$ by みんちりえ<br>　　https://min-chi.material.jp/<br><br>　↙$1080\times1080$　　　↓$150\times150$|
|:-|:-|
|||
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/34c8d70a-82f9-ab15-85df-df258e7f9144.jpeg" width="340">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/03e34ffd-ac3e-63bc-8d61-e0b9c8d0f3bc.jpeg" width="340">|

そして，`A`を1次元ベクトルに変換し，適当な周波数で[音声ファイル](https://jp.mathworks.com/matlabcentral/communitycontests/uploaded_files/20321/audio.wav)を作成します．
（※音声ファイルの再生は非推奨，ノイズ音が流れます）

音声ファイルの準備が出来たら，本番のプログラムに以下を書き込みます．
```MATLAB: drawframe.m
function drawframe(f)
    if f == 1 % Create image
        set(gca, 'position', [0 0 1 1]); % 余白無しの設定
        y = audioread("audio.wav");      % 音声ファイルの読み込み
        y = reshape(y, 150, 150, 3);     % 1次元ベクトルを画像データに変換
        image(imresize(y, 4));           % 4倍の大きさで画像を表示
        axis off                         % 不要な軸を非表示

        % 以下省略（音声ファイルの作成など）
    end
end
```

読み込んだ音声ファイルから画像データを復元し，それを表示させることが出来ました．
音声ファイルを利用した画像表示の裏技成功です．

※[MATLAB Shorts Mini Hack](https://jp.mathworks.com/matlabcentral/contests/2024-matlab-mini-hack.html)は，アップロードできる音声ファイルは4分以下などの制限があります．そのため，この方法で高画質の画像や動画を扱うことは困難です．

# 終わりに
この記事では[MATLAB Shorts Mini Hack](https://jp.mathworks.com/matlabcentral/contests/2024-matlab-mini-hack.html)に対する裏技を紹介しましたが，**裏技の利用は自己責任**でお願いします．
コンテスト作品の自由度・多様性を向上させ，コンテストを盛り上げる意図で記事を執筆しています．
悪意を持って[インジェクション攻撃](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E6%94%BB%E6%92%83)することは絶対にやめましょう．

私のコンテスト提出物一覧は，[ココ](https://jp.mathworks.com/matlabcentral/communitycontests/contests/8/entries?contributor_id=14679670)から確認できます．