徒然ネル

LinuxカーネルとかeBPFとか

披露宴の演出映像で音楽を流すの面倒くさい

披露宴の演出映像で音楽を入れようと思うと面倒くさいなと思った話

結婚式場で好きな曲のCDを流す場合、許諾の必要な支分権は「演奏権」という権利で、自分たちが利用する会場はJASRAC包括契約を結んでいたので、特に申請の必要ない。

が、演出用の動画を自作してDVDに焼く場合、楽曲を含むと、「複製権」という権利の手続きが必要になるそうな。(参照:5分でわかる!結婚式のBGM著作権について必要な手続きと曲の選び方 | 結婚式オープニング・プロフィール・写真撮影業者のココロスイッチ

ブライダル業者がISUMって申請代行団体と契約していれば会場まかせで良かったっぽいが、利用する会場は契約してないっぽいので個人で、JASRAC日本レコード協会に申請してお金払わないといけない。(参照:ブライダルシーンでの⾳楽利⽤ | JASRAC

しかも、1曲あたり、JASRACに2,000円、日本レコード協会3,300円くらい払う必要があるとのことで、お金もかかる。

面倒くさいうえに、お金もかかるので演出用の動画は無音にして、会場でBGM流してもらうようにしようかな…

2025年の目標

2025年の目標を立ててみた

お仕事の目標

  • 自立した研究者になる
    • まだ仕事や研究のスタイルを確立できてないので、自分のやり方を模索していきたい。その先に、自立した研究者像がある気がする。
  • 定期的な外部投稿(査読有無どちらも)
    • 今年度は学会への投稿が出来てないので、ソ体や総合大会でもいいので定期的に外部投稿をこなしていきたい。論文書くタイミングで研究進んだりするし。あと、査読付きの国際会議や論文誌にも投稿したい。
  • 社会人博士進学の準備を進める
    • 社会人博士進学を目指して準備を進めたい。査読付きの業績貯めないと始まらないから、まずは研究頑張らねば。進学先候補の先生にもアプローチ行きつつ、どこいくか決めないとな。

私生活の目標

  • 結婚式を楽しい思い出にする
    • 準備も楽しみつつ、結婚式当日も楽しい思い出にしたい。準備を計画的に進めないとなー
  • 来年以降の計画を立てる
    • 来年以降の計画を立てて、どのタイミングでどのくらいお金が必要になりそうか、見通しを立てたい。東京に住み続けるのか、福岡に帰るのか、いつ転籍するか、いつまで今の会社にいるのか、複数の可能性考慮して計画立てたい。
  • 夫婦共に心身健康に生活する
    • 結婚式もあるし、体調崩さないように気をつけたい。運動する習慣も継続したい。柔道やゴルフも無理ない範囲で頑張りたいね。最近、ゴルフが楽しくなってきたからラウンド回る頻度上げたい。

2024年の目標 振り返り

2025年になったので、2024年年初に立てた目標を振り返っておこう

 

2024年の目標

お仕事の目標

・デモを作る

・専門知識を増やす

・英語を仕事で使えるレベルにする

 

私生活の目標

・楽しい新婚一年目にする

・結婚式準備を良い思い出にする

・夫婦共々健康に生活する

・趣味にも精力的に取り組む

 

振り返り

お仕事の目標の総評

・悪くはなかった

・色々と研究所の仕事を理解できた

・専門知識は増えた

 

私生活の目標の総評

・とても充実した一年だった

 

お仕事の目標 振り返り

・デモを作る→未達、今自分がやるべき仕事ではなかったので良し

・専門知識を増やす→達成。CPUとシステムソフトウェアの領域をお勉強できた1年でした。

・英語を仕事で使えるレベルにする→不明。去年1年間、論文読む以外でほぼ英語使ってないので、分からんな。

 

私生活の目標 振り返り

・楽しい新婚一年目にする→達成。あちこち遊びに行ったり、共通の趣味を新しく作ったりと充実してた。

・結婚式準備を良い思い出にする→達成。まだ準備は残ってるので、引き続き楽しく進めたい。 ・夫婦共々健康に生活する→問題なし。運動する習慣も作れたし良かった。

・趣味にも精力的に取り組む→今年はラジオを聞いたり、ライブ行ったり、ゴルフ行ったり釣り行ったり、満足でした。

 

itmediaの「main()関数の前には何があるのか」を読んでみる(第五回)

# はじめに main()関数の前には何があるのかの連載を読んでわからなかったことや調べたことメモ 今回は第五回 printf()のソースコードで、ソースコードリーディングのコツを身に付ける

メモ

24:/* Write formatted output to stdout from the format string FORMAT. */
25:/* VARARGS1 */
26:int
27:__printf (const char *format, ...)
28:{
29: va_list arg; va_list: 可変個の実引数を扱うための情報を保持するための型。
30: int done;
31:
32: va_start (arg, format);
33: done = vfprintf (stdout, format, arg);
34: va_end (arg);
35:
36: return done;
37:}
38:
39:#undef _IO_printf
40:ldbl_strong_alias (__printf, printf);
41:/* This is for libg++. */
42:ldbl_strong_alias (__printf, _IO_printf);

l.29: va_list: 可変個の実引数を扱うための情報を保持するための型。

l.32: va_start: va_list を初期化し、可変個引数の使用を開始する。

l.34: va_end: 可変個引数の処理を終えるときに呼び出す。

関数名が__printf()になっているが、これはldbl_strong_alias()というマクロによってprintf()というエイリアスが定義されるようだ。

言ってることがよくわからなかった。 マクロによってエイリアスが定義されているがわからない

拾い読みしてみると、マクロの中ではva_arg()によって引数を得ているようだ。

va_arg: 可変個実引数の値を返し、次の引数へ進む。

つまり出力先がTTYのときに、行単位の出力になるようだ。

TTYはディスプレイのことみたい

AFL++動かしてみた

はじめに

AFL++ってファザーを動かしてみたので、動かした過程と結果のメモ

目次

参考

IPAのAFL資料 qiitaの記事:AFLでファジングやってみた

動かしてみた

準備

AFL++インストール

aptでAFL++をインストール

$ sudo apt update
$ sudo apt install afl++ afl++-clang afl++-doc

RAMディスク作成

$ mkdir -p /tmp/afl-ramdisk && chmod 777 /tmp/afl-ramdisk/
$ sudo mount -t tmpfs -o size=512M tmpfs /tmp/afl-ramdisk/
$ cd /tmp/afl-ramdisk/

テスト対象コード

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char** argv)
{
  char buf[8];

  if(read(0, buf, 8) < 1)
  {
     exit(1);
  }

  printf(buf);
  exit(0);
}

コンパイル

example.cをafl-gccコンパイル

$ afl-gcc -o example example.c

ファジング

テストケースダウンロード

$ wget -O - https://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz | tar zxvf -

ファジングテスト実行

$ afl-fuzz -i afl-2.52b/testcases/others/text/ -o out/ ./example

afl++実行時の画面 IPAの資料にあるAFLの実行時の項表示項目の説明と項目名が多少違うが内容は同じだと思われる。 実行時のシステムモニターをみると、CPU1の実行が100%に貼り付いてる。

HACKING: 美しき策謀勉強メモ #1

0x200のプログラミングの基礎は手を動かさず読むだけにした。

0x300のプログラムの脆弱性攻撃から実際に動かしていく。

 

overflow_example.cについて見ていく。

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv) {
    int value = 5;
    char buffer_one[8], buffer_two[8];

    strcpy(buffer_one, "one"); /* "one"をbuffer_oneに設定 */
    strcpy(buffer_two, "two"); /* "two"をbuffer_twoに設定 */

    printf("[前] buffer_two は %p にあり、その値は \'%s\' です\n", buffer_two, buffer_two);
    printf("[前] buffer_one は %p にあり、その値は \'%s\' です\n", buffer_one, buffer_one);
    printf("[前] value%p にあり、その値は %d (0x%08x) です\n", &value, value, value);

    printf("\n[STRCPY] %ld バイトを buffer_two にコピーします\n\n", strlen(argv[1]));
    strcpy(buffer_two, argv[1]); /* 最初の引数をbuffer_twoにコピーする */

    printf("[後] buffer_two は %p にあり、その値は \'%s\' です\n", buffer_two, buffer_two);
    printf("[後] buffer_one は %p にあり、その値は \'%s\' です\n", buffer_one, buffer_one);
    printf("[後] value%p にあり、その値は %d (0x%08x) です\n", &value, value, value);    
}
 
