MOBLOG | indiakiloの記録

モブでできている

Raspberry Pi 3でハニーポット(0) メモ1

Raspberry Piハニーポットを動かそうと思ったものの、部屋のルータからラズパイにアクセスできなくて止まっている
(基本的に触れられてもいない)

  • ルータにEtherでラズパイを接続してみても、ルータに接続したPCからラズパイを確認できない
      arp -a
    とコマンドしても、ラズパイらしきものが現れない
  • ルータに接続したプリンタはPCに認識されるが、デバイスに追加しようとするとエラーが出る
    (この前までは印刷できたのにぃ??)

以上ルータが原因のような気がする。
リセットしても治らなかったので、何をしたらよいのやら、、、

今度はルータの設定を確認したい。

以上

逆求人イベントに参加してきた

逆求人イベントに参加してきました。
技術力や実行力、プレゼンテーション能力が足りないと言うことを再確認しました。

 

データ分析だとか、機械学習系のインターンが意外と多いことを知りました。

 

大学の講義は学習コストが高いな〜とか考えていました。
自分で勉強したほうが役に立つのに、試験があるから配布資料を読まざるを得ない...
どうやったら、大学の課題はなくなるのでしょう。。。?

(なんてfacebook並の近況報告だ...!!)

Raspberry Pi 3でハニーポット(0)

ハニーポット運用したいなーと思っていたので、Raspberry Pi 3 を購入(x1)したのです。
ただ公開するだけにならないか、果たして”運用”になるのかが不安ですが

 

セットアップしようとして、SDカードにRaspbianを焼き電源を入れたのですが、ssh接続でききない......
いつからSSHがデフォルトで閉じられるようになったんだ......

今のところ手元にモニタがないので、作業が止まっています。
ぱぱっとできるかと思ったのに(bootパーティションにファイルを作る的なことを見たので、調べたい)

 

また手が空いた時に進めます(単位を落としそう!)

セキュリティ・キャンプ2017 参加決定

"この度はセキュリティ・キャンプ全国大会2017にご応募くださり、誠にありがとうございました。

セキュリティ・キャンプ実施協議会 企画・実行委員会による厳正な審査の結果、
セキュリティ・キャンプ全国大会2017へのご参加が決定いたしました。"

 

ありがとう、ございます涙

単位を落とさないよう、がんばります。

(決まってから遅くなりましたが)

UNIX fork (2) | セキュリティキャンプ2017 選-A-4

前回

indiakilo.hatenablog.com

前回のまとめ

  1. forkはプロセスの情報(struct proc)をまとめている配列procから空きのエントリーを見つけて新しいプロセスに割り当てている(ようだった)
  2. newproc関数によって新しいプロセスを生成している(ようだ)
  3. struct proc構造体を使ってプロセスの情報を管理している
  4. struct user構造体を使ってプロセスのデータを管理している
  5. struct procごとにstruct userが割り当てられている 

前回までの疑問

  1. struct proc, struct userを使って、どうやってプロセスを管理しているのか
  2. newprocは何をやっているのか
  3. forkはどうやって返り値を返しているのか
  4. struct user u, struct proc procへは、どうやってアクセスするのか(なぜアクセスできる??)

今回

1. UNIX V6の汎用レジスタ (PDP-11での環境)

UNIX V6はPDP-11という計算機でOSとして使用されていたいたらしい(Version 6 Unix - Wikipedia)。
PDP-11は1ワード16bitの計算機で、
UNIX V6は汎用レジスタとしてr0~r7までの8個のレジスタを扱っている。
そのレジスタの用途を以下に示す(参考[1]より)。

(アキュムレータとSP, PCが汎用?と思ってしまった)

レジスタ 用途
r0, r1 計算用, 関数の戻り値 (つまりアキュムレータ??)
r2, r3, r4 ローカル処理
r5 フレームポインタ, 環境ポインタ
r6 スタックポインタ(sp)
r7 プログラムカウンタ(pc)
r0~r4はともかく、r5, r6, 7は重要だと述べられている。
r6は各プロセスごとのスタックの先頭を指し、r7はフェッチサイクルに使われる。
r5のフレームポインタは、関数呼び出しの際のスタック(コンテキスト保存の際ということ??)の関数のデータの先頭ポインタを指スらしい。

2. struct userと汎用レジスタ

struct userはu_r0というint型のポインタを持っていた(行52)。
(address of users saved R0 とコメントされている)
(address of registeerということか??)

UNIX V6 struct user in /usr/sys/user.h .

このu_ar0は、fork関数でも使われている。

UNIX V6 fork system call in /usr/sys/ken/sys1.c .

プロセスのレジスタの値を保存するために、u_ar0を使っているらしく、つまりu.u_ar0[R0]は関数の返り値を表すのだろうか?? (いつかPDP-11をエミュレーションして試してみたい)

R0という定数を調べてみると、reg.hにたどり着いた。

snipet from UNIX V6 /usr/sys/reg.h .

R5の(-6)だとかっていうのは、アドレスを遡ってアクセスするということか?? (u.u_ar0[R5]とすると, *(u.u_ar + (-6))になるから…)
いつかUNIX V6を動かして、アドレスを比較してみたい。

ところで肝心なu_ar0のアドレスなのだが、これはnewproc関数を見ないとわからないっぽいので、また後で。。。

3. forkの返り値

