Archive for category Book

スタックオーバーフローをテスト

最近、「C言語ポインタ完全制覇 (標準プログラマーズライブラリ)」という本を読んでる。
タイトルの通り、C言語の、それもポインタだけに的を絞った本。
これがなかなかどうして面白くて、文字も大きいのですらすら進んでしまう。
ただ、簡単かと言われれば全く違って、興味深くて考えさせられるような話題ばかり。

ようやく100ページまで進んだ。
そしたらセキュリティーホールの温床になると言うスタックオーバーフローをテストしようという楽しいコードが書いてあった。
で、試したくなるじゃないですか。
若干情報多めに書いて写経してみたのが下記。

// stack_overflow_test.c
#include <stdio.h>
void hello()
{
static int i = 0;
fprintf( stderr, "stderr:\tHello xD\n" );
printf( "\tNo.%d Hello:P\n", i++ );
}
void func()
{
void        *buf[10];
static int  i;
printf( "buf\t%p\n*buf\t%p\n&i\t%p\n&hello\t%p\n\n", buf, *buf, &i, &hello );
for ( i = 0; i < 16; ++i ) {
buf[i] = hello;
printf( "buf[%d]\t%p\n", i, &buf[i] );
}
printf( "\n\tEnd of func()\n\n" );
}
int main()
{
int buf[1000];
printf( "Start\n\n" );
func();
printf( "End\n\n" );
return 0;
}

で、実行するとこう。

% gcc -o stack_overflow_test stack_overflow_test.c
% ./stack_overflow_test
Start
buf     0x7fff5fbfdf20
*buf    0x100000eee
&i      0x10000108c
&hello  0x100000d1c
buf[0]  0x7fff5fbfdf20
buf[1]  0x7fff5fbfdf28
buf[2]  0x7fff5fbfdf30
buf[3]  0x7fff5fbfdf38
buf[4]  0x7fff5fbfdf40
buf[5]  0x7fff5fbfdf48
buf[6]  0x7fff5fbfdf50
buf[7]  0x7fff5fbfdf58
buf[8]  0x7fff5fbfdf60
buf[9]  0x7fff5fbfdf68
buf[10] 0x7fff5fbfdf70
buf[11] 0x7fff5fbfdf78
buf[12] 0x7fff5fbfdf80
buf[13] 0x7fff5fbfdf88
buf[14] 0x7fff5fbfdf90
buf[15] 0x7fff5fbfdf98
End of func()
zsh: segmentation fault  ./stack_overflow_test

あれ~?
hello()が実行されてない・・・??
と言うわけで、落ちる前に一度hello()を呼んでみた。

#include <stdio.h>
void hello()
{
static int i = 0;
fprintf( stderr, "stderr:\tHello xD\n" );
printf( "\tNo.%d Hello:P\n", i++ );
}
void func()
{
void        *buf[10];
static int  i;
printf( "buf\t%p\n*buf\t%p\n&i\t%p\n&hello\t%p\n\n", buf, *buf, &i, &hello );
hello();
for ( i = 0; i < 16; ++i ) {
buf[i] = hello;
printf( "buf[%d]\t%p\n", i, &buf[i] );
}
printf( "\n\tEnd of func()\n\n" );
}
int main()
{
int buf[1000];
printf( "Start\n\n" );
func();
printf( "End\n\n" );
return 0;
}

するとこうなる。

