Hello, world!はASCIIで書くべきだ 61
ストーリー by kazekiri
ASCIIは分かりやすくていいですね 部門より
ASCIIは分かりやすくていいですね 部門より
Anonymous Coward 曰く、
Binary 2.0カンファレンス 2006にて発表された Hello, binary world!(プレゼンPDF)では、GCC拡張でのmainの蹂躙っぷりに感動し、Hello, world!愛好家にはGCC拡張派とELF Golf派があるという新しい知見を 得ることができたが、ELF Golf派ではHello, world!はASCIIで書くべきだという回帰が起きているようだ。
ということで、実際にASCIIでHello, world!が書かれています。 これでこそ、低レベルなところに這いつくばるハッカーですね。
hackというよりは (スコア:5, すばらしい洞察)
なぜならば、途中でNUL terminateしない文字列だけコードを書けるということは、sprintf系のバッファオーバーフローで容易にコードを注入できるということを意味していますので。
いわゆるshellcodeも、0x00を使わないか、どうしても使う場合は自己書き換えで表現することが多いですね。
Re:hackというよりは (スコア:1, 参考になる)
わお (スコア:2, 興味深い)
"main" というシンボルがそのままプログラムのエントリポイントになっちゃうってことですかね.
Windows (MS-DOS) でも com ファイルで頑張れば書けそうですね.
何もしないプログラムは こんな感じで作れます:)
Re:わお (スコア:2, 興味深い)
Re:わお (スコア:3, 興味深い)
実行ファイルに変換するための専用ツールがASCII形式のプログラ
ムになっていた記憶があります。
テキストの指定された部分を切り抜いてファイルとして保存、ファ
イル名を変更して実行ファイルにしてからishの実行ファイルを展
開、という手順だったはずです。
パソコン通信の時代は、ファイルをやりとりする手段が掲示板
にish形式にしたものを書き込む方法しかない場合もありました。
そんな状況でそもそものish自体をどうやって手に入れるか、とい
う話。
どこかのフロッピーディスクにまだ残ってるはずなのですが、
発掘できても多分PC-98版。
Re:わお (スコア:2, 参考になる)
納得しやすいかも。
この方法、X68kのCの入門書に、#asmのないCでインラインアセンブラ
みたいなことをするときの常套手段として載っていたのを思いだしました。
Re:わお (スコア:1)
# 先頭が ret なので何もしない。
Re:わお (スコア:0)
初期のIOCCCでも使われたね。
Re:わお (スコア:0)
同様の事例が、cppll_novice メーリングリスト [tietew.jp]でも話題になっていました。
COM2TXT (スコア:2, 興味深い)
US-ASCII以外を使っているという意味で命令の種類は多くなるにせよ, いまどきハンドアセンブルという意味で,よりバイナリアンらしいのかもしれません。
Re:COM2TXT (スコア:2, 興味深い)
com2txt は、com形式な任意のMS-DOS用プログラムを、可読形式の文字とCRLFのみで構成ながらも、そのまま実行可能なファイル(.com)に変換してくれます。これを使うと、バッチファイル中で、 などと、任意のコマンドをその場で生成して実行させることが可能です。
これを応用したdshar なんていうのも [vector.co.jp]あります。UNIX の shar のように、複数のファイルをまとめて(可視文字列のみで構成された)1つのバッチファイルに変換します。
ファイルの展開プログラム自体がcom2txt化されてバッチファイルに入っていますので、特別な展開プログラムなどは必要なく、そのバッチファイルを実行するだけで展開できるという…。
話題が古すぎる! (スコア:2, すばらしい洞察)
# 解説はこちら [ioccc.org]。
## Hello, world. では無いんだけどね :-)
ASCIIでHello world! (スコア:1)
動きました。
環境はubuntu linux 6.06です。
やりかたわからない人は、「char」で始まる行を適当なファイル(hello.cとか)にペーストして保存。
「gcc -o hello hello.c」とかやる。
「hello」ってファイルが出来てたら実行してみる。
core吐いて落ちてもOSがぶっとんでもハードが壊れてもCPUが火を吹いても私は責任はとりませんので悪しからず ;-P
Re:ASCIIでHello world! (スコア:0)
下手にアメリカ(北朝鮮でもいいですが、渡航自粛ですし)旅行なんかに行くと拉致されるかも(笑)
Re:ASCIIでHello world! (スコア:0)
書く平気
Hello, worldの進化 (スコア:1)
しもべは投稿を求める →スッポン放送局がくいつく →バンブラの新作が発売される
Re:Hello, worldの進化 (スコア:1)
AhSKI? (スコア:1, おもしろおかしい)
アンチウイルステストファイル (スコア:1, 興味深い)
これをちょっちょいと書き換えたらHello Worldが出来ると思ったけど、エラーになった。どこかに文字列のバイト数が書いてあるのかも。
!!注意:リンク先のファイルはアンチウイルスが反応します!!
http://www.eicar.org/anti_virus_test_file.htm [eicar.org]
懐かしの (スコア:0)
コメントがプログラムになってるという。
Re:懐かしの (スコア:1, 興味深い)
100 'くぁwせdrftgyふじこlp;
みたいなのが延々並んでて、このREM文の中を結合して正しいマシン語に変換するブートストラップが、DATA文とかで書かれてるような奴。これもコメントに書かれたASCIIコードを実行時に変換しているので発想としては同じですな。
発祥の地ってどこなんだろ?
Re:懐かしの (スコア:2, 参考になる)
メッセージ部分がプログラム (スコア:5, 興味深い)
私が聞いた「メッセージがプログラムになっている」のは、FM-7の某コピーツール。確かBIOSから読み込まれるブート部分256byteほどがプロテクト破りに挑戦する人のメッセージになっているんだけど、それが自己書換え、へんてこなループ、未公開命令やらを巧みに使った超難読プログラムになっているという話でした。で、全部の罠を突破すると「congratulation」という文字列がバイナリに含まれているという…。そんな話が「The BASIC」誌に読者からの投稿であった記憶があります。
伝聞だし、自分で解析した訳じゃないですが、20年くらい前の話です。これが最古というわけじゃないでしょうが、少なくともそれ位の昔からはあるということですね。
vyama 「バグ取れワンワン」
Re:懐かしの (スコア:3, 興味深い)
オペランドジャンプ (-_-; なんかもバリバリに使っている難読化プログラムがありましたな
みんつ
Re:懐かしの (スコア:1, 興味深い)
よりも
「REM文の中間コードが収められているアドレスに直接ジャンプするだけのブートストラップ」
を多く見かけたような記憶がします。
つまり、REM文自体がその時点でバイナリレベルで正しいマシン語になっているため、
結合や変換すら必要なく、そのまま実行できてしまう、という仕組みですね。
Re:懐かしの (スコア:2, 興味深い)
さすがに、REM文に文字列として書けるコードだけでゲーム(とか)を組むのは苦しそうです。
かなり遅い時期までプログラムリスト打ち込み文化が残っていたMSX・FANで時々見られた手法ですね。あの雑誌には「1画面プログラム」なんて部門もありましたし。
Re:懐かしの (スコア:1)
>コメントがプログラムになってるという。
懐かしい。
ファンダムで1画面に収まったMAZEのプログラムを見て感動した記憶新たに。
# この手法の私の一番古い記憶です
# ちょっと違うか・・・あれは圧縮だったっけ・・?
Re:懐かしの (スコア:1, 参考になる)
文字列を実行させるコードが紹介されていました。
unix系のOSでは,文字列はdataセクションに割り付けられるので,
textセッションに無理矢理割り付けないと実行出来ませんが,
MS-DOSならば動作すると思います。
昔ファームの仕事をしていた頃,この技を使おうと思ったのですが
コードレビューで却下されました。
却下理由:読みにくい でした。
つくば (オフトピ:-1) (スコア:0)
>るハッカー
私の環境だと上記のところに改行が入ってしまい、
一瞬「低レベルなところ」=「つくば」=「ハッカー」と錯覚。
# あまりにも身近な街なので AC.
かっこいい (スコア:0)
Re:かっこいいかなぁ? (スコア:1)
というのと,
そもそも環境に依存するようなコードは書けない
というのと,
portable なコードが書けない
というのと,
環境に依存するコードって何?
というのと,どのあたりが「かっこいい」でしょうね?
"Patriotism is the last refuge of a scoundrel." - Samuel Johnson
Re:かっこいいかなぁ? (スコア:1)
> どれだけ無駄で馬鹿馬鹿しく複雑な手順でシンプルな目的を達成するか
という *楽しみ方* は,(金銭が絡もうとも絡むまいとも)「仕事じゃない」ところでないとできないでしょうけれども,「環境依存か portable か」とかの議論があることを *知っている* かどうかは,仕事であろうとなかろうと,愉しむためであろうとなかろうと,「かっこいい」を判断するための基礎知識だろう,と。
# Amiga や AtariST で *だけ*,とか,FORTH で *だけ* 生きるような方法を,今,考えられるのは,充分「かっこいい」と思う。
「あ~も書けるけど,こ~も書ける」とかいうことを考えることができたり,あの言語ならそうだろうけれどこっちならこう書けるとか見せびらかしてみたり,「んにゃ,Z80 (の bug) を使えば…」とか言ってみたり,アタマと手で optimize してみたり,「『富豪的』なんだよ,もう今時は」とか揶揄してみたり,そんなことは,『業務知識』とかいう真っ当な世界では要らないわけですけれども,そこが無ければ「かっこいい」とかいう感覚は出てこないんじゃないか,と。
"Patriotism is the last refuge of a scoundrel." - Samuel Johnson
ネ木1 ネ木3 → (スコア:0)
ネ木1 ネ木4 → (スコア:2, 興味深い)
MZの場合、BASICのソースコードなどではASCIIコードが使われますが、
VRAMに書き込まれているデータの解釈はディスプレイコード [slashdot.jp]が使われています。
00=スペース、01=A、02=B… で、アルファベットの小文字が無かったり、ASCIIコードでは表現できない絵文字がたくさん入ってます。
MZ-80シリーズはクリーンコンピュータなので、起動直後はモニタ(SP-1002)が立ち上がるのですが、
いわゆる多機能マシン語モニタと違って、任意のコードを入力させることができません。
で、画面最左上で「ネ木1 ネ木4 → 」と入力、表示させると、ネ=AF、木=D4、スペース=00、…なので
AF D4 21 00 AF D4 24 00 C3 00 00
つまり、
AF : XOR A (これでキャリーフラグが0になる)
D4 21 00 : CALL NC, 0021h (WRITE INFORMATION、データヘッダをテープに書き出す)
AF : XOR A
D4 24 00 : CALL NC, 0024h (WRITE DATA、データ本体をテープに書き出す)
C3 00 00 : JMP 0000 (モニタに戻る)
という意味になります。これを表示させた状態で「GOTO $D000」でVRAMの先頭アドレスである D000h 番地に飛ばせば、上記コードが実行でき、
メモリ上のイメージをテープに保存できます。
あらかじめゲームなどのソフトをロードした後でリセットし、これを実行すれば、コピーが出来上がり。
Re:ネ木1 ネ木3 → (スコア:1)
画面の下半分を使ったマシン語デバッガみたいなプログラムもあったなあ
CPUがその部分をフェッチすると画面がノイズの嵐になるのよ
で、カーソルが画面のコード部に移動しようものなら…
Re:ネ木1 ネ木3 → (スコア:0)
なんだこれ (スコア:0)
ジョークとしては失敗してるね。
一瞬 (スコア:0)
レベルの低いハッカーのことだと思った私は
レベルが低いですか、そうですか。
Re:一瞬 (スコア:1)
"Patriotism is the last refuge of a scoundrel." - Samuel Johnson
モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:0)
# 野暮とは思いましたが、けっこう勘違いしてるモデレーターが多いと思うので。
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:1)
また、「余計なもの」が英語版で「redundant」であっても、日本語版では「余計なもの」と表現されている以上、あくまで日本語の「余計なもの」の意味、語感に相当するかどうかで判断すべき。さもないと、モデレータ間で解釈が分かれてしまう。
結局、付けるとすれば「フレームのもと」でしょうが、ポイント0の状態でわざわざ付けるほどのものではないと思います。
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:1)
今はFAQ「モデレーションドロップダウンボックスに表示される項目の意味は?」 [srad.jp]に とあるわけで、単に「余計なもの」の語感で判断するのではなく、上記定義に従って判断するべきでしょう。
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:1)
…と思って英語版を見たら原文は「Troll」、まさに「釣り」じゃないですか。これに「荒らし」という訳を付けるのは如何なものか。
まあしかし差し当たり定義があるならその通り、「荒らし」は「釣り」と読み替えて運用すべきかもしれませんねえ。
元コメントは「釣り」なのだろうか。そうでもない気がする。
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:0)
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:2, すばらしい洞察)
#「余計なもの」使い方がおかしい -> 呼びかたを変えるべき -> それらも含めて「余計なもの」
#でいいじゃないか という流れは何度も出てきていたはず。
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:2)
# これも何回書いたか…
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:1)
the.ACount
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:0)
「余計なもの」は使えるので、「重複」だと意味が狭まります。
…という議論も何度も出てきてるんだけど、
「余計なもの」=「重複」と勘違いしてる人が多いんですよね…。
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:0)
ストーリーにちなんだ内容なんで、「オフトピック」でもないし。
当然、「余計なもの」でもないし。
どんなモデレートが妥当だと思う?
ストーリーそのものは「余計なもの」でいいと思うけど。
Re:モデレーションについて(Re:本の宣伝したいならセクションローカルにしろよ) (スコア:0)
「余計なもの」という語感が、モデレータに容易なマイナスモデさせる原因だとは思う。
重複という意味でつけてないなら、ただの言論封殺だろ。