2016-12-01 2 views
-1

私はバッファオーバーフローの脆弱性を悪用してスタックの戻りアドレスを上書きしようとしています。バッファオーバーフロー: 'ヌルターミネータ'なしの16進数で7を書き込む(0x00)

しかし、私が 'ハック'しようとしているコードは、カナリアスシステムを使用しています。整数を常に同じハードコーディングされた値7に初期化し、その変数がまだ同じであるかどうかを確認します。

私はバッファオーバーフローを作成することができますが、この変数を上書きできますが、正しい値を書き込むことができません。バッファオーバーフローは、strcpyの誤った使用によって引き起こされます。入力は、以下に示すファイルの内容を通って与えられる:

0000000: 6132 3334 3536 3738 395f 6232 3334 3536 a23456789_b23456 
0000010: 3738 3907 00        789.. 

最後の2進数の値(07 00)私は悩みを抱えているところです。 07は変数に配置しようとしている値です(正しいメモリ位置に配置されます)。しかし、私は次の位置に00を書く必要があると信じています。そうでなければ変数は7より大きい値を取ります。

00の問題は、strcpyのヌルターミネーターとして機能していることです。それ以降の情報はそれ以上供給されないため、リターンアドレスを上書きすることはできません。

この状況は克服できますか、または0x00を使用せずに正しい値を入力することは不可能ですか?

EDIT:

コード(主にポイントと略す):

void getwd(char *path) 
{ 
    strcpy(path, mapped_path); 
    return path; 
} 

void pwd(void) 
{ 

    int canary = 7; 
    char path[MAXPATHLEN + 1]; 

    if (getwd(path) == (char *) NULL) 
    { 
    printf("Couldn't get current directory!\n"); 
    } 
    else 
    { 
    printf("Current directory = %s\n", path); 
    printf("max strlen(path) is %d, strlen(path) = %d\n", MAXPATHLEN-1, strlen(path)); 
    printf("Canary should be 7. Canary = %d\n", canary); 
    if (canary != 7) 
     printf("ALERT: path[MAXPATHLEN + 1] has been overflowed!\n"); 
    } 
} 

バッファオーバーフローがmapped_pa​​thパスより大きいgetwd、で起こっています。その時点のmapped_pa​​thには、任意の値を保持できます。

+1

※可能かもしれませんが、コードを見ずに言うのは難しいです。 –

+0

問題のコードを追加しました。もう一度見ていただけますか? – Dalannar

+0

まあ、そのまま、カナリーのチェックは情報だけなので、あなたはまだ返信先アドレスを上書きすることができます。そうしたときに* ALERT *という印刷物を手に入れるだけです。 – eddiem

答えて

1

この特定の位置に整数7をプログラムで挿入する実際のシェルコードを注入する必要があります。

最初のステップでは、戻りアドレスを見つけて、これをバッファ内の特定の位置に設定します。

第2のステップは、ゼロのないシェルコードを所定の位置に置き、シェルコードが変数を7に再び設定させることです。

ゼロフリーのシェルコードは、xor eax, eaxのような実際の数字を使用せずに変数をゼロクリアする方法がたくさんあります(アセンブリに精通している場合)。

これまでにこれまでに行ったことがない場合は、この目標を達成するには多分時間がかかるでしょう。

+0

私は 'xor eax、eax'のようなものをぼんやりと見ていて、私はあなたが説明していることをほとんど理解しています。しかし、バッファの中にそのすべてを入れたら、どのように%espを変更せずに関数を実行して関数が返るのを待つのですか? – Dalannar

+0

EIP(命令ポインタ)をシェルコードにジャンプさせるには、espとリターンアドレスを変更する必要があります。 – h4x0r

+0

実行不可能なスタックの場合、彼は問題を起こすでしょう。プログラムが終了する前にROPコードを実行するのは難しいです。 –

関連する問題