% gcc -o stack_overflow_test stack_overflow_test.c
Start
buf     0x7fff5fbfdf20
*buf    0x100000eee
&i      0x10000108c
&hello  0x100000d10
stderr: Hello xD
No.0 Hello:P
buf[0]  0x7fff5fbfdf20
buf[1]  0x7fff5fbfdf28
buf[2]  0x7fff5fbfdf30
buf[3]  0x7fff5fbfdf38
buf[4]  0x7fff5fbfdf40
buf[5]  0x7fff5fbfdf48
buf[6]  0x7fff5fbfdf50
buf[7]  0x7fff5fbfdf58
buf[8]  0x7fff5fbfdf60
buf[9]  0x7fff5fbfdf68
buf[10] 0x7fff5fbfdf70
buf[11] 0x7fff5fbfdf78
buf[12] 0x7fff5fbfdf80
buf[13] 0x7fff5fbfdf88
buf[14] 0x7fff5fbfdf90
buf[15] 0x7fff5fbfdf98
End of func()
stderr: Hello xD
No.1 Hello:P
stderr: Hello xD
No.2 Hello:P
stderr: Hello xD
No.3 Hello:P
stderr: Hello xD
No.4 Hello:P
stderr: Hello xD
No.5 Hello:P
zsh: segmentation fault  ./stack_overflow_test

これでしっかり動いた。
5回勝手(不正)に実行されちょる。

本の説明によるとメモリの状態は下記のような感じとなるらしい。
–ここ移行に別の変数が追加されていく–
buf[0] 0x7fff5fbfdf20
buf[1] 0x7fff5fbfdf28
buf[2] 0x7fff5fbfdf30
buf[3] 0x7fff5fbfdf38
buf[4] 0x7fff5fbfdf40
buf[5] 0x7fff5fbfdf48
buf[6] 0x7fff5fbfdf50
buf[7] 0x7fff5fbfdf58
buf[8] 0x7fff5fbfdf60
buf[9] 0x7fff5fbfdf68
==他の自動変数==
==関数終了時に戻るアドレス情報など==
==その他の領域==

考察:buf[10]~buf[15]までの6個分余分に配列があると仮定して上がいてます、と(・・アレ?5回しか実行されてない??)。
自動変数を食い破り、呼び出し元の関数情報を破壊して行きます、と。
あ、わかった。。。
funcに自動変数iがあるから1回少ないんだ。
funcをこう変えた。

void func()
{
void        *buf[10];
static int  i;
int a, b, c, d, e; // 追加
printf( "buf\t%p\n*buf\t%p\n&i\t%p\n&hello\t%p\n\n", buf, *buf, &i, &hello );
hello();
for ( i = 0; i < 15; ++i ) {
buf[i] = hello;
printf( "buf[%d]\t%p\n", i, &buf[i] );
}
printf( "\n\tEnd of func()\n\n" );
}

結果はこう。
(ちなみに、ちょっとプログラムいじっちゃったからアドレスと表記が若干違う。。)

Start
&func   0x100000d3f
buf     0x7fff5fbfeea0
*buf    0xffffffffffffffff
&i      0x10000108c
&hello  0x100000cf8
stderr: Hello xD
No.0 Hello:P
buf[0]  0x7fff5fbfeea0
buf[1]  0x7fff5fbfeea8
buf[2]  0x7fff5fbfeeb0
buf[3]  0x7fff5fbfeeb8
buf[4]  0x7fff5fbfeec0
buf[5]  0x7fff5fbfeec8
buf[6]  0x7fff5fbfeed0
buf[7]  0x7fff5fbfeed8
buf[8]  0x7fff5fbfeee0
buf[9]  0x7fff5fbfeee8
buf[10] 0x7fff5fbfeef0
buf[11] 0x7fff5fbfeef8
buf[12] 0x7fff5fbfef00
buf[13] 0x7fff5fbfef08
buf[14] 0x7fff5fbfef10
End of func()
End
zsh: segmentation fault  ./stack_overflow_test

ほら、実行されない。
ただ不思議なことに、

int a;

だけにした場合と、

int a, b, c, d;

までにした場合、