u.u_ar0を使ってレジスタにアクセスすることがわかった。
 (なぜu.u_ar0がレジスタにリンクしているかはまだわからないが)
 (uとprocがなぜ他のファイルからもグローバルなのかも調べていない)

ところで、forkがvoidなのになぜPIDを返しているのか、という疑問だが、u.u_ar0[R0]を設定することで実現しているのだと思う。
 (これはアセンブラを見ればわかるのだと思う)

forkでは、newprocを呼び出したあと、u.u_ar0[R0]をp1->p_pidもしくはp2->p_pidに設定している。
p1は元プロセスのprocで、p2はprocへと新たに配置されたprocエントリである。
ということは元プロセスのprocのエントリでu.u_cstimeだとかを初期化しているので、子プロセスと親プロセスのprocエントリの位置が入れ替わっていないか??

よくわからないが、PIDを返す方法がわかった。

まとめ

わかったこと

  • forkがu.u_ar0[R0]を使って返り値を設定している(なぜそんなめんどくさいことを?)。

疑問

  • u.u_ar0がどうしてレジスタにリンクしているのか。
    (メモリマップドIOだからレジスタのアドレスを設定してるのかもしれない)

以上、
次回はnewprocについて調べたい。

参考

UNIXにおけるプロセスについて調べていると、以下の本が出てきた。
とても参考になっている。

[1]青柳隆宏 著 はじめてのOSコードリーディング ――UNIX V6で学ぶカーネルのしくみ
gihyo.jp 

UNIX fork (1) | セキュリティキャンプ2017 選-A-4

 

indiakilo.hatenablog.com 宣言したとおり、UNIXのforkについて(C言語の実装を)調べた。

 

1.概要

forkは現在実行中のプロセスを複製し、子プロセスを作成する。

親プロセスでは子プロセスのpid、子プロセスでは0が返る(返り値に関してはいろいろありそうだ)。

pid = fork();

と呼び出した時、pid==0なら子プロセス、pid!=0ならば親プロセスとなる。

2.参考

以下のUNIX V6のソースコードを参考にした。

基本的にソースコードで十分だった。

3. forkの大まかな流れ

 まずsys1.cのforkの定義を見ていく。

UNIX V6 fork system call in /usr/sys/ken/sys1.c .

 最初に、uという構造体からu_procpというメンバの値を取得している。uについては後述するが、プロセスを管理する上で必要なものなのだろう。

 行6-13でprocという配列から、p_statがNULLでない要素を探している。
proc配列はstruct proc型の配列で、/usr/sys/proc.hで宣言されている。
どうやらこのproc配列は、プロセスを管理するために使用されているようだ。

 

 forkはprocの中から空き(p_statがNULL)を探し、見つけたらgoto文でfoundに移る(行11)。
見つからなかった場合は、エラー処理のようなものを行い、gotoでoutに移る(行12-13)。
foundでは、newprocという関数を呼び出している(行16)。
おそらく新しいプロセスを生成しているようだが、詳しくは後ほど見ていこう。

 newprocを呼び出したあとはu構造体のメンバの値をいろいろと変更している(初期化のようだ)。
procとuserとを合わせて、プロセスの管理に用いられているのだろう。

 ところで、forkはpidを返すはずだが、考えてみればforkはvoidである。
どのようにpidが返されるのだろうか。今度は、所々で現れるuとprocについて見てみよう。

3.  proc と user

 forkで参照されていたproc配列、uという構造体変数はそれぞれ/usr/sys/proc.h, /usr/sys/user.hで定義、宣言されている。

UNIX V6 struct user in /usr/sys/proc.h

UNIX V6 struct user in /usr/sys/user.h .

 コメントを見る限り、プロセスごとにprocとuserが割り当てられ、procはプロセスの情報、userはプロセスのすべてのデータを持っているらしい。
またprocはプロセスのスワップに関する必要なデータを持っていて、userは時にスワップされるらしい。
procはuserに対する参照を持っていないようだが、userはprocに対する参照u_procpを持っている(user.h:行25)。
procとuserはuidやpidを持っている。

 userはu_dsizeなど、意味有りげなメンバを持っている。

 

切りが悪いが、メモ代わりに一旦ここで投稿する。
(あと2日は掛かりそうだ...)

今度はprocとuserによるプロセスの管理方法、newproc関数に関して詳しく調べて行きたい。

 

 

セキュリティ・キャンプ2017 選-A-4を頑張る

セキュキャンの応募は2017.5.29に終了した。

選択問題は

  • 選-A-2 機械学習の弱点

  • 選-A-4 UNIX printf, forkについて

  • 選-A-5 cve-2016-0728について

を選択したが、A-2はまあまあ、A-5は解けず、A-4は時間がなくなり何もできなかった。

(A-4が泥沼過ぎて笑えなかった)

A-2, A-5の話は後ほどでまとめたいが、A-4を今からでも解きたい。

(このブログのアクセスカウンタが0なので、選考する人がまだ私の解答を見ていないことはわかっている!)

選-A-4. C言語のprintf()関数またはUNIXのfork()というシステムコールについて、これらはどのようなものですか?  数値や文字列を表示する・プロセスを作るというだけではなく、深堀りして考え、疑問を持ち、手を動かして 調べてわかったことを教えてください。 

これを今日(5.31)にやってみて、できたとこまでをとりあえずアップしたい。選考者様にはぜひ見ていただきたい。