-gオプションをつけてコンパイルgdb起動、20行目にブレイク貼って、run
$ gcc -g -o overflow_example overflow_example.c 
$ gdb -q ./overflow_example a
(gdb) b 20
(gdb) run
 
ASLRの有効、無効でアドレス配置が変わるのか気になったので試す。
 
何もせず(ASLR無効)アドレス配置を表示
 

ASLRを有効にしてからアドレス配置を表示
(gdb) set disable-randomization off

[heap], [vvar], [vdso], [stack]の配置のされ方が違うな
vvar, vdsoが何か知らんので調べた

dump[vvar]セグメントは、Linuxユーザー空間プログラムにおいて、関数呼び出しにまたがって保存する必要のあるデータを格納するために使用されるメモリ領域である。このセグメントは通常、読み取り専用メモリ(ROM)領域、またはフラッシュ・メモリやEEPROMなどの不揮発性メモリ(NVM)デバイスマッピングされる。

Understanding Dump[vvar]Segment in Linux User Space Programs (devcodef1.com)より

 vDSO (virtual dynamic shared object) は、注意深く選択された kernel space ルーチン群を、user space 上のアプリケーションにエクスポートするための、カーネルカニズムである。これにより、アプリケーションは、それらカーネル空間ルーチンを、システムコール インタフェースを使用して、それらの同じカーネル空間ルーチンを呼び出す時に固有の、user mode から カーネルモード への コンテキストスイッチ によるパフォーマンス低下なしに、プロセス内で呼び出せる。[1][2]