Start
&func   0x100000d3f
buf     0x7fff5fbfeeb0
*buf    0x7365745f776f6c66
&i      0x10000108c
&hello  0x100000cf8
stderr: Hello xD
No.0 Hello:P
buf[0]  0x7fff5fbfeeb0
buf[1]  0x7fff5fbfeeb8
buf[2]  0x7fff5fbfeec0
buf[3]  0x7fff5fbfeec8
buf[4]  0x7fff5fbfeed0
buf[5]  0x7fff5fbfeed8
buf[6]  0x7fff5fbfeee0
buf[7]  0x7fff5fbfeee8
buf[8]  0x7fff5fbfeef0
buf[9]  0x7fff5fbfeef8
buf[10] 0x7fff5fbfef00
buf[11] 0x7fff5fbfef08
buf[12] 0x7fff5fbfef10
buf[13] 0x7fff5fbfef18
buf[14] 0x7fff5fbfef20
End of func()
stderr: Hello xD
No.1 Hello:P
stderr: Hello xD
No.2 Hello:P

となる。
エラーは起きない。
けど変。

結論:戻り先アドレスまで上がいたら、そこにある情報を実行しちゃいました、的な感じの認識。

まぁ、何にせよ、バッファが溢れないように注意しないといつか痛い目見ますよ、と。
精進します。

アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。

Post to Twitter

, , , ,

No Comments

iPhone SDK アプリケーション開発ガイド

いろいろObjective-C 2.0で迷い、Erica Sadunの「iPhone デベロッパーズ クックブック」を試したりもした(ただし俺が持ってるのは英語版)。
これがなかなかどうして、敷居が高くて困っていた。

素直にO’Reillyの、しかも日本語版の書籍を手に取っておけば良かった・・・。
と言うわけで、先週買いに行ったのがこれ。
iPhone SDK アプリケーション開発ガイド

この本はかなりかゆいところに手が届くと言うか、Erica Sadunと同様iPhone入門書の中で珍しいInterface Builderを使わないiPhoneプログラミングで進んで行く。
そのため、ツール嫌いのコード人間で、俺みたいな脳足りんにはちょうど良い。
敷居はCとオブジェクト指向の知識、あとiPhoneとかiPod Touchを使っていればおおむね理解できる。
今3章までパチパチ打ったり修正したりしてるけど、これがなかなかどうして面白い。
Cookbookではどうにもコードが断片的で、コードの意図するところはとりあえず書いてあるものの、それ以外の変更点その他は女史のサイトからDLして自分で読み解かないといけない。
それに対して、図解が乏しい本書は逆にコード量とその前のコード説明がしっかりとなされている感じ。
そのため、読んでいていろいろ考えさせる。
本来学ぶ上で気にしなくていいようなどうでも良い事柄にはまることが無いため、読んでいて素直に学習できる。

そんなわけで、この本を元にチョイチョイメモを残そうと思った。
ちなみに、この本の作者であるJonathan Zdziarskiは前著「iPhone Open Application Development」でJailbreak前提のオープンソース開発を披露していた偉大なるハッカー。
そのためか、iPhone SDKには隠された機能が多いとして前書きで不満をこぼしているw
この本のサンプルコードに関してはほぼパブリックドメインの形を取っていて、似るなり、焼くなり、売るなり、改変して公開するなり、非公開するなり自由とのこと。
(ただし、サンプルコードの多くの部分を使う場合はO’Reillyとの協議が必要とのこと。)

とりあえず良い本とだけご紹介。

Post to Twitter

, , ,

No Comments

買いたい本、一覧

タイトル 購入 タイトル 購入
計算機プログラムの構造と解釈
計算機プログラムの構造と解釈
BSDカーネルの設計と実装
BSDカーネルの設計と実装―FreeBSD詳解
OpenGLプログラミングガイド-原著第5版
OpenGLプログラミングガイド 原著第5版
OpenGLリファレンスマニュアル
OpenGLリファレンスマニュアル
×
詳解 Objective-C 2.0
詳解 Objective-C 2.0
プログラミング作法
プログラミング作法
珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造
珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造
コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (上)
コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (上)
コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (下)
コンピュータの構成と設計~ハードウエアとソフトウエアのインタフェース 第3版 (下)
コンピュータの構成と設計 第3版 「別冊」歴史展望
コンピュータの構成と設計 第3版 「別冊」歴史展望





