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

The Underhanded C Contest 結果発表 58

ストーリー by yoosee
良いコードそうに見えたのにねぇ... 部門より

tamo 曰く、 "善意を装う C コンテスト として /.J でも記事になった、「読みやすくて安全に見えるけどこっそり悪いことをする」プログラミングコンテスト、 The Underhanded C Contest結果 が出ました。 受賞者は力作の M Joonas Pihlaja and Paul V-Khuong 組と エレガントな小品の Natori Shin 氏に決定したそうです。
今年のお題は「画像処理に識別情報埋め込みを混入」でした。 Natori 氏の作品は、単に減色するだけです。 どういう罠が組み込まれているのか、皆さんは見付けられますか?"

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2005年09月26日 13時20分 (#804689)
    配列の初期値かな
    • Re:ぱっと見 (スコア:3, 参考になる)

      by Anonymous Coward on 2005年09月26日 13時52分 (#804703)
      matrixは条件付きで初期化を拒否してるようですね。
      四角い部屋を丸く拭くなという教訓のようです。
      親コメント
      • Re:ぱっと見 (スコア:2, 参考になる)

        by wabix (3594) on 2005年09月26日 14時48分 (#804726) ホームページ
        引用:
        | matrixは条件付きで初期化を拒否してるようですね。
        | 四角い部屋を丸く拭くなという教訓のようです。

        このコメントでやっとわかりました。
        こんな短い&定数の少ないコードで良くやるなあ!(感嘆

        で、もっと詳しい説明が natori.zip 中の、
        decoder-and-spoiler/README.txt ですね。

        | The output fluctuation is caused by the uninitialized convolution
        | matrix. Most elements of the matrix are newly assigned, but some of the
        | outer elements are not assigned. The unassigned part contains most of
        | the return values from stat(WORKFILE) call. Since the WORKFILE is
        | newly generated for each run, the return from the stat call differs
        | for each run (differs in last access time, last modified time, i-node
        | number, etc.). This causes some subtle changes in the output images.

        なるほど。これなら、毎回実行して、毎回違う値を埋め込めそう。
        画像処理やノイズ除去の仕組みは無知でわからないのですが、
        私にはこれだけでも十分に目からウロコでした。
        親コメント
      • by Anonymous Coward
        ×四角い部屋を丸く拭く
        ○四角い部屋を丸く掃く
  • by Anonymous Coward on 2005年09月26日 14時03分 (#804710)
    初めて初代(かどうか知らないけど元祖?)C言語を見たけど、なんだこの汚いコードは。

    と思ったのは僕だけ?
    • by Anonymous Coward on 2005年09月26日 16時29分 (#804752)
      ご覧になったのはいわゆるバイナリファイルではないでしょうか? そのファイルは、zipアーカイブと呼ばれる物で、圧縮されていますので、そのままでは読めません。 アーカイバというソフトを使って展開してからご覧下さい。
      親コメント
    • では、どの言語で書かれていれば綺麗なんですか?

      #多分そういう問題じゃないと思う
    • 自分が初めて見るものだから汚い印象を受けただけの話でしょ。
      フリーフォーマットな言語だからなおさらに。
    • > 初めて初代(かどうか知らないけど元祖?)C言語を見たけど、なんだこの汚いコードは。

      タレコミにリンクされているコードはANSI C記述に見えるんだけど、それ以外の場所でK&R Cのコードが置いてありましたか?
      それともC++以降からプログラム始めた奴がK&Rを知らないだけで、ただのC言語を初代とか言ってるだけの事?
      • コード全文見たわけではないですが、voidも使われてますし関数プロトタイプ宣言もされてますしK&R第1版という事はあり得ません。
        でも今ではK&Rの第1版って逆になかなか目にすることもできませんし買おうにも手に入りにくい状況です。しかも今さら勉強してもまさに「参考文献」にしかならないので、わざわざ取り寄せるまでもないと思われます。その意味では知らないままに間違えても仕方ないかも。(文中に「?」も付いてますから本人もはっきりとは分かっていない事を認識した上で書かれてますし。)

        でも汚いコードって事はないと思うのだけどな。ブランクの空け方とか「好みの問題」で気になる点はありましたけど、非常に簡潔できれいなソースに見えました。TAB4で見ると変になりますが。

        #うちはK&R第1版の翻訳版「プログラミング言語C第1版」を買ってるのだけど、仕事場で行方不明!これだけは失いたくない~!
        親コメント
    • ときに昔は... (スコア:0, オフトピック)

      by Anonymous Coward
      引っ掛け(?)問題で

      Q:世の中で最もよく使われているプログラミング言語は何でしょう?
      A:COBOL (事務処理、特に金融系のシステムがこれで組まれているので)

      というのがあったけど、いまでもやっぱりCOBOLなの?
      • by Anonymous Coward
        > というのがあったけど、いまでもやっぱりCOBOLなの?

        他システムに移行してるのもありますが、未だにCOBOLが改修されてたり
        フロントエンドではJavaを使ってるけどコア部分はCOBOLだったりという場所も
        ある所を見ると、答えは変わらない気もしますね。

        別解(適当解答な
        • by wadatch (6649) on 2005年09月26日 19時29分 (#804824) 日記
          「よく」ってのが何を指してたんでしょうね。
          案件数か、ステップ数か、ファイル容量か、印刷したコードの重量か、キングファイルの冊数か・・・(おぃ
          親コメント
          • by Anonymous Coward
            >「よく」ってのが何を指してたんでしょうね。

            仕事で使うプログラマの数です。人海戦術を使う職場で使う言語が多くなるようです。推移はCOBOL→VB→Javaまでは把握してるけど、いまはわかりません。
        • by Anonymous Coward
          VHDLはプログラミング言語に入るんだろうか。
          • by Anonymous Coward
            HDL Hardware Description Language
            ハードウェア記述言語
            • by gk-hyn (7889) on 2005年09月26日 19時42分 (#804836)
              それがOKなら、HyperText Markup Languageが……
              親コメント
              • by Anonymous Coward
                DB業界からはData Manipulation LanguageやData Definition Languageだって……

                #上ACは記述言語だからプログラム言語とは違うよと言いたかったんだと思いたいです
              • by Anonymous Coward
                >記述言語だからプログラム言語とは違うよと言いたかったんだと思いたいです

                もちろんそういう意味で書いたのだが、
                最近は行間を読めないやつが多い。
              • by ken-1 (4041) on 2005年09月26日 22時53分 (#804915)
                とはいえ、Page Description Languageでプログラミングするやつもいる罠。
                親コメント
              • by Anonymous Coward
                プログラム言語って意味的にはプログラム記述言語なんじゃないの、と言ってみるテスト。
              • by Anonymous Coward
                >最近は行間を読めないやつが多い。

                でもそういうのを言いたくば「手抜きせんと、もうちっと補足しとけ」とは思う。
                ぽつんと「モノ」だけ置かれても意味の取り方は千差万別だあな。

                #常識といっても多様化しているのが現代。ましてやネット。
              • by Anonymous Coward
                >「手抜きせんと、もうちっと補足しとけ」とは思う。

                /* やっぱプログラマと言う人種は、
                  * コメントがないと何も理解しようとしない人種なんだね。
                  */
              • by Anonymous Coward
                なんらかの理解はするかもしれないけど、その理解が、
                書き手が期待する理解と同一かどうか、分からないでしょ。

                同意した気分になりたいだけなら、それでもいいけど。

              • by harupunte (10435) on 2005年09月28日 19時36分 (#805926) 日記
                そのコードがプログラマの意図したものか
                どうかは判断できないぞ。
                親コメント
            • by apt (28270) on 2005年09月27日 1時27分 (#805005) 日記
              けど、C言語だってハードウェアの記述に使えばHDLですよ。
              逆に、VHDLでもハードウェアだけでなくシミュレーション記述も(ハードウェアとして実装しない物も含めて)書けます。

              プログラミング言語とHDLの区別に何の意味が有るのでしょうか。

              親コメント
      • by Anonymous Coward
        DNS:人間のプログラミング、いや、生命のプログラミング言語…
    • そうですかねえ
      onebyteの方は、
        関数の型のあと改行が入っていること
      natoriの方は、
        tabが8文字
      になっていることが個人的に気に入らない点だけど、汚いどころか
      美しい部類かと。
      • by Anonymous Coward on 2005年09月26日 21時46分 (#804888)
        > natoriの方は、
        >   tabが8文字

        \tに期待している挙動は8桁タブで、ソースは4桁インデントで
        書かれていますが、この両者が一致していないのは個人的に気に入らない。

        DOS/Windows系では、「.c」という拡張子を持つファイル内では\tの挙動は
        4桁タブであることを期待する文化があるように思います。たとえば、
        MiFESやVz(やその流れを受けたWZなど)はそのような挙動です。一方、
        UNIX系では、どんな場合でも\tは8桁タブという意識があるように思います。

        その両者をソースが行き来するとき、\tに期待する挙動にかかわらず、
        インデントは\tひとつで書かれてあると、Windows/DOS上でもUNIX上でも
        一応の見栄えは保てます。まあ、インデントをすべて複数個の\x20で表現
        しても、見栄えは保てますが、入力が面倒なので。(Emacsを使えば楽に
        入力できますが、考え事をしながら入力しているときの削除が面倒)。

        # もしかして、タブとインデントの話題って、Emacs vs Vi や Linux vs BSD
        # のような、典型的なフレームの元でしたっけ?

        親コメント
        • > \tに期待している挙動は8桁タブで、ソースは4桁インデントで
          > 書かれていますが、この両者が一致していないのは個人的に気に入らない。

          同じく。

          職場も仕事もviをtabstop=4でいつも使ってるんだけど
          なんかインデント
    • メモ帳で開いたとか言うなよ。
    • 具体的かつ簡潔に教えてくだされ。
      他の人達も書いてるけど、綺麗な分類に入ると思いますコレ。

      っていうかコレを汚いと思った人の開発歴とかを知りたい。マヂで。
      職場で若手や新人の視点の考察材料にしたいから。
      • by U-Chan (6901) on 2005年09月27日 11時43分 (#805179)
        「読みやすくて安全に見えるけどこっそり悪いことをする」っていう手口が汚いんです。
        親コメント
      • あえて言うなら
        snprintf(buf, sizeof(buf), "convert %s %s", fromfile, tofile);
        system(buf);
        とかやるな とかですかね?

        まぁ汚い”コード”ではないし,コンテストの趣旨からして
        本質じゃないと思いますけど.
        (Cともあんま関係ないし.)
        • じゃないですか!

          これが難読化手法といって解析を防ぐテクニックなのですよ

          #本気だか冗談だかよくわからんな
        • すみません、どこが悪いのでしょうか?

          "convert %s %s" の長さが sizeof(buf) 以上だった場合に終端に \0 がつかないとか?
          そんなことないか。

          convert が絶対パス指定でないところとか?
          これは致命的っぽい。

          シェルがどんな解釈をするかもわからない system() よりも、
          確実に対象を実行する exec 系関数を使った方がいいとか?
          これは神経質になりすぎ

          • > "convert %s %s" の長さが sizeof(buf) 以上だった場合に終端に \0 がつかないとか?
            > そんなことないか。

            snprintf()なんて初めて見たんですが、strncpy()とかの仕様を考えると
            確かに\0が無いとかを疑っちゃいますね。
          • ヒント:コマンドインジェクション
            • つまり、fromfileとtofileをサニタイズしとけってこと?
              思いっきり main() で convertTo(argv[1], WORKFILE) なんてやってますね。
              (fromfileとtofileはconvertToの仮引数)

              でも、argv をいじれる人は、もともと任意のコマンドの実行権限を持ってるんじゃないの?
              これがCGIとか、setuidされてるとかなら問題になるんだろうけど。

      • 変数名の頭に"$"がついてない
        配列名の頭に"@"がついてない
        関数名の頭に"&"がついてない

        こんなの読めたもんじゃない。

        (ぇ
    • Windowsのメモ帳で見ると改行コードの都合でパッと見は"汚く"見えますね.
    • >初めて初代(かどうか知らないけど元祖?)C言語を見たけど、なんだこの汚いコードは。

       MSX時代にBASICとマシン語を使っていただけですが、行番号はないし、メモリアドレスの表記もない。
       汚いコードですよね。:p
typodupeerror

Stay hungry, Stay foolish. -- Steven Paul Jobs

読み込み中...