経緯
very early C
K&R
C言語の開発者の頭文字
ブライアン・カーニハン
経緯
very early C
K&R
C言語の開発者の頭文字
ブライアン・カーニハン
本来は、アセンブリ言語を機械語に翻訳するソフトウェア。
アセンブリ言語と同じ意味で使われているような気がする
シンボル
シンボルを絶対アドレスに置き換える
UNDなシンボルは、暫定的なアドレスを割り当てて、後でリンカが解決する
CISTの図書館では、研究室に配架された本を借りることもできるようだ
できない場合もある
図書館が、利用者と研究室を仲介する形で動くそうだ
Gitと紐づいたソースコード管理サービス
機能
リモートレポジトリを提供してくれる
Issueを立てることができる
マージを行うことができる
RAM
コンピュータでは主記憶装置のこと。
一時的な記憶領域だから揮発性がある。
メモリが多ければ多いほど重たい処理ができたり、いろいろなアプリを並列で起動できたりする。
イメージは机の面積(机が大きければ大きいほどいろいろできるよね)
図書館にまだない本。
各々が欲しい本を書いていって、分担でリクエストしたらいいかも?
1人あたりの購入額に制限があるため。
このリンク良くないかも
分類が始まってる
セキュリティを学ぶのに役立った本
コンピュータサイエンス
低レベルプログラミング
セキュリティコンテストチャレンジブックとゼロからのOS自作入門、リンカ・ローダ実践開発テクニックなど併せて読み進めると、以下のような知識が整理される
アセンブリ言語
Executable and Linkable Formatは、多くのUNIX系OSにおけるオブジェクトファイルのフォーマット。
nasmでELF形式のオブジェクトファイルを出力したいときは、elf64を-fオプションに指定する。
64bitバージョンであることを仮定した。
オブジェクトファイルとは、(エンコードされた命令)encoded instructionsを含むファイルのこと。
アセンブリ言語
cf. 低レベルプログラミング
現時点ではx86_64アーキテクチャの内容のみです。他のアーキテクチャでは動作が異なる場合があります。
アセンブリ言語でも、関数を使って処理を抽象化することができる。
call命令 / ret命令
Back 2024/01/27 ELF読解演習
演習:
1. 以下のコマンドを用いて、生成したオブジェクトファイルをリンクしてみましょう。
$ ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o -lc howto_compile.o /usr/lib/x86_64-linux-gnu/crtn.o -o howto_compile.out
picoCTFの過去問のwriteup
自由に書いてOK
始める前の状態
シェルワンライナー160本ノックやセキュリティコンテストチャレンジブックを部分的に読んだ
CISTの図書館選書ツアーに添えて
2023/07/05
低レベルプログラミング
本書は、x86-64アーキテクチャを用いたプログラミングの基礎を俯瞰するのに大変有用である。
仮想メモリや割り込みといった複雑なx86-64の機能が体系的に説明される。
C言語の構造体は、各メンバの値が順番に格納されている。
したがって、包含関係にある構造体のポインタ型にキャストできる場合がある。
#include <stdio.h>
struct animal {
const char* scientific_name;
C言語のプリプロセッサ
#defineを使用すると、
低レベルプログラミングによれば、#symbol
という書式を用いると、symbolの内容が2重引用符で「引用」されるというが
#define content Hello
#define message #content
gccに生成されたオブジェクトファイルを読んで見る
ELF形式のオブジェクトファイルを出力
そもそもオブジェクトファイルとは?
低レベルプログラミングで確認しよう
これを確認したかったのは、関数は機械語レベルの機能なのか、それとも言語機能なのかを知りたかったから
Caller-Saved Registersの、低レベルプログラミングにおける訳語。
第20週: 日月火水木金土
2023年 36.99%経過
今日のn年前
2022/05/15
2021/05/15
頻出度順漢字検定2級合格!問題集
低レベルプログラミング
栢木先生の基本情報技術者
並行プログラミング入門
低レベルプログラミングを読むページ
NASMとgccとMakeとGDBが使えるDevContainerを作る
EDSACの登場により、人類はプログラミング可能な計算機を獲得した
だがEDSACの操作方法は、パンチカードや紙テープなどに記録した命令や数値をメモリに読み込ませるという、あまりエレガントではない方法だった
この話はプログラマのための文字コード技術入門でも触れられていた
アセンブラの登場
1950年ごろ
https://interface.cqpub.co.jp/magazine/202307/
今月号はRaspberry PiでOS自作。
基本的なOS機能を、C言語(と一部アセンブラ)で実現する
おもしろそう!
2023/05/25
C#のソースコードがコンパイルされると、中間コードを生成する
Javaと同様
実行するときはCRLが中間コードをそれぞれの環境の機械語に変換する
Compare and Swap(CAS)は、同期処理機構の1つであるセマフォや、ロックフリー、ウェイトフリーなデータ構造を実装するために利用される処理である。
#include <stdint.h>
#include <stdbool.h>
bool compare_and_swap(uint64_t *p, uint64_t val, uint64_t newval)
{
たぶんReverse Engineering(リバースエンジニアリング)の略?
前提知識
wgetでファイルをダウンロードする
curlでもよい
tarコマンドでtarファイルを解凍する
セキュリティコンテストチャレンジブックを読む前に、演習用のファイルをダウンロードしておくこと
サポートサイト
セキュリティコンテストチャレンジブック サポートサイト | マイナビブックス
「演習用のファイル」の項に、各章の演習用ファイルがzip形式で置かれている
Pwn
家庭、施設などであらゆる家電や電気設備をネットワークに接続してエネルギー使用状況を観測し、省エネやピーク電力のカットを目指すやつ
読み方:ヘムス
Autonomous System、自律システム
ネットワークの集まり
組織( ISP、企業、研究機関、拠点)とざっくり言い換えてもよい?
データリンク層で動作するネットワーク機器
ネットワーク
データリンク層
主な機能に、L2スイッチングがある
Adress Resolution Protocol
ネットワーク
ネットワーク層
データリンク層
データリンク層とネットワーク層の架け橋的なポジション
Power over EthernetPower over Ethernet
ネットワーク
データリンク層
本来データの通信が主な用途である、ツイストペアケーブルを使って電源の供給を行う技術。
PoE+
Virtual LAN
ネットワーク
データリンク層
1台のL2スイッチを仮想的に複数のL2スイッチとして扱う技術
L2スイッチそれぞれのポートに対して、VLAN IDを割り当てる
岩田聡
https://www.4gamer.net/games/999/G999905/20151225009/
驚いたのは,なんと岩田さんは,アセンブリ言語で書かれたゲームボーイ版のソースを見ながら,それをC言語に書き換えるというやり方で作っていたんですね。
手動逆コンパイルに近いと思う
多分これができるようになるには
x86アーキテクチャを学習するのに良いのかな
OS自作する本
C言語を使わないでNASMを使ったアセンブリ言語だけで書くというから驚いた
アセンブリ言語の本
from アセンブリ言語のプリプロセッサ
アセンブリ言語でマクロを定義するには、%defineを使う
%define number 42
mov rax, number
アセンブリ言語のプリプロセッサは、置換したあとの文法が正しいかどうかについて、まったく関知しない
アセンブリ言語でマクロを定義する
並行プログラミング入門の2.1.1節
アセンブリ言語では、
x0=x1+x2
のような数式を
add x0 x1 x2;
C言語における、コンパイラの最適化を抑制したメモリアクセスを実現するための修飾子。
Rust言語には、read_volatileとwrite_volatile関数がある。
なぜ必要?
メモリアクセスを行う場合、意図したメモリアクセスが行われなくなることがある。
メモリアクセスはレジスタアクセスに比べて低速なので、レジスタに値をコピーしてから参照する、など
C言語のBNF
https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%20C%20in%20Backus-Naur%20form.htm
拡張的な文法。
<pointer> ::= * {<type-qualifier>}* {<pointer>}?
pointerは* 複数のtype-qualifier
という構造を繰り返し書ける?
情報技術概論の最終課題
C言語を使うと思っていた
実際には、使用言語にはまったく制約がない
えっそうなの??じゃあjsでやろうかなあ
メールで問い合わせて知った
C言語のキャストは内部的にどうなっている?
単に4バイトの変数の領域を8バイトで見る、などの実装は無理そう
メモリの確保を行っている?
intのキャストを行うプログラム
#include <stdio.h>
Visual Studio CodeでC言語を書いている
コードを含むパッケージのシンボリックリンクを、EDK2におけるMdePkgと同じディレクトリに置いた
シンボリックリンク元ではUefi.hのincludeが解決できなかった
エラーが発生した
シンボリックリンク先では、文法エラーの検出も行われなかった
rabin2のオプション。
バイナリファイルの形式の解析。
例
セキュリティコンテストのためのCTF問題集の最初の問題のファイルに対して実行した。
$ rabin2 -I ./SelfReference
ISOが整備したC言語の規格をJISが翻訳したドキュメント。
https://www.acepace.net/integerQuiz/
C言語の、特に整数についての奇妙な動作にまつわるクイズが集まったサイト
from 真の情報技術概論
情報技術概論の実態はC言語が中心
現在の情報技術概論の実態はC言語を中心に進行される
4年間全体で、概論と呼べる範囲をカバーしている?
シラバスを読んだ限りでは、C言語という名前のほうが自然かも
ブライアン・カーニハン (英: Brian Wilson Kernighan、1942年1月1日 - ) は、ベル研究所に在籍していたカナダ出身の計算機科学者である。C言語やUNIXの開発者であるデニス・リッチー、ケン・トンプソンと共に、C言語およびUNIXに対する多くの研究開発結果による貢献で知られている。
多くのプログラミング言語入門書で、最初のプログラムとして書かれる Hello world は、彼がベル研究所で書いたB言語に対するチュートリアルで初めて使われたものである。
CIST IT COMMUNITYに加入いただきありがとうございます!
今後の皆さんのCIST ITでの活動は、先輩がメンターとなってサポートします。
活動に参加するには、次に示す手順を実施いただく必要があります
分からない点があったときには、メンターに次のようなメッセージを送ってください。
新規メンバー向けガイドの◯番が分かりません。困っている点は、...
from:データレイヤ/Android
直訳:「倉庫」
Githubでは
「データ置き場」のように捉えていた
データレイヤ/Androidでは
GitHub、というかGitの練習をしたいのでだれか一緒にjsで簡単なプロジェクト作りません?
共同作業するうえでコメントの書き方も練習したいっていうのもありますし
あ、でも今ちょっと千歳学が忙しいんでもうちょっと先がいいもですわ
Githubレポジトリへのアクセスには、SSHプロトコルまたはHTTPSプロトコルが利用される
SSHアクセスには、SSHキーペアの設定が必要
HTTPSアクセスには、ユーザ名とパスワード(またはパーソナルアクセストークン)が必要
どのようにキャッチアップするか?
カンファレンス
CEDEC
PyCon
Webサイト
インターネットにアウトプットする習慣がないのはなぜ?
今Scrapboxに書き込んでいる人は何がきっかけでインターネットへの書き込みを始めた?
初めての書き込み
小6
from GitHubを使ってみよう
GitHubでリポジトリを作成する
1. Create a new repository画面を開く
2. Create a new repository画面で、必要事項を入力する
3. ボタンをクリック
from GitHub
そのプロジェクトでやる必要のあることを提起できるGitHubの機能
リポジトリとは、Gitの機能のひとつで、コードを保管しておく場所のこと
プログラムで作ったものはひとつのディレクトリにまとまっているはず
そのディレクトリのことをGitではだいたい「リポジトリ」と呼んで扱っているよ
リモートリポジトリとローカルリポジトリ
リモートリポジトリはクラウド上にあるリポジトリ
みんなとゲーム開発したい
プラットフォーム
GitHub
分担
画面ごと
GitHubが提供するCIツール
GitHubリポジトリへのコミットなどをトリガーに、決まったプログラムを実行できる
GitHub Actionsのトリガーには他にも様々ある。
立てたいね
GitHubのメリット
GitHubの導入
実際に使ってみる
第18週: 日月火水木金土
2023年 34.52%経過
今日のn年前
2022/05/06
2021/05/06
勉強会
定例会の後半40分程度を使って、1年生が開発を体験できるようにする会
ハンズオン形式で行う。意欲のある参加者は、復習課題を利用できる。
目標
1. Pythonを使って、3人組で1つのアプリケーションを完成させられる。
from Python勉強会
目標
共同開発の体験をする
Git、GitHubなどの使い方を実践するのが目標です
レベル分けがあってもいいと思います
https://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
システムコール
libcで呼び出せるread関数などは内部的にシステムコールを呼び出しているが、そのものではない
システムコールはOSの機能
syscall命令がx86_64アーキテクチャに含まれる
プロセッサがOSの機能を呼び出しているのか?
manでLinuxのコマンドのヘルプを読むことができるが、
manではシステムコールのヘルプを読むことも出来る。
例
$ man write
$ man exit
straceやgdbの実装に使われているシステムコールの1つ
性能の高いつよつよPCがほしい!!
やりたいこと
APEXのような重いゲームをサクサク動かしたい
今のPCだと動かない。悲しい...
Minecraftを影Modとかでめっちゃきれいにしたい
おすすめPCの選び方
どういう会ですか?
PC買ってない新入生向け
前半はPCの基礎知識に関するレクチャー
内容
スイッチサイエンスでは販売終了?
https://www.switch-science.com/products/6805
Intelプロセッサー、8GBメモリ、128 GB SSDを内蔵し、実用的に使用できるミニPCです。机上においても気にならないサイズで、豊富なインターフェースを備えています。CPUやメモリ、SSDなど動作に必要なパーツは取り付け済みなので、OSを用意するだけですぐにPCとして使用できます。工事設計認証(いわゆる技適)取得済みです。
CPUが内部にもつ記憶装置。
非常に高速だが、設置が困難なため、搭載容量は少ない。
価格の問題
レジスタはトランジスタを用いるので、高価
DRAM
CPUと主記憶の間に挟まるメモリ。CPUの待ち時間をなくすとともに実行アクセス時間の短縮を担っている。
キャッシュがうまくいく理由
最近アクセスされたデータは近いうちに再び参照されることが多いから
Random Access Memory
RAMとは、読み書きが可能なメモリのことである。揮発性がある。
DRAMとかSRAMとかあるよ。
アクセス先のメモリの番地がどこであっても、同じくらい迅速にアクセスできる
メモリのランダムな場所にアクセスしても遅くならない
大学生にはPCが必須!
しかしPCは高い。しかも長い付き合いになります。そこで、先輩たちが後輩にいいPCの選び方を指南します!
ぼったくりPCに注意!
大手家電量販店(ヨ〇バシとかビッグ〇メラとか)では性能の割に値段が高い
可能であればBTO又は自作PCを選ぶこと
CPUから直接アクセスできる記憶装置。メモリやメインメモリともいう。
C言語で言うところのポインタ型。
型の前に&
をつけることで、値そのものではなく、その値が格納されているメモリへのアドレスを保持する。
&u64
&mut u64
&MyNewType
使用していないメモリを、解放することなく確保し続けてしまうこと。
メモリリークを起こすプログラムが走ると、メモリの空き容量が減っていく。
Read Only Memoryの略で読み出し専用のメモリのことである。ただ最近ではユーザーが書き込めるものも登場している。
不揮発性がある。
後で、メモリ上にあるデータを使って計算をすることが予めわかっている場合に、事前にメモリからデータを読み込んでおくこと
gdbでnologinを解析して遊ぶ
ロード後のエントリポイントのアドレスは、info targetの中身を読むと分かる
エントリポイント
(gdb) info target
Symbols from "/usr/sbin/nologin".
Reversing
1週目
Pythonプログラムを実行する
patchme
Pythonプログラムを書き換える
gdbで_startラベルの指すアドレスを調べる
cf. gdbでシンボルが指すアドレスを調べる
input
$ info address _start
output
gdbで特定のアドレスが指すシンボルを調べる
$ info symbol アドレス
例
gdbで、プログラムカウンタの値が不正なときに表示される
確認すること
Segmentation faultを起こしていないか?
SIGSEGVという文字がgdbの画面にあれば、Segmentation faultでプログラムが止まった
『低レベルプログラミング』を読むのために、次のプログラムを使用できるDevContainerを作ります。
NASM
gcc
Make
GDB
CISTの図書館の開架にあるサウンドプログラミングの本
Pythonではじめる音のプログラミング:コンピュータミュージックの信号処理
公立千歳科学技術大学OPAC
サウンドプログラミング入門 : 音響合成の基本とC言語による実装
https://opac.mc.chitose.ac.jp/opac/opac_link/bibid/B000004189
CISTのOPAC:
https://opac.mc.chitose.ac.jp/opac/opac_search/?lang=0
通常は、簡易検索モードを使用する
検索したいキーワードを入力する
🔍ボタンをクリック