迷いませんか?

継続しないを座右の銘に

セキュキャン2015の応募用紙を晒す

セキュキャン2015 応募用紙公開(辛い)

セキュリティキャンプの応募用紙を出す→締め切り過ぎた
(Write up出てるんじゃないか?)→見てみる→無事死亡

それでは、間違いだらけの応募用紙です。

選択問題2

ある機械語をobjdumpにより逆アセンブルしたところ、以下の結果が得られました。このダンプに見られる問題点を指摘してください。

〜〜〜逆アセンブルの結果〜〜〜

一切わからなかったから、2014と2015を比較してますね。
jmp *%ebxが未定義なんですけど本当は必要ないのでは?
そうならば、jmp 0xeba72の途中にjmpするからpop %ebxとmov $0xe, %edxになりますね
最終的にeaxが4、ebxが1、ecxが0、edxが0xeでシステムコールが呼ばれるから、
14文字のNULL文字が表示されるのでは?

だから問題点は、jmp 0xeba72の途中にjmpするところを、
アセンブルできてないことでは?と書きましたが、
実際には仕方ない感じもするし、どうしようもありませんでした。

選択問題5

以下のようなC言語の関数functionがあるとします。

void function(int *array, int n) {
int i;
for(i = 0; i < n; i++) {
array[i] = i * n;
}
}

上記プログラムをコンパイルした結果の一例 (i386)は以下となりました。

〜〜結果の逆アセンブル〜〜

このとき以下の(1)~(5)の設問について、回答と好きなだけ深い考察を記述してください。知らない点は、調査したり自分で想像して書いてもらっても結構です。どうしてもわからない部分は、具体的にここがわかりませんと記述しても良いです。(1)~(2)の回答は必ず答えてください。(3)~(5)の回答は任意です。わかることを書いてください。CPU やコンパイラは特定の実装を例に説明しても良いですし、理想を自由に考えても良いです。

(1)上記のC言語のプログラムはどのような動作をしますか。また、この関数を呼び出して利用する main 関数の例を作成してください。

このfunction関数は、配列と配列の要素数を受け取り、
その配列の要素それぞれを、添字×要素数にしていくコードです。
と書いて、要素数が10個の配列を関数に放り込んだ結果を表示する例を作成した。

(2)上記のアセンブリコードを、いくつかのブロックに分割して、おおまかに何をしている部分かを説明してください。もし、上記のアセンブリが気に入らないのであれば、好きなアーキテクチャコンパイラアセンブル結果を載せて説明しても良いです。

最初でスタックへesiとebxを退避させ、最後で復帰させてメインルーチンに戻ってること、
第一、第二引数をebxとecxに代入、第二引数が0以下なら関数を終わらせる、
esiに要素数を保存し、ebxとeaxを0にした後、for文を始めてること、
そしてそこでの操作をわかりにくく書きました。

(3)はもう、何も知らない初心者が書いたような内容なので書きません。

選択問題8

gccが持つ-fno-stack-protectorは、どのようなセキュリティ機能を無効にするオプションであるのか、またこの機能により、どういった脆弱性からソフトウェアを守れるのかをそれぞれ記述してください。

スタック保護機能が解除される、 カナリア値を入れてスタックの破壊を検出してるよ
コレがなかったらスタックバッファオーバーフロー攻撃をうけるよ
的なことを書きました

サービス問題っぽさがあったので、もっと詳しく書かないといけなかったかもしれない

選択問題10

アンチデバッグ、難読化といった単語をキーワードとする技術について、あなたが知っていること、調べたことを具体的に記述してください。基本的にPCのソフトウェアにおける技術を想定していますが、他端末、またはハードウェアに関する内容でもかまいません。

ほとんど、バイナリの歩き方を参考にした。
アンチデバッグについては、解析ツールの使用を検出し
動作を停止したりするマルウェアに使われている機能ということしか書いてなく、
難読化は、問題2ぐらいの逆アセンブルした時のjmp 0xeba72みたいなのを例に出したり、
ソースコードの難読化は娯楽として楽しまれてるよということを書いた。
一応、パッキングのこともちょっと書いた。