vvarが関数呼び出しに使うデータの保存領域で、vdsoがシステムコール呼び出しのための何か
 
heapやstackの中身の配置のされ方は同じなんかな?
と思って、実行結果を見たんだけど、

配置のされ方は同じみたい
ただ、書籍で書かれてる配置のされ方と違った。
書籍ではbuffer_two, buffer_one, valueの順にアドレスが大きくなっていたんだけど、手元の環境は逆になってる。
考えられる理由としては、
・スタックのアドレスの進む方向(番地が大きい方に進む or 小さい方に進む)はCPUによってことなる
・異なる関数の変数のプッシュ順はOSによって異なる 
・同じ関数内の変数のプッシュ順はコンパイラによって異なる 
 
以降、ASLR有効、無効はスタックオーバーフローに関係しなさそうなのでASLR無効の方を見ていく(スタックオーバーフローを利用して任意のコードを実行しようとする際はASLR関係しそうだけど)
 
8バイト突っ込んだときのアドレスが以下で、

9バイト突っ込んだときが以下、

スタックのアドレスが全部-16されてる
9バイト突っ込んだ方は、オーバーフローを検知されて異常終了してるけど、領域的にはスタック領域内だし他のスタックを書き換えたりはしてなさそう
 
さらに、バイト数を大きくすると、スタックのアドレスが小さい方にシフトして、結局オーバーフローを検知して異常終了

OSかCPUで、オーバーフローで任意のコードを実行できないように、スタックのアドレスを動的に格納するみたいやな
 
書籍にあったこっちも動かしてみたけど、書籍通りパスワード間違っててもオーバーフローでauth_flag書き換えはできんやった
password_bufferのほうが大きいアドレスに配置されてオーバーフローしてもauth_flagを書き換えられん
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int check_authentication(char *password) {
   int auth_flag = 0;
   char password_buffer[16];

   strcpy(password_buffer, password);

   if(strcmp(password_buffer, "brillig") == 0)
      auth_flag = 1;
   if(strcmp(password_buffer, "outgrabe") == 0)
      auth_flag = 1;

   return auth_flag;
}

int main(int argc, char *argv) {
   if(argc < 2) {
      printf("使用方法: %s <パスワード>\n", argv[0]);
      exit(0);
   }
   if(check_authentication(argv[1])) {
      printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
      printf("   アクセスを許可します。\n");
      printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
   } else {
      printf("\nアクセスを拒否しました。\n");
   }
}
 
 
うーん、書籍に書いてあることと現実が違うと読み進める気失せるな…
この本の続きやるかどうかは、また考えよう。

面白そうな記事を見つけたので機械学習環境を整備

気になる記事を見つけたので、winデスクトップに機械学習環境を用意してみた

zenn.dev

 

一点、記事ではUbuntu24.04を入れていたけどaptのレポジトリとかでエラー踏みそうなので、Ubuntu-22.04にした

 

Dockerを常時起動状態にするとこまでやった

メモリサイズやディスクサイズの増加はやってない