貝類

盆栽と古代料理とマルウェア関連がすき。蝋梅が毎日かわいい

bios君よ永遠なれ

2023/4/12 メモ

**普段から本に勝手にあだ名つけてよんでるので、ここではリバースエンジニアリングバイブルをばいぶる君、自作エミュレータで学ぶx86アーキテクチャをえみゅ本として書いていますごめんなさい**

りば本でアセンブリ言語の命令をみてて、そういえばint~~~となりえみゅほんのbios章とデバイスアクセス(3.12章)の章を読んだ。

bois君にはパソコンの電源を居れた直後の機器の初期化や、hddから最初のプログラムローダをメモリに読みだす役割がある。呼び名だけは生き残った。
それはそうとアセンブリ言語を学ぶときにもbiosの基本的な入出力機能が役に立つ。ここではbiosの文字表示機能がありがたき存在なり...☆彡
biosの機能を用いて画面上に'A'を表示するプログラム。

    mov bh, 0     ; 
    mov bl, 15    ; 文字色は白
    mov ah, 0x0e  ; 1文字表示
    mov al, 0x4   ; 'A'= 0x41
    int 0x10      ; bios呼び出し

biosをよびだすには、必要なレジスタに値を設定してからint命令を実行する。
intオペランドとahレジスタの値の組み合わせでbiosが持つ機能群の中のどれを呼び出すか選択する。
このプログラムでは int 0x10 と ah=0x0e であり、1文字表示機能を呼び出すことになる。
表示したい文字コードをalに、文字色をblに指定しておけば、その色で画面に一文字だけ表示される。

intはcpuにソフトウェア割り込みを発生させる命令。callとちょっと似てる(ちがう)つまり int N とかいてN番のサブルーチンをcallする。
Nには0x00から0xffまでに256種類の番号を指定することが出来て、それぞれの番号に応じたサブルーチンが呼び出される。


次は2文字以上の文字を表示するプログラム~~


 start:
    mov si,msg
    call puts
fin:
    hlt
    jmp  fin
puts:
    mov al, [si]
    cmp al, 0
    je puts_end
    mov ah, 0x0e
    mov bx, 15
    int 0x10      ;既定のレジスタに値をぶち込んだら、割り込み命令でbiosの機能を呼び出す。
    jmp puts
puts_end:
    ret           ;サブルーチンから抜ける
msg:
    db "hello world", 0x0d, 0x0a, 0


このプログラムの実行が始まるとSIレジスタにmsgのメモリ番地を設定してからputsを呼び出す。
callはメモリ上のとある場所に、call命令の次の命令がおいてあるメモリ番地をメモしてから、目的のサブルーチンにジャンプする。


※メモリ上のとある場所にメモするというのは、実際はスタックの先頭にプッシュすること。


そうしてサブルーチンを実行していくと最後にretに出会う。retは先ほどメモしたメモリ番地を取り出し、
その番地へジャンプする。それはちょうどhlt命令のある場所の番地になっており、無事、サブルーチンを呼び出してもどってこれました~。めでたしめでたし

 

えみゅ本のサンプルプログラム、カーネルのメモリマネージャー.cppなど注釈つきで読みやすいのでオヌヌメです。

仮想環境が分からない2

仮想環境がわからない2

2023/4/7 のメモをそのままです。間違ってる可能性がめちゃくちゃあるのでマサカリお願いします。

 

TCP IPらへんの知識を忘れまくっててすぐに頭に出てこなくなってるっぽいからちょい復習


レジスタとかの話がでるとどうしてもその下のレイヤーでどうなってるか気になるキリンになるよな~


とりまcpuえみゅ作りの本(いつもの)で色々復習
アセンブリ言語でintって命令あるじゃん、あれinterrupt(割り込み)の略なの今知った。integerと頭の文字もろかぶりなの草

 sudo iostat