選択問題11

事件発生!!!
昨日、他のwriteupを見てたら全く解答がちがい、びっくりしてたら
うまくバイナリファイルにできてなかったことがわかった。
もう、違うバイナリを解析していたようなもんですね

正しいバイナリが、
D4 C3 B2 A1 02 00 04 00 00 00 00 00 00 00 00 00 00 00 04 00 01 00 00 00 88 EB 40 54 A2 BE 09 00 52 00 00 00 52 00 00 00 22 22 22 22 22 22 11 11 11 11 11 11 08 00 45 00 00 44 1A BD 40 00 80 06 3A 24 C0 A8 92 01 C0 A8 92 80 10 26 01 BB 86 14 7E 80 08 B3 C8 21 50 18 00 FC 0D 0E 00 00 18 03 03 00 17 01 0E FB 06 F6 CD A3 69 DC CA 0B 99 FF 1D 26 09 E1 52 8F 71 77 45 FA なのに対して、バイナリファイルにした後は、
d4 c3 b2 a1 02 00 04 00 00 00 00 00 00 00 00 00
00 00 04 00 01 00 00 00 88 eb 40 54 a2 be 09 00
52 00 00 00 52 00 00 00 22 22 22 22 22 22 11 11
11 11 11 11 08 00 45 00 00 44 1a bd 40 00 80 06
3a 24 c0 a8 92 01 c0 a8 92 80 10 26 01 bb 86 14
7e 80 08 b3 c8 21 50 18 00 fc 0d 0e 00 00 18 03
03 00 17 01 0e fb 06 f6 cd a3 69 dc ca 0b 99 ff
1d 26 09 e1 52 8f 71 77 45 fa 6c c6 6f b7 68 c5
6f b7 70 81 97 08 70 81 97 08
こうなってたし、もうダメ
すっげえ的外れになってる


以上ですが、きびしい
来年がんばる

あなたの使ってるシェルコードが印字可能になる!

アセンブリを印字可能にするプログラム作った

久しぶりです
部活がもうすぐ最後の大会ということで練習も忙しく、
本もどんどん読んでいたため更新が遅れました

前買った、美しき策謀に続き、バイナリの歩き方も買ったんですが
もう情報が古いのか、逆アセンブルをIDAProで行っても本のとおりにならず
残念な感じですが今読んでます

一応まだ美しき策謀読み終わってません
6章を終わらせたぐらいですが、ソケット再利用?シェルコードとか、理解できませんでした
なので、その1つか2つ前ぐらいの、
印字可能な文字しか受け付けないフィルタがあるプログラムに対するための、
プリンタブルシェルコード、とかいうのがあるのですが、 普通のシェルコードからそれに変換するプログラムを書きました

と言っても、美しき策謀についてる、printable_helperというのを参考にしています
そもそも、印字可能シェルコードというのは、
まず、eaxをxorで0にし、そこから印字可能な数字を引いて、
pushすることでスタック上に機械語コードを組み立てていき、そのコードを実行することでできてます

それを、あるプログラムのバイナリを4バイト分ずつ読み込み、
subすることで作れる文字を探していきそれをコードに直していくようにしてます。 とりあえず、これソースコードです。 gistですので適当にダウンロードできたか忘れましたが、コンパイルして実行してください。
言語はC++11ですので、しっかりコンパイルのときはオプションつけてください
使い方は、印字可能にしたいシェルコード、印字可能シェルコードを保存するパスを引数にし、
もうひとつ、デフォルトは-200ですが、espをどのくらい動かすかをシェルコードの長さに応じて引数にしてください
シェルコードが短ければマイナスにして、ながければ増やしてください

ああ、これ作るのに2週間ぐらいかかりましたわ・・・
プログラムする時間がそれほどなかったのもあるけどちょっと自分の考えが甘かった感じが セキュキャンの応募しなきゃ・・・

vectorをinsertしようとしたらabortしたから原因と直し方

vector結合しようとしたらabortした

abortっていうのはwhat(): vector::_M_range_insertってのが出てくるやつです
これが起こるときの例はこちらです

