よもぎのメモ帳

備忘録的な感じで技術的なことをストックしていきます。

よもぎのOS自作入門 21日目/30日

はじめに

これは2020年夏休み企画「30日でOS自作してみよう!」21日目の記事です。

企画についてはこちら

y0m0g1.hatenablog.com

今日やったことを書いていきます。30日やるのって難しいですね……

今日の進捗

f:id:y0m0g1:20200912230226p:plain
crack2はOSのセグメントで実行しようとする

不正なセグメントで実行するアプリケーションに対して、例外処理をしてエラーを吐き出せるようにしました。一般保護例外です。

今日やったこと

わりと見た目的な面白さが少ない回だったと思います。もうちょっと自分の中で咀嚼しないと……

f:id:y0m0g1:20200912230508p:plain
C言語で書いた'A'と表示するアプリケーション

前回はアプリケーションをアセンブリ言語*1で書いていたわけですが、今度はC言語で書いてみます。 できた。

f:id:y0m0g1:20200912230734p:plain
C言語で書いた'hello'と表示するアプリケーション

文字を引数にとって表示する関数の部分はint 0x40での割り込み処理が必要で、アセンブリ言語で書きましたが、大枠はCで書いています。

ここでメモリの中でファイルの情報があるあたりをぶち壊しするプログラムを作ります。

void HariMain(void)
{
    *((char *)0x00102600) = 0;
    return;
}

f:id:y0m0g1:20200912231213p:plain
lsコマンドがしぬ

これに対して、OSが動くセグメントとアプリケーションを動かすセグメンテーションを切り分ける、切り替えるようにします

f:id:y0m0g1:20200912231352p:plain
守られた(はず)

この切替をOSが提供するので、知らねぇ!ってかんじで無視するアプリケーションを動かしてみます。 lsコマンドがぶっ壊れます。

[INSTRSET "i486p"]
[BITS 32]
    MOV     EAX,1*8
    MOV     DS,AX
    MOV     BYTE [0x102600],0
    RETF

f:id:y0m0g1:20200912231554p:plain
まただめだった

これに対して、x86ではセグメント定義の際に、アクセス権に0x60を足すことで、アプリケーション用のセグメントということにできます。 OSのセグメントを触れようとした際に例外を起こしてくれます。

こうして例外が起きたものが今日の進捗に挙げた感じになってます。

今日の範囲はなるほどなぁとなりきれてないので今後の自分に期待します。

明日も一日頑張るぞい!

*1:nasmベースのアセンブリ言語