パスワードを忘れた? アカウント作成
14199 story

Hello, world!はASCIIで書くべきだ 61

ストーリー by kazekiri
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, すばらしい洞察)

    by Anonymous Coward on 2006年12月19日 18時01分 (#1078307)
    実はcrackに近い技術です。

    なぜならば、途中でNUL terminateしない文字列だけコードを書けるということは、sprintf系のバッファオーバーフローで容易にコードを注入できるということを意味していますので。

    いわゆるshellcodeも、0x00を使わないか、どうしても使う場合は自己書き換えで表現することが多いですね。
  • わお (スコア:2, 興味深い)

    by pukupun (9919) on 2006年12月19日 16時53分 (#1078257)
    すげー(w
    "main" というシンボルがそのままプログラムのエントリポイントになっちゃうってことですかね.

    Windows (MS-DOS) でも com ファイルで頑張れば書けそうですね.

    何もしないプログラムは
    C:\>echo エLヘ! > a.com
    C:\>a.com
    こんな感じで作れます:)
    • Re:わお (スコア:2, 興味深い)

      by mkasa (12075) on 2006年12月19日 20時29分 (#1078401)
      何を今更。DOS時代ならCOM2TXT [vector.co.jp]がありました。 ish/uudecodeを持っていない人に実行ファイルが送れる、ネタでありながら実用的なユーティリティでした。基本的にはBASE64みたいにバイナリをASCIIにエンコードするんですけど、ASCII文字列のみで構成された自己展開ルーチンが付属しているので、エンコードしてサイズオーバーしなければどんなCOMファイルでもエンコードできるという。 (記憶を頼りに書いているので違ったらごめんなさい。)
      親コメント
      • Re:わお (スコア:3, 興味深い)

        by Mistbow (12027) on 2006年12月19日 23時24分 (#1078494)
         ishを入手するために、ish形式になっているishのプログラムを
        実行ファイルに変換するための専用ツールがASCII形式のプログラ
        ムになっていた記憶があります。
         テキストの指定された部分を切り抜いてファイルとして保存、ファ
        イル名を変更して実行ファイルにしてからishの実行ファイルを展
        開、という手順だったはずです。

         パソコン通信の時代は、ファイルをやりとりする手段が掲示板
        にish形式にしたものを書き込む方法しかない場合もありました。
        そんな状況でそもそものish自体をどうやって手に入れるか、とい
        う話。

         どこかのフロッピーディスクにまだ残ってるはずなのですが、
        発掘できても多分PC-98版。
        親コメント
    • Re:わお (スコア:2, 参考になる)

      by AliceYou (2190) on 2006年12月20日 9時38分 (#1078640) 日記
      Cだと関数名=変数名=メモリ上のアドレスのラベルと思っていれば
      納得しやすいかも。

      この方法、X68kのCの入門書に、#asmのないCでインラインアセンブラ
      みたいなことをするときの常套手段として載っていたのを思いだしました。
      親コメント
    • by tietew (6130) on 2006年12月19日 17時28分 (#1078280) ホームページ
      いやまあcomはコードセグメントしか入っていないので…
      echo テガミハアズカッタ。 > 何もしない.com
      とか :p

      # 先頭が ret なので何もしない。
      親コメント
    • by Anonymous Coward
      うーん、「main配列」てところに限っては今更驚く箇所じゃないんです。

      初期のIOCCCでも使われたね。
    • by Anonymous Coward
      このごろ流行っているみたいですね。
      同様の事例が、cppll_novice メーリングリスト [tietew.jp]でも話題になっていました。
  • COM2TXT (スコア:2, 興味深い)

    by Canadian (31348) on 2006年12月19日 16時54分 (#1078258)
    COM2TXTを思い出して,懐かしい…と思いつつ,同じようなのをどこかで見たなと思ったら, 今日 ム板(七行プログラミング)@2ch [2ch.net] で見たのでした。
    US-ASCII以外を使っているという意味で命令の種類は多くなるにせよ, いまどきハンドアセンブルという意味で,よりバイナリアンらしいのかもしれません。
    • Re:COM2TXT (スコア:2, 興味深い)

      by taka2 (14791) on 2006年12月19日 19時22分 (#1078367) ホームページ 日記
      私もcom2txt [vector.co.jp]を思い出しました。

      com2txt は、com形式な任意のMS-DOS用プログラムを、可読形式の文字とCRLFのみで構成ながらも、そのまま実行可能なファイル(.com)に変換してくれます。これを使うと、バッチファイル中で、
      echo hogehoge>foobar.com
      echo fugafuga>>foobar.com

      echo hegehege>>foobar.com
      foobar
      などと、任意のコマンドをその場で生成して実行させることが可能です。

      これを応用したdshar なんていうのも [vector.co.jp]あります。UNIX の shar のように、複数のファイルをまとめて(可視文字列のみで構成された)1つのバッチファイルに変換します。
      ファイルの展開プログラム自体がcom2txt化されてバッチファイルに入っていますので、特別な展開プログラムなどは必要なく、そのバッチファイルを実行するだけで展開できるという…。
      親コメント
  • 話題が古すぎる! (スコア:2, すばらしい洞察)

    by superfox (31908) on 2006年12月19日 20時11分 (#1078391)
    若い人達はもっと先達の功績 [ioccc.org]を見直すべきだ!

    # 解説はこちら [ioccc.org]。
    ## Hello, world. では無いんだけどね :-)
  • やってみました。
    動きました。
    環境はubuntu linux 6.06です。

    やりかたわからない人は、「char」で始まる行を適当なファイル(hello.cとか)にペーストして保存。
    「gcc -o hello hello.c」とかやる。
    「hello」ってファイルが出来てたら実行してみる。
    core吐いて落ちてもOSがぶっとんでもハードが壊れてもCPUが火を吹いても私は責任はとりませんので悪しからず ;-P
    • by Anonymous Coward
      確実にCPUが火を吹くプログラムは「プログラム兵器」と認定されます。

      下手にアメリカ(北朝鮮でもいいですが、渡航自粛ですし)旅行なんかに行くと拉致されるかも(笑)
  • by akiraani (24305) on 2006年12月19日 16時15分 (#1078231) 日記
     こいつはThe Evolution of a Programmer [ogi.edu]のどこに追加されるんだろうか……。
    --
    しもべは投稿を求める →スッポン放送局がくいつく →バンブラの新作が発売される
  • AhSKI? (スコア:1, おもしろおかしい)

    by ymitsu (31883) on 2006年12月19日 16時16分 (#1078235)
    なんだかわからんがすごいな
  • by Anonymous Coward on 2006年12月20日 0時58分 (#1078552)
    そいえば、アンチウイルスのテストウイルスもASCIIだけで出来てますな。これの実態は文字列を表示するだけの68Byteのプログラムです。

    これをちょっちょいと書き換えたらHello Worldが出来ると思ったけど、エラーになった。どこかに文字列のバイト数が書いてあるのかも。

    !!注意:リンク先のファイルはアンチウイルスが反応します!!

    http://www.eicar.org/anti_virus_test_file.htm [eicar.org]

  • by Anonymous Coward on 2006年12月19日 16時37分 (#1078250)
    マシン語使った一画面プログラム?
    コメントがプログラムになってるという。
    • Re:懐かしの (スコア:1, 興味深い)

      by Anonymous Coward on 2006年12月19日 17時13分 (#1078269)
      REM文マシン語って奴ですな。

      100 'くぁwせdrftgyふじこlp;

      みたいなのが延々並んでて、このREM文の中を結合して正しいマシン語に変換するブートストラップが、DATA文とかで書かれてるような奴。これもコメントに書かれたASCIIコードを実行時に変換しているので発想としては同じですな。

      発祥の地ってどこなんだろ?
      親コメント
      • Re:懐かしの (スコア:2, 参考になる)

        by tietew (6130) on 2006年12月19日 17時19分 (#1078276) ホームページ
        発祥とは違うかと思いますが、クラック対策の難読化の一環で、メッセージ部分がプログラムになっていて、そこにジャンプしてほげほげする、という手法はかなり前から存在しています。
        親コメント
        • 私が聞いた「メッセージがプログラムになっている」のは、FM-7の某コピーツール。確かBIOSから読み込まれるブート部分256byteほどがプロテクト破りに挑戦する人のメッセージになっているんだけど、それが自己書換え、へんてこなループ、未公開命令やらを巧みに使った超難読プログラムになっているという話でした。で、全部の罠を突破すると「congratulation」という文字列がバイナリに含まれているという…。そんな話が「The BASIC」誌に読者からの投稿であった記憶があります。

          伝聞だし、自分で解析した訳じゃないですが、20年くらい前の話です。これが最古というわけじゃないでしょうが、少なくともそれ位の昔からはあるということですね。

          --
          vyama 「バグ取れワンワン」
          親コメント
        • Re:懐かしの (スコア:3, 興味深い)

          by minz (3213) on 2006年12月19日 19時29分 (#1078373) ホームページ 日記
          自己変更コード,データジャンプに留まらず,

          オペランドジャンプ (-_-; なんかもバリバリに使っている難読化プログラムがありましたな
          --
          みんつ
          親コメント
      • Re:懐かしの (スコア:1, 興味深い)

        by Anonymous Coward on 2006年12月19日 18時45分 (#1078346)
        「REM文の中を結合して正しいマシン語に変換するブートストラップ」
        よりも
        「REM文の中間コードが収められているアドレスに直接ジャンプするだけのブートストラップ」
        を多く見かけたような記憶がします。

        つまり、REM文自体がその時点でバイナリレベルで正しいマシン語になっているため、
        結合や変換すら必要なく、そのまま実行できてしまう、という仕組みですね。
        親コメント
        • Re:懐かしの (スコア:2, 興味深い)

          by bakuchikujuu (16666) on 2006年12月19日 21時16分 (#1078413) ホームページ 日記
           マシン語としてそのまま実行できるREM文が、更にBASICリストとして表現できるREM文に変換されたマシン語データを展開していたと思います。
           さすがに、REM文に文字列として書けるコードだけでゲーム(とか)を組むのは苦しそうです。

           かなり遅い時期までプログラムリスト打ち込み文化が残っていたMSX・FANで時々見られた手法ですね。あの雑誌には「1画面プログラム」なんて部門もありましたし。
          親コメント
    • by kicchy (4711) on 2006年12月19日 19時16分 (#1078364)
      >マシン語使った一画面プログラム?
      >コメントがプログラムになってるという。

      懐かしい。
      ファンダムで1画面に収まったMAZEのプログラムを見て感動した記憶新たに。

      # この手法の私の一番古い記憶です
      # ちょっと違うか・・・あれは圧縮だったっけ・・?
      親コメント
    • Re:懐かしの (スコア:1, 参考になる)

      by Anonymous Coward on 2006年12月19日 19時48分 (#1078382)
      1990年に発行されていた,The C Users Journal Japan 10号に
      文字列を実行させるコードが紹介されていました。

      char nop3[]="\220\220\220";  /* 8進数の nopコード */

      int main(){
        (*((void (*)())nop3))();            /* nop3のコードを実行 */
        (*((void (*)())"\220\220\220"))();  /* 直接書いたマシン語を実行 */
      }
      unix系のOSでは,文字列はdataセクションに割り付けられるので,
      textセッションに無理矢理割り付けないと実行出来ませんが,
      MS-DOSならば動作すると思います。

      昔ファームの仕事をしていた頃,この技を使おうと思ったのですが
      コードレビューで却下されました。

      却下理由:読みにくい でした。
      親コメント
  • by Anonymous Coward on 2006年12月19日 16時50分 (#1078256)
    >低レベルなところに這いつくば
    >るハッカー

    私の環境だと上記のところに改行が入ってしまい、
    一瞬「低レベルなところ」=「つくば」=「ハッカー」と錯覚。

    # あまりにも身近な街なので AC.
  • by Anonymous Coward on 2006年12月19日 17時16分 (#1078272)
    こういうワクワク感って、業務アプリ書いてると感じないんだよなぁ・・・
  • by Anonymous Coward on 2006年12月19日 17時29分 (#1078281)
    これのコードってASCII準拠だっけ?
    • by taka2 (14791) on 2006年12月19日 19時55分 (#1078384) ホームページ 日記
      ディスプレイコードです。
      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 番地に飛ばせば、上記コードが実行でき、
      メモリ上のイメージをテープに保存できます。
      あらかじめゲームなどのソフトをロードした後でリセットし、これを実行すれば、コピーが出来上がり。
      親コメント
    • なつかしい
      画面の下半分を使ったマシン語デバッガみたいなプログラムもあったなあ
      CPUがその部分をフェッチすると画面がノイズの嵐になるのよ
      で、カーソルが画面のコード部に移動しようものなら…
      親コメント
    • VRAMに記憶されているのはASCIIとはまったく違う ディスプレイコード [sun-inet.or.jp] だったはずです
  • by Anonymous Coward on 2006年12月19日 21時13分 (#1078411)
    「~べきだ」としながら肝心のべきである論がないじゃないの。
    ジョークとしては失敗してるね。
  • by Anonymous Coward on 2006年12月19日 21時29分 (#1078422)
    > これでこそ、低レベルなところに這いつくばるハッカーですね。

    レベルの低いハッカーのことだと思った私は
    レベルが低いですか、そうですか。
typodupeerror

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

読み込み中...