TCP/IP Programing

課題1: telnetコマンドによるWWWサーバへのアクセス

実行結果(telnet www.ie.u-ryukyu.ac.jp 80 -> GET /index.html HTTP/1.0)

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html lang="ja">
	
	<head>
	<meta http-equiv="content-type" content="text/html; charset=shift_jis">
	<meta http-equiv="content-style-type" content="text/html">
	<link rel="stylesheet" type="text/css" href="./css/stylesheet_1.css">
	<link rel="SHORTCUT ICON" href="./icon/fav-ie2.ico">
	##################################
	</head>
	
	###################################
			Sat Jan  1 12:53:12 JST 2005
	  -->
	<body bgcolor="#CC9966">
	
	#########################
	##########################
	<div class="eng-logo">
	<a href="http://www.ie.u-ryukyu.ac.jp/index-e.html" style="text-decoration:none;
	">
	

課題2: inetdを使用するサーバプログラムの作成

変更点

実行結果(client.c)

	Connected.
	Input Keyword = warning: this program uses gets(), which is unsafe.
	yama
	Keyword = [yama] / Data = [kawa]
	
	Input Keyword = xyz 
	Keyword = [xyz] / Data = [XYZ]
	
	Input Keyword = 123
	Keyword = [123] / Data = [456]
	
	Input Keyword = xxxx
	Keyword = [xxxx] / Data = [yyyy]
	
	Input Keyword = shiro
	Keyword = [shiro] / Data = [kuro]
	
	Input Keyword = kawa
	Keyword = [kawa] / Data = []
	
	Input Keyword = ^C
	

client.c中の関数の説明

server.c中の関数の説明

サーバ・クライアントプログラムの動作フロー

課題3:inetdを使用しないサーバプログラムの作成

Source Code

client_noninetd.c
server_noninetd.c
inetdを使わない場合は、inetdを使う場合に比べて以下の関数を追加する必要がある。
	
  1. bind()
  2. listen()
  3. accept()
inetdを用いたサーバプログラムでは,サーバはinetdに呼び出された時だけ
起動するので,メモリ等の資源を節約できる。しかし、通信の速度は呼び出されでから起動するため遅くなる。
デーモン型の方はサーバプログラムが常に起動しているため,通信の速度は
inetdを利用する場合より早いがinetdの場合より, メモリ等の資源を消費してしまうという
デメリットがある。
	

実行結果

	[TCP_Programing : 12/12 15:21] ./noclient
	Input Keyword = yama
	Output Keyword = kawa
	
	Input Keyword = xyz
	Output Keyword = XYZ
	
	Input Keyword = 123
	Output Keyword = 456
	
	Input Keyword = xxxx
	Output Keyword = yyyy
	
	Input Keyword = ^C
	

課題4:HTTPクライアントの作成

Source Code

gethtml.c

実行結果

[TCP_Programing : 12/12 15:31] ./gethtml
Input server address = www.u-ryukyu.ac.jp 

Connected.
download index.html (yes?/no?)
yes
HTTP/1.1 200 OK
Date: Tue, 12 Dec 2006 06:33:01 GMT
Server: Apache/2.2.2 (Fedora)
Last-Modified: Tue, 12 Dec 2006 06:11:30 GMT
ETag: "122b27d-23a6-2734a880"
Accept-Ranges: bytes
Content-Length: 9126
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
#######################################
<style type="text/css">
<!--
    td {
         font-size: smaller;
    }
-->
</style>
<!-- <script language="javascript" src="preview/rollover.js"></script> -->
<style type="text/css">
</style>
<link href="preview/ryudai2.css" rel="stylesheet" type="text/css">
</head>
	

課題5:ポートスキャンの実験

Source Code

portscan.c

実行結果

	[TCP_Programing : 12/12 15:35] ./portscan
	Input address : 133.13.59.19
	
	Port number = 80 : use
	Port number = 139 : use
	Port number = 427 : use
	Port number = 445 : use
	Port number = 548 : use
	Port number = 631 : use
	
	Port Scan end
	Disocnnected.
	

課題6:バッファオーバーフローの実験

問題の原因

	操作していないバッファdmy[]に値が入ることがあるという問題の原因は,
	gets()関数に起因する。このgets()関数は読み込む文字列のサイズを
	指定できないので,バッファのサイズを超えて読み込みを続けてしまうことがあり,
	このために、バッファのサイズを超える文字列を読み込み結果として,buf[]に
	格納できなくなり,dmy[]に値が入ってしまうことになる。gccのコンパイラーでも
	warning: this program uses gets(), which is unsafe.と警告が出る。
	

問題の解決方法

	この問題の解決方法は、既に考えられており、fgets()関数を用いることで
	解決することができる。fgets()関数では保存先のメモリだけではなく、そのメモリの
	サイズも指定することができるので、gets()関数のようにバッファのサイズを超えて文字列
	を読み込むことはなくなる。
	以下にこのgets()をfgets()に書き換えたプログラムを示す。
	

Source Code

bofovf_fgets.c

実行結果

	[TCP_Programing : 12/12 16:06] ./bo_fg 
	before
	buf(Len:0) = 
	dmy(Len:0) = 
	1234567890
	after
	buf(Len:2) = 12
	dmy(Len:0) =
	

セキュリティ上の問題

  バッファオーバーフローを悪用した不正アクセスを行なうには高度な知識が必要だが、
成功するとバッファオーバーフローを引き起こしたプログラムが持っているアクセス権
の範囲で任意の動作を行なうことが可能となる。
 一般にWebサーバなど、インターネット経由でサービスを提供するプログラムは管理者権限で
稼動しているため、こういったプログラムのバッファオーバーフローを使われてしまうと、
不正侵入者に管理者権限を奪われることもある。