課題1
課題2
課題3
課題4
課題5
課題6
参考文献
■課題1:telnetコマンドによるWWWサーバへのアクセス telnetコマンドを使って任意のWWWサーバにアクセスし、任意のURLのページデータ(htmlソースプログラム)を画面に表示せよ。 (報告書にはそのURLとページデータの先頭の20行程度を添付せよ) 実行結果 kyan-takahisa:/Users/j05016/z2-3>telnet www.google.co.jp 80 Trying 66.249.89.99... Connected to www.google.com. Escape character is '^]'. GET /index.html HTTP/1.0 HTTP/1.0 302 Found Location: http://www.google.co.jp/index.html Cache-Control: private Set-Cookie: PREF=ID=9f713f3db3dd2f13:TM=1164951439:LM=1164951439:S=8fWR517gOGGV1ImB; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com Content-Type: text/html Server: GWS/2.1 Content-Length: 231 Date: Fri, 01 Dec 2006 05:37:19 GMT Connection: Keep-Alive ■課題2:inetdを使用するサーバプログラムの作成 サンプルプログラム(1)はサーバ(server.c)をinetdから起動することで、 サーバはクライアント(client.c)の標準入力から入力された文字に対応するキーワードをクライアントに返すプログラムである。 サンプルプログラム(1)を自分の実験環境で動作するようにし、実行結果を示すとともに、 プログラムの中で使われている関数(Connect,Disconnect, Send Data, Recv Dataなど)の動作を説明し、サーバ・クライアント動作全体をフローを示して説明せよ。 サンプルプログラムの変更点 client.c #define HOST_NAME "nw0516.st.ie.u-ryukyu.ac.jp" server.c #define DATAFILE "/Users/j05016/tcp/data" 実行結果------------------------ nw0516:/Users/j05016/tcp>client Connected. Input Keyword = warning: this program uses gets(), which is unsafe. yama Keyword = [yama] / Data = [kawa] Input Keyword = 123 Keyword = [123] / Data = [456] ------------------------------- 関数の説明-------------------- ・Connect() ソケットの生成とコネクション確立のためのリクエストをサーバに送る。 ・SendData() サーバへデータを送信。 ・GetLineFromPeer()  クライアントからデータを受信。 ・GetKeywordData() 受信したデータを「data」の中身と比べて変換する。 ・RecvData() 上記の関数から送られてきたデータを受信する。 ・Disconnect() 接続を終了する。 ------------------------------ フローチャート ■課題3:inetdを使用しないサーバプログラムの作成 サンプルプログラム(1)のサーバプログラム(server.c)はinetdから起動するものであるが、 inetdを使用せずに同じ動作をするデーモン型のサーバプログラムを作成し、実行結果を示すとともに、 inetdを使用するサーバプログラムとそうでないものとの実装上の違いを説明せよ。 client3.c server3.c 実験結果 nw0516:/Users/j05016/tcp> server3 now waiting for client connect Connected from 127.0.0.1 nw0516:/Users/j05016/tcp>client3 Connected. Input Keyword = warning: this program uses gets(), which is unsafe. yama Keyword = [yama] / Data = [kawa] Input Keyword = 123 Keyword = [123] / Data = [456] inetdはクライアントからの要求があると、サーバーを起動させる。 利点としては、クライアントからの要求がない時はサーバを起動していないので、CPUやメモリを消費せずに済む。 欠点は、要求があった時にサーバを起動するので、若干時間がかかってしまう。 inetdを使用しない場合は常にサーバを起動させとおかないといけない。 利点はサーバが常に起動しているので、応答時間が短い。 欠点は常にCPUやメモリを消費し続けてしまう。 ■課題4:HTTPクライアントの作成 ソケットおよびHTMLを使ってWWWサーバから任意のURLのページを取得し、標準出力に出力するプログラムを作成せよ。 gethtml.c 実験結果 nw0516:/Users/j05016/tcp>gethtml www.google.co.jp/ HTTP/1.0 200 OK Cache-Control: private Content-Type: text/html Set-Cookie: PREF=ID=c494f2d009d471cc:TM=1165984153:LM=1165984153:S=G6V2NUrJ4XpCIoU-; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com Server: GWS/2.1 Date: Wed, 13 Dec 2006 04:29:13 GMT Connection: Close <html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style><!-- body,td,a,p,.h{font-family:arial,sans-serif} .h{font-size:20px} .h{color:#3366cc} .q{color:#00c} --></style> <script defer> <!-- function sf(){document.f.q.focus();} // --> </script> </head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onload=sf() topmargin=3 marginheight=3><center><div align=right nowrap style="padding-bottom:4px" width=100%><font size=-1><a href="https://www.google.com/accounts/Login?continue=http://www.google.co.jp:80/&hl=en">Sign in</a></font></div><a href="/search?q=edvard+munch"><img src=/logos/edvard_munch.gif width=325 height=125 border=0 alt="Happy Birthday, Edvard Munch!" title="Happy Birthday, Edvard Munch!"></a><br><br><form action="/search" name=f><script defer><!-- //--> </script><table border=0 cellspacing=0 cellpadding=4><tr><td nowrap><font size=-1><b>Web</b>    <a class=q href="http://images.google.co.jp/imghp?ie=ISO-8859-1&oe=ISO-8859-1&hl=en&tab=wi">Images</a>    <a class=q href="http://groups.google.co.jp/grphp?ie=ISO-8859-1&oe=ISO-8859-1&hl=en&tab=wg">Groups</a>    <a class=q href="http://news.google.co.jp/nwshp?ie=ISO-8859-1&oe=ISO-8859-1&hl=en&tab=wn">News</a>    <a class=q href="/maps?ie=ISO-8859-1&oe=ISO-8859-1&hl=en&tab=wl">Maps</a>    <a class=q href="http://scholar.google.com/schhp?ie=ISO-8859-1&oe=ISO-8859-1&hl=en&tab=ws">Scholar</a>    <b><a href="/intl/en/options/" class=q>more »</a></b></font></td></tr></table><table cellpadding=0 cellspacing=0><tr valign=top><td width=25%> </td><td align=center nowrap><input name=hl type=hidden value=en><input type=hidden name=ie value="ISO-8859-1"><input maxlength=2048 name=q size=55 title="Google Search" value=""><br><input name=btnG type=submit value="Google Search"><input name=btnI type=submit value="I'm Feeling Lucky"></td><td nowrap width=25%><font size=-2>  <a href=/advanced_search?hl=en>Advanced Search</a><br>  <a href=/preferences?hl=en>Preferences</a><br>  <a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><font size=-1>Google.co.jp offered in: <a href="http://www.google.co.jp:80/ja">日本語</a> </font><br><br><br><font size=-1><a href="/intl/en/ads/">Advertising Programs</a> - <a href=/intl/en/services/>Business Solutions</a> - <a href=/intl/en/about.html>About Google</a> - <a href=http://www.google.com/ncr>Go to Google.com</a></font><p><font size=-2>©2006 Google</font></p></center></body></html> ■課題5:ポートスキャンの実験 自分の実験環境(端末)の使用/未使用ポート(ウェルノウンポートのみでok)を確認するポートスキャンプログラムを作成せよ。 さらに、任意のリモート端末の使用/未使用ポートを確認するように改良せよ(加点ポイント)。 なお、スクリプトを使って内部で'netstat -l'コマンドを実行し、その結果を利用するのは不可とする(ソケットプログラムを作成すること)。 ptscan.c 実行結果 nw0516:/Users/j05016/tcp>ptscan 133.13.59.16 well-knownport scan 427 There are using nw0516:/Users/j05016/tcp> ■課題6:バッファオーバーフローの実験 サンプルプログラム(2)を実行せよ。このプログラムはgets()関数を用いて、 標準入力からの入力をバッファにデータを読み込むものであるが、結果を見ると、 プログラム中で操作していないバッファdmy[]に値が入ることがある。この原因を考察し、解決策を示せ。 また、この問題によって引き起こされるTCP/IP通信におけるセキュリティ上の欠陥はどのようなものが考えられるか、具体例を挙げて述べよ。 プログラム中の #define BUFLEN 200 を #define BUFLEN 3 に変更して実験を行った。 実行結果 nw0516:/Users/j05016/tcp>./bufovf before buf(Len:0) = dmy(Len:0) = warning: this program uses gets(), which is unsafe. 123456789012345678901234567890123456789012345678901234567890 after buf(Len:60) = 123456789012345678901234567890123456789012345678901234567890 dmy(Len:0) = Segmentation fault nw0516:/Users/j05016/tcp> 考察 誤動作の原因は、gets関数にある。 gets関数は、バッファ長のチェックを行わずに入力をバッファに書き込むので、 プログラムが用意したバッファの領域を超えてしまった場合、その領域をはみだしてデータを書き込んでしまう。 解決策としてはgets関数の代わりにfgets関数を利用することが挙げられる。 fgets関数の場合は関数にバッファの大きさを指定することができるので、指定したバイト数以上のデータを書き込むことは無い。 セキュリティ上の欠陥には、意図的なデータ(悪意のあるコード)を与える事により、 コンピュータの動作を乗っ取ってしまう事ができる。などが挙げられる。 参考文献 68user's page http://x68000.q-e-d.net/~68user/net/inetd-1.html JM Project http://www.linux.or.jp/JM/