私は、64ビットLinux上でCでFormat String Vulnerabilityの簡単な例を実装しようとしています。ここに私のソースコードは次のとおりです。フォーマットストリングExplorit、unexpected result
void not_called() {
printf("Exploited\n");
}
int main(int argc, char **argv) {
// Buffer overflow vulnerability
char buffer[256];
gets(buffer);
// User may input the format string
printf(buffer);
}
私は入力次の文字列が
AAAABBBB-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x
をプログラムすると、結果は私がBBBBは以下の41414141
としてAAAAを見つけることはできませんが
AAAABBBB-8608002c-f458fe00-fbad2288-78252d78-252d7825-5e5c51a8-0-41414141-2d78252d-78252d78-252d7825-2d78252d
ですこれはバッファ内の同じ入力文字列の不可欠な部分です。
これは何らかの保護メカニズムですか、何かを誤解していますか?私の目標はリターンアドレスを上書きすることです。私は64ビットマシンで作業しているので、8バイト(AAAABBBB)を読み込む必要があります。文字列を悪用するための
擬似コードは、この
RETRNPTR%[decimal address of not_called - 8]u%[offset of RETRNPTR]$n
RETRNPTRようになりますことは、現在のスタックフレームの戻りアドレスを格納するメモリのアドレスです。
私の最大の懸念は、8バイトのRETRNPTRが、私が期待しているように、メモリに連続しているようには見えないということです。 2番目の懸案事項は、%nはintポインタです。つまり、4バイトしか書き込まれません。私はまた、AAAAに先立つそれらの値がどこから来ているのか混乱しています。
あなたは未定義の動作を起動さを得ました。正確に何が起こるかを理解するために分解を見てください。 –
C言語では 'gets'という関数はありません。 C知識を更新する必要があります。「取得」は17年前に廃止されたとフラグされました。 – Lundin
あなたは 'printf(" AAAABBBB-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x "変数リストが指定されていないとしますか? – Lundin