FromNandの日記

自分的備忘録

Download flag.というリンクがあるので踏んでみます。 flagという拡張子なしのファイルが落ちてくるので、lessコマンドで中身を確認。picoCTF2021 [General Skills] writeup - 好奇心の足跡

キャリーとオーバーフロー

第一オペランドをA、第二オペランドをB、計算結果をRとする。 キャリー(加算) = A + B の繰り上がり (符号なしの時の繰り上がりを検知する) キャリー(減算) = A + (~B + 1) の繰り上がり (符号なしの時の繰り下がり無しを検知する) オーバーフロー(加算) = (…

fgets()について

fgets(s, sz, fp)と引数を取ったとすると、 fpが適切なファイルを指していない場合や、szに0を指定した場合、szがどんな値であったとしてもsの内容は変更されず、fgetsはnullを返す fpが適切なファイルを指しており、szに1以上の値を指定した場合、sの内容は…

elf32の実行形式の「lea 0x4(%esp), %ecx」とは何なのか?

elf32では、main関数の最初にespを16bitの境界にアライメントする。 これは、おそらくSSE命令などのペナルティを避けるためだと考えられる。 しかし、単に「andl $0xfffffff0, %esp」などとすれば、スタートアップ関数直後のespの値が失われてしまう。 これ…

pオプションとsetresuid()について

まず、権限下げがない場合についてノーマルはX pオプションはO setresuidはO pオプション+setresuidはO次に、権限下げがあった場合についてノーマルはX pオプションはX setresuidはO pオプション+setresuidはO/bin/shや/bin/bashを起動する際に、実UIDと実行…

車輪の国 向日葵の少女 その1

まずは自己紹介をしよう。 おれは森田健一(もりた けんいち)。 SF小説と姉貴が大好きだ。 いつも読んでる本の中で『日本』という国が出てくる。 あんたも知っているかもしれないが、面白おかしくて不思議な島国だ。なにが面白いかって?例えば現実じゃあ、人…

数学的帰納法ってなに?数学的演繹法はないの?

数学的帰納法はn=1のときに成り立つことを調べて、n=mのときに成り立つことを仮定してから、それが実はn=m+1のときでも成り立ちますということをするやつです。(語彙力) 簡単に解説すると、数学的帰納法では任意のmでの成立を仮定しますが、そのn=mのmの部分…

線形代数の個人用メモ

はじめにお断りしておくと、数学を今までサボっていたせいで僕はあまり数学には詳しくないです。 すごく悲しいです(真顔) 【行列式を調べることでなぜ方程式の解について調べることができるのか?】 行列式が0の場合は方程式の解は不定・不能となり、行列式…

HelloWorld本の内容について、自分なりにまとめてみた

【はじめに】 【1章】 【2章】 【manコマンド】 【lsコマンド】 【findコマンド】 【grepコマンド】 【gdbserver】 【3章】 【4章】 【はじめに】 この記事の内容はLinux/x86を対象にしており、他のCPUやOSでは異なる可能性がある。 OSのシステムコールレベ…

【C言語】アライメントについて【便利なマクロあり!】

アライメントの勉強をしていて、気になったので実験してみた。 この記事の内容は、下の記事からほとんど抜粋してまとめたもの。めちゃくちゃいい記事だった。 でも、写しているので(僕が)カッコ悪い。 データ型のアラインメントとは何か,なぜ必要なのか? …

デバッグする時のブレイクポイントの貼り方

デバッグしていく前には、当然バグが起こる厳密な場所はわからない。 なので、マクロな範囲からミクロな範囲へと絞っていくのがデバッガの役目である。(コール命令をまたいだ瞬間バグが起こるなら、そこでステップ・インすれば、よりミクロな範囲に絞れる) …

C言語における副作用完了点とは?

C言語における副作用で特に厄介なのがインクリメント・デクリメント演算子なので、特にそれについてまとめておきます。 ちなみに、ここのサイトがめっちゃわかりやすかったです。(C - for文におけるiのインクリメントの前置と後置の違いがわかりません|tera…

停止性問題についてまとめておく

Wikiがわかりやすかった。 停止性問題 - Wikipedia まず、プログラムが停止するかどうかを判別できるプログラムH(A)が存在したと仮定する。(この仮定が結果的に矛盾を生じる) プログラムH(A)は引数としてプログラムAを取り、プログラムAが停止する場合はYES…

HDDのヘッド・トラック・シリンダー・セクタについて

まず、一つのHDDは複数のディスクがハノイの塔のように重ねられて作成されている。 ヘッドとは、この中のどのディスクを操作するのかという情報だ。(裏表が存在するディスクの場合はその情報も含むことがある) トラックとは、一枚のディスク上に多数存在する…

C言語ではDS, ES, SSを同じ値にしなければならないのはなぜか?

そういう前提を置くことでコンパイラが機械語を生成するときにラクできるから、ということらしいです。 まぁ、DSやES、SSをうまく扱うのは難しそう。 ここで実際の確認コードをある掲示板で見つけたので貼っておく。 #include<stdio.h> int main(void) { int i; int *</stdio.h>…

x86のジャンプ命令とコール命令の詳細

先のこの部分を見ると、色々に勉強できる。 faq/asm - hrb-wiki まず、ジャンプ命令やコール命令について。 これらの命令には大きく分けて「相対short」「相対near」「絶対間接near」「絶対far」「絶対間接far」の5つがあります。 下にx86で使用されているジ…

【VMA・LMA】OSのリンカスクリプトについて思ったこと

こちらも参考にすると良い。 VMAとLMAについて - プログラマ専用SNS ミクプラ 組み込みシステムにおけるアドレスの考え方 (VMA, LMAについて) - FPGA開発日記 簡単に言うとVMAは実際に動作するときのアドレスを意識している。 つまり、プログラムが実際に参…

配列を持った構造体を値渡し・ポインタ渡ししてみる

ポインタ渡し #include<stdio.h> typedef struct { int a; int array[100]; } STR; void func(STR* str){ printf("%d, %d, %d\n", str->a, str->array[0], str->array[30]); return; } int main(void){ STR str; func(&str); return 0; } 結果のアセンブリはこちら 00</stdio.h>…

C言語プログラムの中でセクションを作成する方法

次のようにすると、sint32型のiという変数が.testセクションに配置される。 sint32 __attribute__ ((section (".test"))) i; リンカスクリプトで実際に.dataセグメントに配置してみる。 .data VMAのアドレス : AT (LMAのアドレス) { _stest = .; *(.test) _e…

アンペールの法則・レンツの法則・フレミングの右手・左手の法則について

これらの関係がごっちゃになっていたので、一回整理します。アンペールの法則(右ねじの法則)は電流を流すと、電流の方向を右ネジの進む方向として、右ネジの回る向きに磁場が生じること。 レンツの法則の逆のイメージが有る。レンツの法則(電磁誘導)は、コイ…

【USBブートバージョン】自作OS「GAFF」のメモリマップ

「http://softwaretechnique.jp/OS_Development/kernel_loader1.html」は参考になる。 0x00000000-0x000003ff 割り込みベクタテーブル。低位にcs、高位にip(2*2=4byte)が最大256個保存される。 0x00000400-0x000004ff BIOSデータらしい。 0x00000500-0x00007…

x86アセンブリのLEA命令って結局何をするの?

x86にはアドレスを取得する命令として「LEA」というものが存在する。 例えば「leal 4(%esp), %eax」とすると、eaxにesp+4の値が入る。 これなら「movl %esp, %eax」「addl $4, %eax」としたらいいじゃないかと思われると思うが、実はLEA命令はフラグに影響を…

ファームウェアについて

「RAMとROM パソコン初心者講座」によると、半導体で作られたメモリに関していえば、「RAMは電源を切ったときにデータを保持しないメモリ」「ROMは電源を切ってもデータを保持するメモリ」と分けられるようです。 ROMはReadOnlyMemoryという名前ですが、現在…

【C言語】配列にアクセスするコードをアセンブラレベルで覗いてみる

プリミティブなデータ型の一次配列の初期化・代入・参照を確認する #include<stdio.h> int main(void){ int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; array[1] = 5; printf("%d\n", array[8]); return 0; } このコードを逆アセンブルすると次のようになる。 内</stdio.h>…

「char array[10];」に対して、式中での「array」「&array」の違いについて

昔、初心者書籍で嘘が書かれていたことがあったのでまとめておきます。 タイトルの通り、「char array[10];」に対しての「array」と「&array」の意味するものは全く異なります。 結論から言ってしまうと、「arrayはchar*」で「&arrayはchar(*)[10]」という意…

【main関数の前の世界】スタートアップ関数を自作してみた!

はじめに main関数の前にはスタートアップ関数という物があり、スタートアップ関数ではアプリケーションの実行のための準備がされている。 かといって、スタートアップ関数は特別なプログラムではなく、実際にアプリケーションプログラマが自作することも可…

構造体をポインタ渡し・値渡し・ポインタ返し・値返しする場合のアセンブラ出力について

ポインタ渡しとポインタ返しについては、普通の配列などと同様のコードが生成される。値渡しについては、引数の部分に構造体のサイズ分のメモリが大胆に確保される。 つまり、4byteの変数と200byteのサイズの構造体を値渡しする場合、引数のサイズはなんと20…

戻り値がvoid型である関数で「return;」を書いた場合と書かない場合の違いについて

さて、前回の「main関数の「return 0;」について逆アセンブルして考察してみた - FromNandの日記」に続いて、今回はタイトルの通りの実験を行います。 まずは、「return;」を書いた場合のソースはこちらになります。 void func(void){ return; } このプログ…

main関数の「return 0;」について逆アセンブルして考察してみた

main関数の「return 0;」は、OSにプログラムが安全に終了したことを伝えるという意味合いを持つ。 しかし実際には、main関数の「return 0;」を書いていない人もしばしば見かける。 ということで、今回は「return 0;」を書くのと書かないのとではどのような違…

標準出力(stdout)と標準エラー出力(stderr)の違いについて

標準出力(stdout)と標準エラー出力(stderr)の違いについてまとめていく。 標準出力と標準エラー出力の主な違いはリダイレクトできるかできないかの違いが大きいらしい。 標準出力はリダイレクトが行われるが、標準エラー出力の方では普通はリダイレクトが行…