私はバッファオーバーフローの脆弱性を悪用してスタックの戻りアドレスを上書きしようとしています。バッファオーバーフロー: 'ヌルターミネータ'なしの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_pathパスより大きいgetwd、で起こっています。その時点のmapped_pathには、任意の値を保持できます。
※可能かもしれませんが、コードを見ずに言うのは難しいです。 –
問題のコードを追加しました。もう一度見ていただけますか? – Dalannar
まあ、そのまま、カナリーのチェックは情報だけなので、あなたはまだ返信先アドレスを上書きすることができます。そうしたときに* ALERT *という印刷物を手に入れるだけです。 – eddiem