Linux 5.15.90.1-microsoft-standard-WSL2      04/07/23   _x86_64_        (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.03    0.00    0.00   99.95

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
sda               0.04         2.65         0.00         0.00      70749          0          0
sdb               0.00         0.05         0.00         0.00       1316          4          0
sdc               0.94        14.17        25.25        24.83     377769     673264     661900


┌─mi@:/mnt/c/Windows/System32
└─$(∩´∀`)∩< sudo iostat -h
Linux 5.15.90.1-microsoft-standard-WSL2   04/07/23   _x86_64_        (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.0%    0.0%    0.0%    0.0%    0.0%  100.0%

      tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd Device
     0.04         2.7k         0.0k         0.0k      69.1M       0.0k       0.0k sda
     0.00         0.0k         0.0k         0.0k       1.3M       4.0k       0.0k sdb
     0.95        14.2k        25.9k        24.8k     368.9M     674.6M     646.4M sdc


 CPU使用率の項目
項目    CPU使用率の内訳
%usr    アプリケーション(ユーザーレベル)
%nice    アプリケーション(ナイス値による優先指定)
%system    カーネル(システムレベル)
%iowait    アイドル状態(ディスクI/Oリクエスト待ち)
%steal    他の仮想CPU向けのハイパーバイザ処理    
%idle    アイドル状態(ディスクI/Oリクエスト待ち以外)

 

-x    拡張ディスク統計情報を出力

└─$(∩´∀`)∩< sudo iostat -x
Linux 5.15.90.1-microsoft-standard-WSL2       04/07/23        _x86_64_        (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.03    0.00    0.00   99.95

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz  aqu-sz  %util
sda              0.04      2.62     0.02  28.41    0.44    64.85    0.00      0.00     0.00   0.00    0.00     0.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00   0.00
sdb              0.00      0.05     0.00   0.00    0.23    24.83    0.00      0.00     0.00   0.00    2.50     2.00    0.00      0.00     0.00   0.00    0.00     0.00    0.00   0.00
sdc              0.64     13.99     0.05   7.63    0.53    21.93    0.28     26.70     0.41  59.50    2.80    94.61    0.02     24.51     0.00   4.76    0.29  1438.91    0.00   0.04


┌──nattou@:/mnt/c/Windows/System32
└─$(∩´∀`)∩< sudo iostat -x -h
Linux 5.15.90.1-microsoft-standard-WSL2       04/07/23        _x86_64_        (8 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.0%    0.0%    0.0%    0.0%    0.0%  100.0%

     r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz Device
    0.04      2.6k     0.02  28.4%    0.44    64.8k sda
    0.00      0.0k     0.00   0.0%    0.23    24.8k sdb
    0.64     14.0k     0.05   7.6%    0.53    21.9k sdc

     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz Device
    0.00      0.0k     0.00   0.0%    0.00     0.0k sda
    0.00      0.0k     0.00   0.0%    2.50     2.0k sdb
    0.28     26.7k     0.41  59.5%    2.80    94.6k sdc

     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz Device
    0.00      0.0k     0.00   0.0%    0.00     0.0k sda
    0.00      0.0k     0.00   0.0%    0.00     0.0k sdb
    0.02     24.5k     0.00   4.8%    0.29     1.4M sdc

  aqu-sz  %util Device
    0.00   0.0% sda
    0.00   0.0% sdb
    0.00   0.0% sdc


iostatで、cpuの使用率の項目で、%steal    他の仮想CPU向けのハイパーバイザ処理だって!!
仮想cpu向けのハイパーバイザ処理って別で用意するんだ~!

SECCON Beginners 2023 CTF Writeupと感想

CTFをやろう...!と思い立ちやり始めたものの、いつも通り脱線に脱線を重ねいつのまにか違うことを始めてしまいました(´;ω;`)ので、かな~り久しぶりのCTFでした!開催当日に気が付いて参加したためドタバタでしたが楽しかったです!

 

最近はマルウェア解析のためにリバースエンジニアリングの勉強をしていたため、今回はreversing問題を中心に解いていきました。(解けたのは結局reversing問題だけでした!!!ヘケッ!!)

 

自分が解けた問題

・Half

・Three

といたやつ

Writeup

Half

Stringsで見てみるとそのまま書いてありました。

 

Three

IDAに頼りました。いつもありがとうおばさん...

flag0~flag2を一文字ずつ順番にflagに入れてflag完成という感じだったので、flag0~flag2に書いてあった文字をlist0~2としてリストを作り、そのまま順番通りに並び替えました。

↓やつが書いたやつです。汚いです。

# coding: utf-8
import random
import math
#import os

#解けたはいいけどこれちゃんと出力されないから注意!!!


#flag = b"ctf4b{xxx___censored___xxx}"

# Please remove here if you wanna test this code in your environment :)
#flag = os.getenv("FLAG").encode()

cipher = [4396, 22819, 47998, 47995, 40007, 9235, 21625, 25006, 4397, 51534, 46680, 44129, 38055, 18513, 24368, 38451, 46240, 20758, 37257, 40830, 25293, 38845, 22503, 44535, 22210, 39632, 38046, 43687, 48413, 47525, 23718, 51567, 23115, 42461, 26272, 28933, 23726, 48845, 21924, 46225, 20488, 27579, 21636]


#for i in range(len(flag)-1):
#   c = *1:
    print(flag[j])

print(flag)

#random.shuffle(cipher)

#print(f"cipher = {cipher}")

 

.....悲しいかなWriteupは以上になります。

pwnの問題たちはアアアアア˝ア˝ア˝ア˝....こ、これ....!前やったことあるやつと似てるやつやん...!でも解法が分からない!!!!c(,Д、と⌒c)つ彡 ジタバタ てなてました。悔しかったでござる...

これを機にまたCTFをやっていこうかなと思いました!!~~完~~

___________________

 

 

回答中も平常運転(脱線しまくる)だったため、その時に学んだやつとかを蛇足としてまとめておきます。

 

追記:↑のやつは終わってすぐに書いたものでしたが結局放置したままだったのでとりあえずこのまま投稿しました(遅い)

 

 

 

 

 

*1:flag[i] + flag[i+1]) ** 2 + i)
#    cipher.append(c)

