2015年12月13日日曜日

ROPでDEPBypassしてwindows connectbackシェルコードを走らせてみる

CTFAdvent Calendar 12/6日のネタ。
なんか「ここ開いてるから書いてみ」みたいなTweetが回ってきたので埋めてみるデース。
CTFに直接は関係なくて申し訳無さはある。(本来はWriteupとか書くべき)

あ、どうもせぐふぉです

WindowsのバイナリをExploitするCTFってあんまり見たことないね。
でも、なんか将来的にIoTCoreとか使いそうではないかな・・・?(苦しい言い訳)

元ネタはももテクの
Windowsでconnect-backシェルコードを書いてみる

これです。
ここでは、Windows Sockets APIが攻撃対象アプリ内で呼ばれてること前提で話が進んでいるので
ws2_32.dllが仮想メモリ空間上にロードされています。
さらに、WSAStartupとか呼ばなくて良いのでソケットにcmd.exeをリダイレクトするだけです。


なので、発展課題版として、攻撃対象アプリ内でWindowsSocketsAPIが呼ばれていないし
DLLもロードされていない場合どうすればいいのか書いてみます。

元ネタ記事に書かれてることは理解している前提で話を進めます。

WindowsのPEB万能っぽいって感じた。(こなみかん)

2015年11月22日日曜日

AVTokyo2015のバッジを作った。

ちーわわ!せぐふぉですよ!

AVTokyo2015に今年も参加したわけですが、そこでもらったこれ、参加証のバッジ。



これな

もらった時は
なんだこれ????基盤????
パーツねーぞ????んん?????
どうするんだこれ、どうせなら遊びたいぞ
って思いましたが、一緒にいた人達に聞いてみたところ・・・


「あ、このそこでパーツ売ってるよ、買ってきたら?」

ぼく「まじっすか!買ってきますっ!!!!!」
売店のイケメンおにーちゃん「後で呼ぶから、そしたら来て1000円払ってね!」
ぼく「はーい」

1時間経ったぼく「呼ばれないぞ・・・」
2時間経ったぼく「これ無理じゃね」
3時間たったぼく「あ、後30分で終わっちゃう」

ついに、AVTokyo2015が終わってしまった。
最後まで、呼ばれなかった。
・・・ので、売店のおねーさんに問い合わせてみた

ぼく「部品ってここで買えません?」
おねーさん「ちょっと待って下さいね」
隣りにいたおにーさん「あーごめんなさい売り切れちゃいました、
              後でAVTokyoのページに部品全部のせますよ―」
ぼく「まじっすか!!!やったーーーーあざます!!!!」


というわけで、約1週間後の今日、AVTokyo2015のバッジを完成させてみました。
Arduino互換なので、色々と楽でした。

持っててよかったArduino(詳細は後述)


1.パーツを集める
このページに載ってる情報を元にパーツを集める
http://ja.avtokyo.org/avtokyo2015/badge

秋月電子さんで全部買いました。
AVTokyoのページの情報だと、Arduino互換のものが出来上がるらしい。
ちゃんとUARTもついててそれっぽい。

Arduino互換ってことはプログラムは、スケッチじゃろ
あと、Arduino IDEが必要。ライターどうしようかな・・・(後述)


2.ハンダ付けをする
はんだづけして、IC乗っけて終わりーーーーと思った。

でも現実はそう甘くはなく
「そういえばこれプログラムってどうやって載せんの??」
当日に完成させたみなさん、一定のパターンとかで光ってたよね。スイッチとかで切り替えてたよね
プログラム載せる必要あるじゃん

3.つまづく
初心者なので、このあたりのことわからないから、
「ICなんてどこで買っても同じだろwwwww」
と思ってた。そんなことはなかった。

ブートローダーが入ってない奴だったよね。

4.ブートローダーを書く
この辺りを参考にして
https://www.arduino.cc/en/Tutorial/ArduinoISP

こうする。

これでブートローダーが書けるんじゃ・・・便利じゃろ?
高いライターを買わなくてもええんや・・・

んで、問題はスケッチを書くあれだけど、
Arduino互換なら、ブートローダも書いたし、ArduinoのICと付け替えてやれば書けるだろ。

というわけで、Arduinoのもともと有ったICを外して、AVTokyoバッジ用ICを付けてやる。

んで、普通にArduinoに以下のURLのスケッチをブチ込むと書ける。
https://github.com/mikodayo/AVT15/blob/master/AVT15.ino

便利ですなぁ。
持っててよかったArduino。

5. 完成


6.動作確認

無事に動きました。
来年もこういう楽しいのが有ったらいいなー(他力本願)

以上!

2015年10月11日日曜日

C++のインスタンス生成処理

今日はC++です。
正直苦手としていた言語ですが、ひょんなことから始めました。

で、オブジェクトの生成とかどうしてるのか気になりますね。
気になるんです。

具体的には下記1点

  • 配置newしたときにデータと実行コードはどこに置かれるのか
気になりますねー

OS作るときは、データやコードがメモリのどこに配置されるかすごく気を使うので知っておきたいです。

どこに置かれるか、機械語を見てみましょう。
機械語を見ればわかるのです。バイナリです。
とりあえずソースを置いときます。




こんな感じにMain.cppからTestClass.cppをnewするだけです。
じゃあ機械語レベルではどーなってるのって話ですね。

みてみましょ。(画像はすべてクリックで拡大可能)

まずはMain.cppのオブジェクト生成部


TestClass.cppの TestClass::TestClass(char *s);メソッド(コンストラクタ)