class Test{
private:
    vector<int> v;
public:
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
    コンストラクタとか
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
    vector<int> getVector();
};

int main(void){
    Test t;
    vector<int> v2; 
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 
    Testのvとv2は適当に初期化
  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
    v2.insert(v2.end, t.getVector().begin(), t.getVector().end());

    return 0;
}

こんな感じです
〜〜〜〜で区切ってるところは中略と思ってください
t.getVector()とやった時に返ってくる値は、vのコピーであるため、
一回目と二回目のt.getVector()は違うものです!!!
内容は同じかもしれないけれど、begin()、end()が変わってきます!!!
ならどうすればいいのか?

コピーが返ってくるならコピーを返さなければいいじゃない

ということです!
つまり、

//before
    vector<int> getVector();
//after
    const vector<int>& getVector();

でいいです

仮想クラスをデリートするときのワーニング

ゲーム作成をしてたら、ワーニングが発生したので一応直し方
正直、有名だとは思うけど

warning: deleting object of abstract class type ’xxx ’ 
   which has non-virtual destructor will cause undefined behaviour

というワーニングが発生した
これはxxxという仮想クラスであるクラスをdeleteしようとすると発生した
こちらの場合はファクトリーメソッドを使用していたため、仮想クラスに派生クラスを入れていた

まあわざわざ備忘録として書くほどでもないと思うけれども
そのまま書いているように、

仮想クラスの型である’xxx ’をdeleteしていますが、
仮想でないデストラクタを持っているため、未定義の動作を起こすかもしれない

みたいなことです なので、デストラクタをvirtualにするだけでワーニングは消えた

P.S.
赤軸は使いやすいけれども
タイプミスをしかけてやめようとしても間に合わなかったり
底打ちしないように心がけるとタイプできてないことがある
青軸も使ってみたいわ〜

ラジコン〜PS3コントローラ接続編〜

昨日に続いて今日はPS3コントローラ接続編です!
しかし、今日のと明日のは備忘録として残しておきたいので、
2つに分けて残りは明日投稿したいと思います
今日で終わらせる予定だったけど明後日まで掛かりそう

PS3コントローラ接続

基本的に、 工作と小物のガラクタ部屋を参考にしています

まず、Raspbianを使っているのであればこの下のようにやればできます
残りのディストリビューションは知りません
いやー、apt-get便利ですわー

下のコマンドでBluetoothを使えるようになります

sudo apt-get update
sudo apt-get install bluetooth bluez-utils bluez-compat bluez-hcidump
sudo apt-get install libusb-dev libbluetooth-dev

そしてBluetoothが働いてるかチェック

/etc/init.d/bluetooth status
#Bluetooth is runningみたいなのが表示されればOK

#もしも表示されなければ
#下のコマンドを打てばOKだと思う(ヘルプ見た感じ)
/etc/init.d/bluetooth start

PS3コントローラをペアリングするコードをダウンロードしてコンパイルする

wget "http://www.pabr.org/sixlinux/sixpair.c" -O sixpair.c
gcc sixpair.c -o sixpair -lusb

そしたらUSBケーブルでRaspberryPiにコントローラをつないだあと

sudo ./sixpair

でなんかアドレスが出てきたら進む
次はQtsixとかいうのをダウンロードしてインストールする

wget "https://sourceforge.net/projects/qtsixa/files/QtSixA%201.5.1/QtSixA-1.5.1-src.tar.gz/download” -O QtSixA-src.tar.gz
tar zxf QtSixA-src.tar.gz
cd QtSixA-1.5.1/sixad
make
sudo make install

sudo sixad -start

最後の行はsixadを起動してるけど、そしたらPSボタンをおして
Connect〜〜〜みたいなのが表示されるのを待つ、
表示されなければやり直し
表示されたら自分の場合は勝手に終わらなかったのでCtrl+Cで強制終了しました
ここまでやれば/dev/input/js0にコントローラの入力などの情報が表示されてる(バイナリ)

長くなったので一回切る
明日は、コントローラの何ボタンが押されているのかという情報を受け取るコードを載せる予定です

Written with StackEdit