Assembly Tanka on Web - Aiko Kenji

Post on 05-Dec-2014

371 views 1 download

description

http://ja.avtokyo.org/MediaArchives

Transcript of Assembly Tanka on Web - Aiko Kenji

突然ですが…

2

みなさん! 機械語、好きですか?

3

ぼくは大好きです!

4

ぶっちゃけ、 今日は機械語の話しかしません!

5

機械語に興味が無い人は… 遠慮なく寝ててください!

6

ところで

7

最近思うんです…

8

機械語に足りないのは… すばりカジュアル性じゃないのかと

9

もしかして、機械語は難しいと 思われてるのかもしれない

10

だれもがカジュアルに 機械語を楽しめるようにしたい

11

そこで…

12

カジュアル機械語プログラミング 『アセンブラ短歌』

13

「アセンブラ短歌」とは

五・七・五・七・七バイトから成る機械語コードでプログラムを書いてみるという近未来の文化的趣味であり,近年, 国内のハッカー間で密かなブー

ムが起きている.

考案者:坂井弘亮 http://kozos.jp/asm-tanka/

14

(ごく一部の)バイナリアンの反応

イヤッッホォォオオォオウ!

その他の反応

何これキモい・・・・・・・?

驚異の格差社会!(温度差)

そもそもアセンブラが あんまり一般的じゃない

にも関わらず…

公式Webページをみてみると…

6a 00 58 50 40 68 79 61 6d 61 50 40 6a 08 5a 5b 40 68 57 61 6b 61 54 40 59 cd 80 58 58 58 c3

各句が「40」という一定のバイトで終了していることに