見てみた結果

  • 実行コードはメモリ上に1セットしかない。
  • データ領域だけオブジェクトの数分配置される。
ということでした。

すっきり。

2015年6月20日土曜日

UEFIでOSつくるぞー(ブートローダ・カーネルローダー編)

OS作ってますよ


さて、全壊前回の記事からちょっと時間が経過しましたが
今の所飽きずに開発してますよ。面白いですねー

リポジトリはここです

UEFI使って独自OS作ってるって記事がネット上にあんまり転がってなくて、割りと大変。
Linuxとか起動すること出来るよーみたいなの載ってるけどね。

というわけで、はりぼてOSの64ビット版、UEFIデビューを目指して頑張って行きたいと思うですねー
(いつ飽きるかわからんですが・・・w)

開発環境
OS:Ubuntu 14.04
コンパイラ:gcc 4.8.2
リンカ: ld 2.24

作ったもの

  • ブートローダー(解説は、おるみんさんブログの「ブートローダーは4行で実装される」で読んでくだしあ。こっちのほうが詳しいです)
    • 将来的にはブートオプションとかをカーネルローダに渡すことができたら付けられたらいいなー!みたいな。
  • カーネルローダー(この記事解説)
    • OSにブートローダーからもらった情報で初期化したデータを渡すとかしている
    • 現状は、GOP(Graphics Output Protocol)でグラフィックの初期化とフレームバッファ(VRAMの先頭メモリアドレス)の取得。(なんと24ビットカラー!強い!!
  • カーネル(OS、解説は後日)
    • OS本体!
    • メモリマップの取得とUEFIのブートサービスを切る(ExitBootServicesの呼び出し)
    • (ココでやっている理由は、メモリマップを取得した直後じゃないとExitBootServicesが動いてくれない仕様なのでとりあえず、という感じ。)
    • なんかCentOSもそんな感じでやっているっぽい(どこで見たかは忘れた)ので真似してみました。
    • 現状、メモリマップ取得とExitBootServicesを呼ぶソースとカーネル本処理のソースは分けてありますが、モジュール的には1つです
みたいな感じです。

なかなかそれっぽいでしょ?
カタチから入るのもモチベーションだと思うわけですよ。

もちろん、
「俺のOSは3段階じゃなくて2段階でいいよねー 」
「ブートローダーにカーネルロードさせて、カーネルでカーネルローダーが行っている初期化の役割をやってやるぜ!」

とかそういうのも有りじゃねーのかなーと思うので、そこのあたりは思想にお任せします。

現状、UEFIが使えなくなると、画面に変数を表示できなくなるので
newlibを使って、sprintfとOSのグラフィック関数を組み合わせて表示することにします。

で、フォントもUEFIから引き継げない(?)ので、とりあえず今の所は
『30日でできる!OS自作入門』のメモの「C言語で直接フォントを表現」にある素敵ツールを使わせていただきました。(助かってます!!)

(もし、UEFIからフォントデータとかを持ってこれるよ!って情報有ったら教えてくださいなー)


では長くなりましたが、ブートローダーからソースをぺたぺた貼っていきたいと。

このブートローダーは「ブートローダーは4行で実装される
からパクってきました!(おるみんさんありがとうございます。フル活用させて頂いてます)
後々、テキストファイルにカーネルとカーネルローダーの場所を書いておいて、
そこからロードしてくるように直そうかと。優先度はかなり低め。

ではお次はカーネルローダー
量的にはボリューム有るように見えたり見えなかったりしますが、やってることは簡単。
GOPを初期化して、ピクセル情報や解像度情報、フレームバッファを取得しているだけです。


大きく分けて、処理は4つ
131行目:ブートオプション(カーネルの起動パス)とイメージハンドルを取得している。
136行目:カーネルの起動情報を格納するメモリを確保。
142行目:GOPの初期化と画面の色々な情報を136で確保したメモリに入れる。
 最大で、1024x768の解像度で初期化してほしい
 という要求をchangeGraphicModeの第2引数第3引数に渡している。
 最大なので、800x600で起動されても問題ないけど、
 GOPの仕様上1024x768以上の解像度は保証されたハズ

150行目:カーネルを起動する

というような流れになっとります。
「この関数の解説をもっと詳しく!」とか要望があれば、もうチョット書きますが無いですよね。

では!

2015年6月7日日曜日

UEFI開発していきたいよね。

OS作ってますか。

某30日で作るOS入門本とてもいいです。

BIOSとか叩いて、メモリマップとか自分で作ったり。
16ビットリアルモードから32ビットプロテクトモードに設定してみたり。

でも物足りないことがある。

→最近、64ビットCPUじゃん?

→64ビットモードも使いたいよね

→Intel「ページング必須だよ?君のOSページング使ってないじゃん」

→おれ「ページング実装すんのー?一応したけど、デマンドページングとか出来そうな感じじゃ・・・アァッ・・・!!!」

→おれ「と、とりあえず・・・64ビット用のGDT作って・・・つら・・・」

→おれ「」


学生時代に↑の状態で、めんどくさくなったので、OS作るの一旦やめてCTFやってました。

最近また、OS自作初心者でも楽に作れそうなのが有ったので、
ちょっと手を出してみようかな― みたいな。

UEFIつかって、OS作ったら楽じゃね?
辛い部分すっ飛ばしてOS作れるっぽいよ!?

いつ飽きるかわからないですがね、これから書いていこうと思うです。


OS作るのも高レイヤーでできるように成ったんだなー(?)
というわけで、次回から作っていきます。(多分ね。)