flag = []

# 逆計算して文字列を復元する
for i in range(len(cipher)-1):
    # 逆計算式に基づいて元の値を求める
    c = int((cipher[i] - i)** 0.5 )
    #c2=math.sqrt(c)
    # 文字列リストに変換した値を追加
    flag.append(c)

# リストから文字列に変換して表示
#flag_str = ''.join(flag)
#print(flag_str)

for j in range(len(flag

仮想環境が分からない\(*´▽`*)/

今回の状況

_:(´ཀ`」 ∠):色々と途中なので後で編集するかも

 


Hack the box をやろうとVirtualBox上のkaliを起動。ずっとアップデートしてなかったからまとめてアップグレード
→よくある(grabとかの警告とかで)グラフィックUIででてくる選択肢がある画面がでてていた。
→作業をほっぽってごはん食べてたらいつのまにか操作できなくなってたため、そのままVirtualBox側からシャットダウン命令
→Kaliのバージョン選択画面まではでるが、選択後ユーザーとパスワードを入力した後にホーム画面にいくはずがいかない。
CUIに切り替わり、エラーを吐く(カーネルパニック rootfs がマウントできないとかなんとかかいてあった)

 

やったこと
とりあえずエラーを調べる。
ざっと調べた感じ、カーネルのアップグレード後に起きてる人が多い。
そのカーネル自体に問題があることが多く、カーネルのダウングレードを行い、fixして更新を待ってたり。
自分の場合はアップグレード中、ずっと放置してたからもしかしたらかってにログオフされてたのかも?
(でも最後のYes Noの選択肢の画面にはきてた。操作できないけど)
そのため、アップグレードを正常に完了できなかったのではないか。と考えたためfixを試みる。
。。。つもりだったけどここで気が散り、一旦中断!!!そしてもどってきたら前バージョンで起動し、upgrade -y !!!ああああああああああ
警告  apt y upgrade E: dpkg was interrupted, you must manually run 'sudo dpkg configure a' to correct the problem.
てでたのでいう通りにsudo dpdg --configure -a して再起動!!
ちゃんと最新バージョンにアップグレードでき、起動も問題なし!うわあああ!!なんで。。。!せっかくだから中途半端にインストールされてこのエラーが
でたときにfixなんちゃらでどうにかできるか試したかったのに~~!でもまぁ治ったので結果お~らい(??)


結果
ダウングレードしてもういっかいアップグレードしなおす。
中途半端にカーネルアップグレードしてしまった場合はおとなしくとバージョンもどしてやり直そう!!(当たり前)
最後までちゃんとカーネルアップグレードしたのにこのエラーが出たときは、とりあえず他にそのバージョンで不具合がでているひとがいないか確認して、自分だけならだいたいはなにかしらこっちがミスってる。でもたまにめちゃくちゃあたらしい更新とかだとそのバージョン自体に問題がある場合もなくはないっぽいのでとりあえずそのバージョンで同じ症状の人がいないか確認してもいいかも。
https://blog.hatena.ne.jp/miruga1/miruga1.hatenablog.com/edit?openedFrom=globalheader-new-entry#sourceグをちゃんと見ろ(n回目)


*********

わくわく脇道
今回、カーネルのバージョンを変更するためにbiosでの操作が必要になるかと勘違いしたため、biosにいつものようにはいろうとしたところはいれなかった。
どうも待ち時間がデフォルトで0に設定されているため、キー入力を受け付けてくれなかったみたいだった。
そのため、ホストマシン(windows)にある設定ファイルの内容の一部を変更
(WSLで操作したため、根本が/mnt/c となっているだけなので先頭は気にしないで。。。)
/mnt/c/Users/natto/VirtualBox にある VMs/Kali-Linux-2022.2-virtualbox-amd64.vboxを編集

以下内容 BIOSの箇所以外変更がないため省略している
変更前 Kali-Linux-2022.2-virtualbox-amd64.vbox.org
    <BIOS>
        <IOAPIC enabled="true"/>
        <SmbiosUuidLittleEndian enabled="true"/>
    </BIOS>

変更後 Kali-Linux-2022.2-virtualbox-amd64.vbox.vbox
    <BIOS>
        <ACPI enabled="true"/>
        <IOAPIC enabled="true"/>
        <Logo fadeIn="true" fadeOut="true" displayTime="500"/>
        <BootMenu mode="MessageAndMenu"/>
        <TimeOffset value="0"/>
        <PXEDebug enabled="false"/>
        <SmbiosUuidLittleEndian enabled="true"/>
    </BIOS>

    単位はミリ秒

    あまり大きな数値を指定すると仮想マシン起動時にエラーになってしまうため、
    最大でも「10000」程度に抑えておくとよい
    (参考:https://kledgeb.blogspot.com/2012/09/ubuntu-virtualbox-6-bios.html)

これで無事でけた。でももちろん意味はない。べつにbiosの設定は今回関係ないし。もカーネルの選択画面が普通にでてくるし
vibiosの画面ではブートの優先順位ぐらいしかここから変えられない。。。(windowsの上にlinuxだからかな?それともVirtualBoxだから?)

気になったため、確認してみる。以下の3つでbiosの画面をみてみようとおもったけど、当たり前に関係ないやん草。
  PCに直接インストールしてあるKali、VMware上でのKali(ホストマシンはwindows)、VitualBox上でのKali(ホストマシンは同じくwindows)
あれ。。。でもじゃあ仮想osのbiosって設定変えられないの?そのへんもいい感じに(?)仮想化してるかと思ってた。windows君とか変えられないとちょっと困らん。。。?
いやわかんないけど。。。というかじゃあ、サンドボックス君たちはどうするんだろう?気が付かれてしまう可能性をあげちゃうのでは。。。?
そこも仮想的に変更できるのかな?でもそしたらbiosの画面をそれぞれ何にするんや?たぶんマザボから引っ張ってくると権利的にもだめそうだよね。。。
そしたらじゃあ、仮想ソフト側がえみゅ的なことするとか?むりか。。。?

けつろん
仮想環境のことを全然理解せずに使っているな~~と気が付いた!!!
ちゃんと理解しよう!します!メモリとかの管理がどうなってるか知らないと。。。!おもしろそう!うおおおお

********

あとでかんがえる

気になったことを調べただけ

あらすじ

後で追加します

VScodePythonでデバックしたいな→なんか設定ファイルにパス書いたりなんか有効化するんだっけ?→あれ?どこにPythonいれてたっけ?→なんもおぼえてないな!!へけっ!

 

前提

ワァ.....!なんか、たのしそう.......!となった自分がかじった程度の浅い知識で書いているため、色々とすべてを間違えている可能性があります。

文章の構成がごみカスげろ。読みにくいと思います。

 

知りたかったこと(のスタート点)

△あるファイルがどこにあるか

→ファイル名がわからない。たぶん途中のディレクトリかファイル名に”python”て入ってそうだけどめっちゃいっぱいありそうだからワイルドカード使って検索したらどれが知りたいやつかわからなそう。Python起動してpidしらべて場所探そうかな?でもそれもいっぱいでてきそう。。。どうしようかな。。

※(以前のぐちゃぐちゃ環境のせいでそう思い込んでいたが結果としては普通にwhereで簡単にみつけられた....(´;ω;`)とりあえず最後に満足した後に試したらいけたという脳みそぷるぷるぷりんなので、この後のは別に....わいの謎の迷走しかない)

 

Python インストール 場所 とかでしらべたらすぐでてきました。

飽きてきたので今回の諸悪の根源さんを貼り付けておちゃにごし🍵

 

今回の反省点

  • 思い込みでやらない
  • 一瞬で試せるだけ試せるならとりあえず試してから調べよう!
  • ぱいそんを知ろう!!!そういえばpipの参照先の仕様?のせいでマルウェアいりライブラリの判別が大変っていってるひといたしpipぜんぜんしらんこんどしらべてみたい
  • sys~~~~~!とりあえずざっとみとけばよかった

 

やっと本題っぽいかも?

とおもったけどだめそう後でちゃんと清書するので許してください。ごめんなさい。

sys.exec_prefix

Python のプラットフォーム依存なファイルがインストールされているディレクトリ名を示す文字列です。この値はサイト固有であり、デフォルトは '/usr/local' ですが、ビルド時に configure の --exec-prefix 引数で指定することができます。すべての設定ファイル (pyconfig.h など) は exec_prefix/lib/pythonX.Y/config に、共有ライブラリは exec_prefix/lib/pythonX.Y/lib-dynload にインストールされます (X.Y は 3.2 のような Python のバージョン番号)。

注釈

 

仮想環境 で起動されている場合、この値は site.py によって仮想環境を示すよう変更されます。実際の Python のインストール先は base_exec_prefix から取得できます。

docs.python.org

 

おおおお~~~!ぱいそん使われてること多いから、ここで仮想環境か確認できるのはありがたい気がする!

はじめましててすと!

なんかやったことの備忘録てきな感じの

あったら今年一年またきょむをすごしたとならなくなるのでは?ということで

 

目標

  • 一か月に一つぐらい投稿できたらいいなぁ
  • アカウントを消さない
  • えとえとえとせとら。。。

 

まずは重量オーバーで儚く散った棚を新調したので頑張って組み立てる。すごくおおきいっぽい。筋肉痛なりそう