セキュリティ/ネットワーク/Numpyに関する問題_2020年04月04日
セキュリティに関する問題
- オフバイワンエラー(off-by-one error)とは何か?
数を1つ間違えてしまうことにより発生するエラーのこと。 たとえば、比較演算子を使用した条件分岐で、以下と未満を間違えて使用した場合などに起こる。
- フェンスポストエラー(fence-post error)とは何か?
オフバイワンエラーの一種。 100メートルの柵を作るために10メートル間隔で杭を打つとすると、杭は全部で何本必要かという問いに対して「10本」と答えてしまう誤りのこと。 正解は 11 本である。
- OpenSSHにおける有名なオフバイワンエラーのコードと、その正しい(本来記述すべきだった)コードを書け。 また、その誤りによってどのような脆弱性が生じたか。
誤り if (id < 0 || id > channels_alloc) { 正解 if (id < 0 || id >= channels_alloc) { 一般ユーザーで認証・ログインしている場合でも、システム管理者の特権を奪取することができた。
- Microsoft IIS で Unicode 文字をサポートしたことによりディレクトリトラバーサル脆弱性が生じた。なぜか。
Unicode 文字のサポートによりバックスラッシュ(0x5c)を表現する文字コードが複数できてしまった。 たとえば、%c1%9c という文字が IIS ではバックスラッシュとして解釈されるが、これを解釈するタイミングが、 パスチェックの後になっていた。このため、バックスラッシュの代わりに %c1%9c という文字を入力すると、ディレクトリを横断できるようになっていた。
- NOPスレッドとは何か。また、どのような目的に使用されるか。
NO Operation を意味するアセンブリ命令 nop に由来するハッキング技術。スタックベースのバッファオーバーフロー攻撃を成功させる目的で用いられる。 攻撃者が実行したいシェルコードの前に nop 命令を詰め込むことによって、インストラクションポインタがシェルコードに到達するのを助ける。 NOP スレッドのスレッドは「そり(sled)」を意味する。
- bash のコマンドで数値列を生成するものは何か。
seq コマンド。 `seq 1 10` で 1~10の値を出力する。Python の range と違って 1 から出力される。
- コマンド置換とは何か。またどのように記述するか。
$()をつけて記述することによって、コマンド出力に置き換える方法。 $ echo $(ls -ls)
- /etc/passwd ファイル中でユーザIDを0に変更すると、そのユーザにはどのような権限が与えられるか
root 権限
- c言語の printf() 関数の引数にフォーマット文字列として %n パラメータを与えた場合、どのような挙動をするか
何も出力せず、与えたパラメータ(メモリアドレス)に、%n までに出力したバイト数が書き込まれる。 (%n パラメータにはポインタを入力として与える)
ネットワークに関する問題
Open Systems Interconnection
データリンク層
TCP
-データグラムソケットは、トランスポート層で使用される技術の1つであるが、ストリームソケットと比較してどのような利点・欠点があるか
ストリームソケットに対してプロトコル(UDP)にオーバーヘッドが存在しない、また、開発者が通信を自由に作り上げることができる、という利点があるが、一方向通信であり信頼性は低い。
- ASCII コードで 0x0d と 0x0a はそれぞれ何を示しているか
0x0d CR キャリッジリターン 0x0a LF ラインフィード
- ソケット通信は、OSI参照モデルではどの層に分類されるか
セッション層
- イーサネット対応機器が遵守すべきアドレス規格は何か
MACアドレス
Media Access Control
- MACアドレスは6バイト長であるが、前半3バイトと後半3バイトで、それぞれどのように割り当てられるか
前半3バイトがベンダーID。後半3バイトが製造者が独自に割り当てるID(機種ID、シリアルIDなどが当てられる)。
14バイト
- イーサネットヘッダには、どのような情報が格納されているか
送信元アドレスと宛先アドレスなど
- イーサネットアドレスの1つとしてブロードキャストアドレス ff: ff:ff:ff:ff:ff があるが、このアドレス宛にパケットを送信した場合、パケットは、どの機器に送信されるか。
同一ネットワークに接続されたすべての機器
- ARP とは何の略か
Address Resolution Protocol
- ARP の役割は何か
IPアドレスとMACアドレスを対応付ける
- ARPメッセージには4つのタイプがあるが、そのうち最も重要なものを2つ答えよ
ARPリクエストメッセージ ARPリプライメッセージ
ARPキャッシュ
ブロードキャストアドレス。ブロードキャストでARPリクエストを受け取った機器のうち目的とする接続先だけが、ARPリプライを返す。このとき、ARPリプライに含まれるIPアドレスがARPキャッシュに保存される。
機械学習に関する問題
- googol とはどのような数字か
10**100 (Google の命名のもととなったといわれる)
- 次のコードの最終行の出力はどうなるか
(問題) >>> v = [0.5, 0.75, 1.0] >>> m = [v, v, v] >>> m [[0.5, 0.75, 1.0], [0.5, 0.75, 1.0], [0.5, 0.75, 1.0]] >>> v[0] = 'Python' >>> m
(解答) [['Python', 0.75, 1.0], ['Python', 0.75, 1.0], ['Python', 0.75, 1.0]]
- 次のコードの最終行の出力はどうなるか
(問題) >>> v = [0.5, 0.75, 1.0] >>> m = 3 * [deepcopy(v)] >>> m [[0.5, 0.75, 1.0], [0.5, 0.75, 1.0], [0.5, 0.75, 1.0]] >>> v[0]='Python' >>> m
(解答) [[0.5, 0.75, 1.0], [0.5, 0.75, 1.0], [0.5, 0.75, 1.0]]
- Python3 における list と array の主要な違いは何か。
array は型を制限できる。 >>> from array import array >>> arr = array('f', [0.1, 0.2, 0.3]) >>> arr.append('str') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be real number, not str
- numpy.ndarray の nd とは何を意味するか?
N-dimensional
- numpy.arange は range 関数と似ているが、引数にあるものを追加できる。何を追加できるか?
dtype >>> from numpy import arange >>> from numpy import float >>> arr = arange(0, 30, 3, dtype=float) >>> arr array([ 0., 3., 6., 9., 12., 15., 18., 21., 24., 27.])
- 次のコードの出力を答えよ
(問題) import numpy as np a = np.arange(1, 11, 1, dtype=np.float) a.sum() ... (1) a.mean() ... (2) a.cumsum() ... (2)
(解答) (1) 55.0 numpy.ndarray.sum() は全要素の総和を出力する。 (2) 5.5 numpy.ndarray.mean() は平均値を出力する。 (3) array([ 1., 3., 6., 10., 15., 21., 28., 36., 45., 55.]) numpy.ndarray.cumsum() はインデックス0からの累積和を出力する。
- Numpyにおけるユニバーサル関数とはどのような関数か
numpy.ndarray の全要素について、要素ごとに演算を実行して返す関数。結果は ndarray で返される。 ndarray だけでなく、Python の基本データ型についても適用できるため「ユニバーサル」という名前がついている。 ただし、math モジュールより性能が劣る場合がある。 >>> import numpy as np >>> lst = [1, 2, 3] >>> np.exp(lst) array([ 2.71828183, 7.3890561 , 20.08553692]) >>> np.sqrt(lst) array([1. , 1.41421356, 1.73205081])
- 次の最終行の出力を答えよ
(問題) >>> a = np.array([.1, .2, .3]) >>> b = np.array([a, a*2]) >>> b[:, 1]
(解答) array([0.2, 0.4]) ndarray[:, 列インデックス」で列の ndarray が取得できる。
- 次のコードの出力を答えよ
(問題) >>> a = np.array([.1, .2, .3]) >>> b = np.array([a, a*2]) >>> b array([[0.1, 0.2, 0.3], [0.2, 0.4, 0.6]]) >>> b.sum(axis=0) ... (1) >>> b.sum(axis=1) ... (2)
(解答) (1) array([0.3, 0.6, 0.9]) ndarray.sum(axis=0) で第1軸(縦軸)の要素の総和が出力できる。 (2) array([0.6, 1.2]) ndarray.sum(axis=01 で第2軸(横軸)の要素の総和が出力できる。