Cでコードを書きましたが、strcpy
は宣言されたバッファへの入力データです。ここでは、コードです:Cは2つのバッファにコピーされますが、1つだけは書き込まれます。
#include <stdio.h>
#include <string.h>
void function(char *args) {
char buff_1[12];
char buff_2[3] = "ABC";
strcpy(buff_1, args);
printf("buff_1: %s \n", buff_1);
printf("buff_2: %s \n", buff_2);
}
int main(int argc, char *argv[]) {
printf("Input: ");
if(argc > 1)
function(argv[1]);
return 0;
}
私は今、私はすべて11個の以上の入力引数は、バッファオーバーフローにつながることを前提としていますが、実際には、それは両方のバッファに私の入力を追加し、バイナリを実行する場合:
./main (perl -e 'print "A"x15')
buff_1: AAAAAAAAAAAAAAA
buff_2 :ABCAAAAAAAAAAAAAAA
(gdb) x/1s buff_1
0xffffd284: 'A' <repeats 11 times>
(gdb) x/1s buff_2
0xffffd281: "ABC", 'A' <repeats 11 times>
私は、次のコマンドを使用してコードをコンパイル:
はまた、GDBを使用して変数をチェックすることは、私の入力引数は、両方のバッファに格納されていることを示しています3210を使用してくださいgcc (Ubuntu 5.2.1-22ubuntu2)
どのようにその可能性はありますか?
まさに、バッファオーバーフローの結果がどうなると思いますか? –
変数のアドレス( '%p')を表示すると、それらが魔法のように並んでいることがわかるので、" ABC "(最後にゼロがない場合)にbuff_2内容 – Koshinae
また、まったくカウントしないでください。 'char buff_2 [] =" ABC ";'。コンパイラの警告を有効にします。 – Lundin