sti320a

勉強したことのまとめ

セキュリティ/ネットワーク/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) {

一般ユーザーで認証・ログインしている場合でも、システム管理者の特権を奪取することができた。
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 ラインフィード
セッション層
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リプライメッセージ
  • 機器Aが機器Bに対しTCPコネクションを確立しようとしたとき、機器BのIPアドレスを得るために、最初に参照するところはどこか。
ARPキャッシュ
  • ARPキャッシュに接続先のIPアドレスが存在しなかった場合、機器はどのアドレスに対して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軸(横軸)の要素の総和が出力できる。