2017年4月11日火曜日

C言語で相互参照する構造体の書き方メモ

最近D言語に色んな意味でドハマリしていて久しくC言語書いてなかったので忘れていた事をメモする。



こんな感じで、定義の前にタグ名だけのstructを書いておく。
多分3年ぶりくらいにC言語でプログラム書いたのでどうやったっけなーとか思い出すのに時間かかった、ていうかググった。

2017年3月25日土曜日

UEFI AppをD言語で作れるようになるまでに。

さて、色々試しているD言語。
UEFI Appを作りたいってあれ。

任意のデータ構造とメソッドを持った任意の構造体を定義できた。
ワンチャンコレで作り始めることができそうなのでサンプルソースを置いておく。

ただ、RTTIとか、例外機構そういうD言語っぽい何かを使うことはできないので、
完全にメモリとか色々な管理をサボれる(scopeが使えるって意味で、メモリ管理機構等を作らなくていいという話ではない)CとDの間の何かっぽいアレができた。




下手したら、D言語のコミッターとかに見つかったらぶっころされそうな感じのハックをしているので、出来ればいい感じにobject.dとか実装していきたいけど
いい感じに出来ないからガムテープでぐるぐる巻きにした感じのものが出来た。

マングルされた名前のシンボルをただエクスポートしてるだけ。
基本的にRTTIのものばっかり。でもRTTI使わないしいいよねって感じ。

ただ、_d_assert_msgとかがどういうふうに使われてるのかが理解できるいい機会になった。

いじょー

追記
uefi-dライブラリを使ってUEFIを叩いている所。(クリックで拡大)
一般的な保護機構を持つOS上では動作しない命令(cliとhlt命令)がちゃんと実行されていることが確認できて楽しい。(build.ps1でqemuを-nographicモードで動かしてる。)

2017年3月12日日曜日

/SUBSYSTEM:UEFI_APPLICATIONなバイナリをD言語で

はい。
何もしないアプリケーションを作ってみたいと思います。
たぶん動かないんじゃないかなぁ。

動機:
1.頑張ればUEFI App作れる。
2.頑張れば→構造体とか使うと、object.dを定義してTypeInfo_Structとか実装しなきゃダメ。←これ誰か一緒にやって欲しい感じある。D言語の仕様を一緒に読んでほしい。
3.でも頑張る前にコンパイルして、実際にバイナリに落ちるか試したかった。

プロジェクトはね、ここにあるから。適当に色々やってみてって感じ。
dub -b=release でビルドできる
https://github.com/segfo/D_MinimalUEFI/tree/master


で、これがビルドスクリプト。MS製のリンカに色々とオプション渡してるだけ。
参考文献:MSDN:リンカー オプション
(注意点はdub -b=releaseオプションで必ずリリースビルドをすること。あと32ビットでビルドしようとしたら強制的に64bitビルドに切り替わるように、"dflags-x86"で、-m64を渡して切り替えるところくらいかな)

まぁ、アプリケーション本体のソースはこんな感じ本当に何もしない。
ていうか、何もできないんだよね。
D言語の場合C言語と違って、object.dを実装しないと構造体が使えないから。
本当に何もできない悲しい。
日本のD言語erの皆さん、ヒープがない環境でのobject.dの実装についてアドバイスください。

以上

2017年1月29日日曜日

CTF4bのバイナリwriteup(復習問題除く)

と言うわけで、Writeupをサクッと書いてしまおうと思います。
(時間無いし、あとでやるとかやってるとだいたいモチベが低下するので)
解いた問題だけやる形でいきます。
と言うわけでスコアボード。
表示はなんか恥ずかしいから、susonoにしてた、バイナリ(非実在バイナリ=テキスト形式で渡されたやつはやってません)を今回は攻めてみた。



スコアボード、スコア全く気にしてなかったけど48位だった。
やったぜ?




2017年1月21日土曜日

Raspberry pi Zeroを個人輸入してみた

というわけでですね、今回はラズパイZeroを個人輸入してみた。

目的:
 Androidデバイスから、物理スイッチのみのスピーカー・照明器具の電源制御をしたい

と言う感じなので、とりあえず全部入りのスターターキットを買ってみた。

一番安い送料で送ってもらった。のでこんな感じの小包の状態で届いた


さらに袋に入ってた。なんか海外って感じがするよね。


ひらいた


右下の小包はラズパイZeroの専用ケース。(要組立て)


本体、GPIOのピンは未実装。
ただし、スターターキットに全て付属しているので、はんだ付けする。


