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しやすくなる。

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

2016年12月13日火曜日

Binary ninjaで遊んでみる

Binary ninja買いました 今のレートだと1万2000円位じゃないでしょうか(ざっくり)

端的にいうと、Binary ninjaはいいぞ。