注目してください.つまり,韻を踏んでいるわけです.push-pop-push-inc, push-push-inc のような,かろやかなリズムも感じられます. こういうのが「味わい深い」ということかなあ, (公式ページhttp://kozos.jp/asm-tanka/からの引用)

6a 00 58 50 40 68 79 61 6d 61 50 40 6a 08 5a 5b 40 68 57 61 6b 61 54 40 59 cd 80 58 58 58 c3

各句が「40」という一定のバイトで終了していることに

注目してください.つまり,韻を踏んでいるわけです.push-pop-push-inc, push-push-inc のような,かろやかなリズムも感じられます. こういうのが「味わい深い」ということかなあ, (公式ページhttp://kozos.jp/asm-tanka/からの引用)

しかも、いまどきフレームサイトww

でも、

アセンブラ短歌の楽しみかたは 他にもたくさんあります!

というわけで…

「アセンブラ短歌 on Web」を 作ってみよう

愛甲健二

@07c00

kenjiaiko@gmail.com

「アセンブラ短歌 on Web」 とは ブラウザ上からアセンブラ短歌をカジュアルに試せる環境, スマホからもアクセスでき, 通勤電車やちょっとした待ち時間にも気軽に短歌れる

アセンブラ短歌 on Web とは?

どうやってブラウザ上で アセンブラ短歌を実現するのか…

任意のマシン語が実行できる環境をどうやって用意するのか…

実現方法

1. エミュレーション方式

–各種CPUをエミュレーション

–例:JavaScriptでx86/ARM/PPCなどを作る

2. サンドボックス方式

–隔離された環境(SandBox)で実行

–例:VM環境内で実行→結果をブラウザへ

実現方法

1. エミュレーション方式

–各種CPUをエミュレーション

–例:JavaScriptでx86/ARM/PPCなどを作る

2. サンドボックス方式

–隔離された環境(SandBox)で実行

–例:VM環境内で実行→結果をブラウザへ

CPU Emulation on JavaScript

jslinux http://bellard.org/jslinux/ Virtual x86 http://copy.sh/v24/

Assembly Tanka on JavaScript

cpux86.js

xor eax,eax = 31 C0 …

eax = 0x00

Assembly Tanka on JavaScript

cpux86.js

← PUSH!

※ I/Oは決めておく必要あり

■Demo Assembly Tanka on JavaScript http://07c00.com/asmtanka_on_js/

xor eax,eax = 31 C0 …

eax = 0x00

Demo http://07c00.com/asmtanka_on_js/

実現方法

1. エミュレーション方式

–各種CPUをエミュレーション

–例:JavaScriptでx86/ARM/PPCなどを作る

2. サンドボックス方式

–隔離された環境(SandBox)で実行

–例:VM環境内で実行→結果をブラウザへ

SandBox for analyzing malwares

https://www.virtualbox.org/wiki/Screenshots

VirtualBox https://www.virtualbox.org/ VMWare http://www.vmware.com/jp

でも たった31バイトを実行するために

VM立ち上げるとかさすがに厳しい

そこで「デバッガ⇔デバッギ」 の関係になる2つのプロセスを

立ち上げ 実行コードをデバッギに渡し

結果をデバッガが受け取る仕組みを 作る

Assembly Tanka on Server-side

tanka.cgi

New process

Debugging

Return the result

6a 00 58 50 40 68 79 61 6d 61 50 40 6a 08 5a 5b 40 68 57 61 6b 61 54 40 59 cd 80 58 58 58 c3

Execute

• Debugging API

– DebugActiveProcess (Win系)

– ptrace(UNIX系)

Assembly Tanka on Server-side

tanka.cgi

New process

6a 00 58 50 40 68 79 61 6d 61 50 40 6a 08 5a 5b 40 68 57 61 6b 61 54 40 59 cd 80 58 58 58 c3

push 0x00 = 6a 00

ステップ実行毎に

デバッガが命令を検査

STEP

Assembly Tanka on Server-side

tanka.cgi

New process

6a 00 58 50 40 68 79 61 6d 61 50 40 6a 08 5a 5b 40 68 57 61 6b 61 54 40 59 cd 80 58 58 58 c3

pop eax = 58

ステップ実行毎に

デバッガが命令を検査

STEP

Assembly Tanka on Server-side

tanka.cgi

New process

6a 00 58 50 40 68 79 61 6d 61 50 40 6a 08 5a 5b 40 68 57 61 6b 61 54 40 59 cd 80 58 58 58 c3

push eax = 50

ステップ実行毎に

デバッガが命令を検査

STEP

Assembly Tanka on Server-side

tanka.cgi

New process

6a 00 58 50 40 68 79 61 6d 61 50 40 6a 08 5a 5b 40 68 57 61 6b 61 54 40 59 cd 80 58 58 58 c3

inc eax = 40

ステップ実行毎に

デバッガが命令を検査

STEP

ステップ実行毎に

デバッガが命令を検査

sys-callが呼ばれたら

引数を確認し

OKなら実行を許す

ダメならそこでストップ

→sys-callさえ監視しておけばok

Assembly Tanka on Server-side

tanka.cgi

New process

6a 00 58 50 40 68 79 61 6d 61 50 40 6a 08 5a 5b 40 68 57 61 6b 61 54 40 59 cd 80 58 58 58 c3

int 0x80 = cd 80

STEP

Demo http://x86.seccon.jp/99.html

いやっほーう、これで出来たぜ!

と思ったら…

致命的な脆弱性が…

じつはcd 80 (int 0x80)にプリフィックスがつけられる衝撃の事実

ぼくが書いたSandBoxコード

if(code[0] == 0xcd && code[1] == 0x80){

exit(1);

}

execute(code);

systemcallは呼び出させないぞ(キリ

ぼくが書いたSandBoxコード

code = {0x2e, 0xcd, 0x80};

if(code[0] == 0xcd && code[1] == 0x80){

exit(1);

}

execute(code);

プリフィックスつけてみたw

オワタw

アセンブラマジ難しい…orz

アセンブラ短歌の楽しみかた

• いろんなCPUでやってみる

• いろんなOS(環境)でやってみる

• 何文字printできるかに挑戦してみる

• 味わい深さを追求してみる

• 短歌を簡単に作れる環境を作ってみる

• 短歌を自動生成できないか考えてみる

好きな楽しみかたをすれば いいと思います

でも一回は短歌やってみてほしいです

ぜったい楽しいので

最後に その他の on JS を紹介

バイナリかるた on JS

Demo

アセンブラテトリス on JS

Demo

バイナリを楽しもう!

Thank you!

絶賛発売中!

https://book.mynavi.jp/ec/products/detail/id=24267