トップページに戻る

Category

AllArchives

Checker

Credit

初級CGIクラックガイド(1)

関数。
y=f(x)=3x+5
xという入力をfという関数に通すとyが出てくる。「f」の実体は「入力を3倍して5を足して出力する」関数。


「CGI」とは・・・一般化して言うならば「プログラム」とは・・・関数です。入力から出力を生成する関数。入力・出力が複数であったり内部処理が(単純な一次関数と比較すれば)複雑怪奇なだけで。
CGIに関して言うならば、「入力」と「出力」は例えばこんな感じです。
入力出力
環境変数query_string
標準入力
サーバー内データファイル
現在時刻
その他環境変数群
etc...
html表示
単純なアクセスカウンターだったら。
入力処理出力
サーバー内データファイル(現在のアクセス数)
データファイルから取得した数字に1を加える
サーバー内データファイルにその数字を書き込む
「1加えた結果(=アクセス数)」をhtml出力
超初級CGIクラックガイドを読んでくれた方ならば分かっていると思いますが、CGIクラックとは即ち「CGIのバグ探し」です。そして「バグ」とは簡単に言うと「想定されていない入力に対してプログラムが想定されていない処理を行ってしまう」ということです。
FC版ドラクエ4でコイン買う時に極端に多い枚数を指定すると値段が安くなるって裏技があったの覚えてますか?あの原理は単純ですよね。
「買い物でいくら払うか」という変数が0-16777215の領域までしか用意されていない。だから20000000Gの買い物ならば値段は20000000-16777215Gになる。
超初級CGIクラックガイドの冒頭で触れたこの裏技。もう少し分析してみます。
  1. 変数には「領域」があり、その領域を超えた値を代入することはできない
  2. 領域以上の値を代入させようとしたら、値がリセットされるのでは?「領域以上の値を代入しようとしたらエラーメッセージを出す」みたいな例外処理が組み込まれていない可能性はある
  3. 「買い物でいくら払うか」という変数は(普通の買い物では一回で払う金額なんて大したことはない訳だし)「領域」が比較的小さいのでは?
  4. 「買い物でいくら払うか」という変数に巨大な値を代入させようとすれば良い
  5. 「コイン」ならば枚数を自由に決められるから「巨大な値を代入させる」ということが可能だ
「プログラム上の処理の穴をつつかせる」から「購入するコインの枚数」まで、以上のような思考を辿れば辿り着くことができる。そして実際試してみれば「例外処理(=『そんなにたくさん一度に買えません』とか出力)が組み込まれていない」ということが分かる。
我々に出来ることは「想定されていない入力を行う」ということだけです。「想定されていない入力を行う」ことで「想定されていない処理を行わせる」ことが可能ならば、それは「裏技」であり「クラック」にもなりうる。ある言い方をすれば、上記のような思考を辿り「もしかしたらこんな裏技があるのでは?」と「試してみる」ことが、「ハッキング」なのです。

SeeAlso

SameSubCategory

Footprint

Navigation

TrackBack

この記事へのトラックバック

Comment

PostForm

情報を登録  
コメントは本文以外省略可能で、当方の承認後掲載されます