Post to Twitter

,

3 Comments

blur 3862 days The Official History [スチュアート・マッコニー著]

内容
 90年代イギリスを席巻したバンドblur(ブラー)。彼らはその名の通り、何となく集まり、何となく出現したかのように見えた。しかしてその実体は、出会い、挫折、酒、ドラッグ、暴力、金銭トラブル、女、名声、そして混沌が入り交じったものであった。この本は、blurはもちろん、あらゆる関係者へインタビューを行った初の公式バイオロジーである。イギリス中を駆けめぐったスキャンダルの真実の一部が、今、明らかに。

アレックス・ジェームス(ベース)、デーモン・アルバーン(ボーカル)、グレアム・コクソン(ギター)、デイヴ・ロウントゥリー(ドラム)

 いやぁ、blurの10年、読み終わりましたよ。非常に濃い内容だった。メンバーそれぞれの生い立ちや、結成まで。地獄のアメリカツアーとマネジャーの使い込みによる借金地獄。そして、名声を手に入れて、酒とドラッグに埋もれる日々。なんか、典型的なロックバンドという感じがした。
 各アルバムの生い立ちも非常に興味深い。彼らの所属するフード・レコードの、当時の代表デヴィッド・バルフェとの対立とかも面白かったし、紆余曲折してできていくアルバムのバックグラウンドが読める貴重な本だと思った。オイラが一番好きなセカンド・アルバムの「モダン・ライフ・イズ・ラビッシ」が最初は7曲しかなくて、それも「For Tommorow」がまだ無かったとか。バルフェが「ところで、シングル用の曲はどれだ?」と言って、ボーカルのデーモン・アルバーンがかちんときて曲を増やしたらしい。
 あと、メディアによって仕組まれた感のあるOasisとの対決についてもさらりと書いてあって、驚いた。この辺りの事情が知りたいなら、是非とも読むべし。
 また、これはグレアム・コクソンが脱退する前のバイオロジーだから、ある種貴重かも。グレアムは誰かが抜けたらバンドの解散とか言ってたけど、結局グレアムが抜けた今もblurは存続していたりして、なんだか感慨深い。最近のグレアムはこの本の中で語っている人物とは別人になったようで、「別にデーモンとそんなに仲がよかったわけじゃない」とか言っているらしい・・・。なんだか悲しいぞ。とりあえず、哀愁に浸りたいファンは絶対読むべき。なんか、苦楽を共にしたような気分にさせてくれるから(笑。

ブラー:3862デイズ―オフィシャル・ヒストリー

著者/訳者:スチュアート マッコニー

出版社:ロッキングオン( 2000-04 )

定価:

単行本 ( 434 ページ )

ISBN-10 : 4947599804

ISBN-13 : 9784947599803


 ではでは・・・。

Post to Twitter

, ,

No Comments

ゴッドファーザー [マリオ・プーゾ著]

あらすじ
1945年ニューヨーク、ロングビーチ。コルレオーネ家の一人娘、コニーとイタリア系移民のカルロ・リッツィとの結婚式が行われていた。長男のソニーはそこで知り合った女としけ込み、三男のマイケルは父ヴィトーとの確執から、距離を置いていた。結婚式は非常に盛り上がり、ヴィトーに名を授かった有名歌手ジョニー・フォンテーンも駆付けていた。そう、このパーティーは、ニューヨークのマフィア一家、コルレオーネ・ファミリーのパーティーなのである。
コルレオーネ・ファミリーは政治とのつながりも強く、世間が思った以上の権力を有していた。そしてその力に目を付けた麻薬ディーラーのソロッツォが、タッタリア・ファミリーの支援を受け、コルレオーネ・ファミリーに近づいてきた。すべての変化は、そこから始まった・・・。
ドン・ヴィトーから一番将来有望と目されながらも、”その道”から距離を置き、さらにヴィトーの制止を振り切って海軍へ志願した三男のマイケルは、徐々にその血塗られた運命に足を踏み入れていく。コルレオーネ・ファミリーを初めとするニューヨーク5大ファミリーの抗争劇が、今、始まる。ヴィトーに、勝算はあるのだろうか。そして、マイケルの運命とは。

brando_godfather
ヴィトー役のマーロン・ブランド

映画版は何度も見ていたわけだけども、原作はやはり読むべきだと痛感した。と言うのも、ヴィトーがどのようにして権力をつかむようになったかなどの詳細ないきさつが記されていたり、映画では語られていないことが多く書かれているから。やや冗長的な感は否めないけど、そんなこと、スティーヴン・キングファンのオイラには屁でもないことだったり。
映画版とこの原作との関係を説明する場合、原作はパート1.5と言った感じ。パート2でロバート・デ・ニーロ扮する若き日のヴィトーの話はこの原作で既に語られている。もっとも、パート2は後日談が描かれている分、濃くなっている。
また、ジョニー・フォンテーンの話は映画よりかなり長くさかれている。映画版では特徴的な部分のみしか語られていないけど、歌手としての没落や、かつての友人との友情話などなかなかよく書かれている。
ゴッドファーザーの凄さは映画版では雰囲気だけで重厚さを醸し出していたけれど、原作では他者への愛と、天性の知性を持って厚みを増しているようにも思える。本当によくできている。ゴッドファーザーを骨の髄まで知りたいのなら、是非とも読んで欲しい。

上下巻だから、息切れしたら終いです(笑。気合いを入れて読みましょう。と言っても、久々にすんなり読めた本だったり。

ゴッドファーザー〈上〉 (ハヤカワ文庫NV) ゴッドファーザー〈下〉 (ハヤカワ文庫NV)

ではでは・・・。

Post to Twitter

,

No Comments

久多良木健のプレステ革命 [麻倉 怜士 著]

内容
プレイステーションを立ち上げた男、久多良木 健(くたらぎ けん)。彼には壮大なビジョンがあった。当時ソニーの研究員だった久多良木氏は、たまたま出会ったリアルタイム3DCGシステム「システムG」と、ほぼ同じ時に買ったファミリー・コンピュータが融合したら、全く新しいコンピュータができあがると考えた。それを実現するまでの10年と、4年で7000億円の連結売り上げを達成するまでを浅く広く触れている。
独自のリアルタイム3DCGコンピュータ像を実現させるための人材発掘。当時ソニー社長だった大賀氏を怒らせた、任天堂との提携と契約破棄。ソフトメーカーへの参入交渉。任天堂時代に築き上げられたゲーム流通の改革。理想的なエンターテインメント・コンピュータの開発。ソニーグループであるが故のジレンマとの戦い。米国販売指揮権の争奪戦。久多良木氏のベンチャービジネス論。PSXから始まるエンターテインメント・コンピュータとしてのPlayStation。以上が主だった内容である。
如何にしてPSが成功したのか。その片鱗が読める貴重な一冊。レアなソニー製CD-ROM一体型スーパーファミコンの写真付き。
何度かPS3の件でいろいろ書いたけど、久多良木さんのやりたいことは全く変わっていない。彼の夢はエンターテインメントのコンピュータを作りたいと言うことに尽きる。1984年、ソニー厚木工場にあった情報処理研究所で出会った衝撃的なリアルタイム3DCG。それに魅了された久多良木さんの気持ちがどのようなものだったか、何となく感じ取れる。
で、いろいろ面白いエピソードがあるんだけど、任天堂との契約決裂のエピソードは面白かった。ソニー大賀社長(当時)と任天堂 山内会長(当時)との間で調印されたスーパーファミコン向けのCD-ROMアダプタ開発は、任天堂の一方的な契約破棄で終わった。そもそもその話を持ち込んだ久多良木さんは、独自開発のゲームに乗り出すチャンスと考えて、それをうまく使った。どの様にうまく使ったかと言えば、大賀社長に対して

「任天堂にあれだけのことをされて、黙っているおつもりですか!」

と言って煽り、

「そんなに言うのだったら、本当かどうか、証明してみろ!」
そして机を叩きながら、拳に力を込め、発したのだ。
「DO IT !!」

と言ったとか(笑。「DO IT」ってアンタ。ナイスです。
あと、SCEがソニーグループにあって、ソニーでは無いという思いから来るジレンマも面白かった。SCEで勝手に1万円値下げして本社から非難囂々だったとか。家電の世界ではモデルチェンジも無しに1万円も値下げはしない、らしい。
逆に、ソニーグループである事を最大限利用した点も面白い。まずは技術力、つまり人材の面。あと、潤沢な資金。巧みな広告戦略。そして、CD-ROM。久多良木さんは本当にタイミングがいい。ただ、そこで思うことはPS3のタイミングの話。本当にあれで良いのかなぁ・・・。
当時のゲーム業界の片鱗が見えてくる一冊でした。こういう事に興味がある人すべてにおすすめ。

久多良木健のプレステ革命 (ワック文庫)

ではでは・・・。

Post to Twitter

, , ,

No Comments

ダ・ヴィンチ・コード [ダン・ブラウン著]

あらすじ
フランス・ルーヴル美術館の館長 ジャック・ソニエールが突如、何者かに殺害された。その遺体は奇妙なことに、レオナルド・ダ・ヴィンチが描いた”ウィトルウィウス的人体図”を模した形に配置されている。さらにそこには、歴史学者のロバート・ラングドンを呼べと血塗られた文字で書かれていたのだった・・・。
警察からマークされたラングドンは、ジャック・ソニエールの孫娘で暗号解読に従事するソフィー捜査官と共に行動することになる。ジャックが残した巧みな暗号を解読した二人は、ジャックがどうしても残したいキリストにまつわる重大な秘密があると言うことをつかむ。そして、その謎を託されたのもまた、その二人であった。
ジャックを殺害してまで秘密に迫ろうとした謎の集団や、司法警察のファーシュが執拗にラングドン達を追いつめる。そんな中、自らの潔白を証明するために奇才 レオナルド・ダ・ヴィンチなどの偉人達が残したキリスト教にまつわる重大な秘密に迫る。

Vitruvius
ウィトルウィウス的人体図

いや、久々に長い本を読んだ。と言うか、本を読んだ・・・。ここ最近、キリスト教というか、聖書というものが面白いと言うことに気がついて、こういう話をむしろ待っていたという感じ。
この本をキリスト教とか聖書になじみが薄い人が読んで果たして面白いのか?そんな疑問がまず出てきた。個人的にはこういう話が大好きだし、この中のノンフィクション部分とされる”シオン修道会”や”クリプテックス”などがあらゆるメディアで否定されたとしても、話の根幹のおもしろさは揺るがない。ただ、キリストの秘密に興味がなかったら、本当にそれまで。
この本が無駄に長い理由は、キリスト教の知識が薄くても、親切丁寧に、あるいはさりげなく解説が成されているため。詰まるところ、無駄ではない(笑。これが読み手の理解を自然に深めているところは、ダン・ブラウンのうまさがあったかもしれない。
この本を薦めるとしたら、憶測や噂、非日常を求めている人かな?なるほどどうして、この本が売れるわけだ。だってそうでしょ?憶測や噂が地球の裏側まで一瞬で届いてしまう世の中。こういう本が売れないわけがなかったのかも。そう言う”現代人”におすすめ。

ちなみに、オイラはハードカバーの上下巻で読みました。今なら激安の文庫版が出ているから、そっちをおすすめしておきます。当然、上中下を買ってもハードカバーより遙かに安いです・・・。なんてこった!

ダ・ヴィンチ・コード(上) (角川文庫) ダ・ヴィンチ・コード(中) (角川文庫) ダ・ヴィンチ・コード(下) (角川文庫)

ではでは・・・。

Post to Twitter

, ,

2 Comments