GPIOピンを付けてケースに収納した所。


なお、OS(Raspbian)自体はmicro SDに焼かれていて、そのままでも使える。



・・・が、個人的にこの使い方だとGUIいらないので、Raspbian Jessie Liteを突っ込む。
Windows10なので、Win32DiskImagerを使ってSDカードにイメージを焼いていく。

で、続いてOTGを有効にしてUSB繋いだだけでパソコンとSSHできるようにする。

0.焼いたイメージの設定ファイルを少し弄る
 Windows 10なら、マウントしたmicro SDカードの直下のconfig.txtとcmdline.txtを少し修正して保存する。

・config.txt
 dtoverlay=dwc2
上記1行を最終行に追記する。

・cmdline.txt
 modules-load=dwc2,g_ether
上記1文を rootwait直後に追記する。

1.OTGドライバをインストール
 Raspberry pi ZeroをEthernetアダプタとして認識させるためのドライバを入れる。
 わりかし便利な機能だけど、ラズパイZeroしかハード的に対応してないみたい。
 RPI Driver OTG

2.mDNSをWindowsで使えるようにBonjourを入れる
 プリントサービスを入れる理由は、その中にmDNSを喋ってくれるクライアントがあるから。他のところではiTunesでも入れればいいんじゃね?って言われてるけど、iTunes使わないし。どうせ起動しないなら小さいアプリのほうがいいじゃん。
※2017年1月21日現在Windows 10ではmDNSは非対応。対応しているのは類似技術のLLMNRであり、互換性はないのでいくらやってもBonjour無しでは引けない。

あとは、ラズパイゼロをパソコンのUSBに繋いで
raspberrypi.local
でpingが通るか確認すればOK。
なんか、mDNSはIPv6優先で引いてくれるらしい。
だから最悪ラズパイのipv4アドレスが同一ネットワーク内になくてもアクセスできる。
最高。

2016年12月28日水曜日

D言語の演算子評価順序


Twitterでこんな記事を見た。
paiza開発日誌 - ツイッターで出題した未定義問題のお詫びと調査と解説について

最近のpaiza割りと酷くて、C言語の環境依存系の問題バカスカ出してる印象がある。
(ポインタの長さ系の問題とか、sizeof(char*)==4が正解みたいなアレ)
まぁそれは置いといて、では我らがD言語さんは、言語仕様で演算子の評価順序が定義されているのか確認してみた。

公式の文書(Expressions)によれば、

Order Of Evaluation

Binary expressions and function arguments are evaluated in strictly left-to-right order. This is similar to Java but different to C and C++, where the evaluation order is unspecified. Thus, the following code is valid and well defined. 
というわけで、左から右へ評価される と定義されているらしい。
では実際にコードを書いて、生成されたバイナリを見てみよう。

こんなコードを書く。
そんで、次にバイナリを読む。



もっとわかりやすくしてみる。


お分かりいただけただろうか。
とにかく左から順に計算していく。
ただし、インクリメントは後置と前置では全く違うのでこのあたりを考慮してやる必要がある。

では、Paizaの問題をD言語で評価するとどうなるか。

int i=0;
i = i++ + i++;
機械語を読むとこう評価されている模様。(後置のインクリメントは1度だけ実行)
i = 1+(0 + 0);
というわけで、Javaだけじゃなくて、D言語も対象言語に入るよ~
Paizaさん、D言語ちゃんも仲間に入れてあげて!

2016年12月23日金曜日

fsbでELFファイルを引っこ抜いてみる

fsbでできることをとりあえず書いていく
まとめではないので、いつかはまとめたい。

SharifCTFのpwnで学んだことが一つあるのでそれについて。
Sharif CTF pwn 150点の問題の概要
「fsbが有って、それを使ってELFを引っこ抜いてpwnする!以上だ!」
みたいな感じだった(だった気がする、細かいことは気にしない)

個人的には、スタックのリークとアドレスの上書き(GOT Overwrite等)くらいかなと思ってたけど、ELFの引っこ抜きは盲点だった。
ってわけで、やってみる。

ELFファイルが実行されるときは、大体仮想アドレス上の0x400000に固定されて走る
ELFファイルもココに全部マッピングされる。

つまり、fsbで0x00400000から0x00410000くらいまでをリークすればELFファイル
を復元できる
(厳密には完全に復元できるわけじゃなく特定のセクション、今回は.textのみ復元できる)
.textが復元できれば、プログラムの構造がだいたいどんなふうに成っているか分かるし
pwnしやすくなる。

と言うわけでやっていきましょう。